.get() liefert nur leere Variablen

Fragen zu Tkinter.
Antworten
janb14
User
Beiträge: 16
Registriert: Sonntag 5. Januar 2014, 16:53

Hallo ich habe ein Problem mit meinem Pythoncode. Wie in der Überschrift beschrieben liefern bei mir die .get() Funktionen nur leere Werte.Das Problem ist ,dass dieses Phänomen erst seit der Ausgliederung eines Programmteils in ein zweites Fenster geschieht. Im Anschluss folgt zuerst der funktonierende alte Code und als zweites der neue kaputte.Ich hoffe ihr vergebt mir die nutzenorientierte,schlampige Programmierung ;).

Code: Alles auswählen

from Tkinter import *
test= Tk()
Label(test,text="Angabe des Datensammelintervalls").grid(row=0,column=1)
Label(test,text="Angabe der Testdauer").grid(row=0,column=2)
Label(test,text="Anzahl Tage").grid(row=1)
Label(test,text="Anzahl Stunden").grid(row=2)
Label(test,text="Anzahl Minuten").grid(row=3)
Label(test,text="Anzahl Sekunden").grid(row=4)
 
et = IntVar()
eh = IntVar()
em = IntVar()
es = IntVar() 
 
et2 = IntVar()
eh2 = IntVar()
em2 = IntVar()
es2 = IntVar() 

autowaterv = StringVar()

v0 = Entry(test,textvariable=et)
v = Entry(test,textvariable=eh)
v2 = Entry(test,textvariable=em)
v3 = Entry(test,textvariable=es) 

v0_2 = Entry(test,textvariable=et2)
v_2 = Entry(test,textvariable=eh2) 
v2_2 = Entry(test,textvariable=em2)
v3_2 = Entry(test,textvariable=es2)

v0.grid(row=1,column=1)
v.grid(row=2,column=1)
v2.grid(row=3,column=1)
v3.grid(row=4,column=1)

v0_2.grid(row=1,column=2)
v_2.grid(row=2,column=2)
v2_2.grid(row=3,column=2)
v3_2.grid(row=4,column=2)



def start():
 input_time_t = et.get()
 input_time_h = eh.get()
 input_time_m = em.get()
 input_time_s = es.get()

 input_time_t_2 = et2.get()
 input_time_h_2 = eh2.get()
 input_time_m_2 = em2.get()
 input_time_s_2 = es2.get()
 global autowatervar
 autowatervar = autowaterv.get()
 
 global input_time_g
 input_time_g = ((input_time_t*216000)+(input_time_h*3600)+(input_time_m*60)+input_time_s)
 global input_time_g_2
 input_time_g_2 = ((input_time_t_2*216000)+(input_time_h_2*3600)+(input_time_m_2*60)+input_time_s_2)
 print ("Autowaterstatus: %s" %(autowatervar))
 print ("Zeitintervall zwischen Datenabfage: %s" %(input_time_g))
 print ("Zeit des gesamten Tests: %s" %(input_time_g_2))
 test.destroy()
 
 

Button(test,text="start now",command=start).grid(row=5)

Checkbutton(test,text="Auto Watering?",variable=autowaterv,
 onvalue="1",offvalue="0").grid(row=6,column=2)

test.mainloop()

Code: Alles auswählen

from Tkinter import *

Main = Tk()


 




def maingui():
    
    Button(Main,text="start now",command=start).grid(row=6,column=2)
    
    Label(Main,text="").grid(row=2)
    
    Button(Main,text="Zeiteinstellungen",command=zeitgui).grid(row=6,column=3)
    
    global autowaterv
    autowaterv = StringVar()
    
    Checkbutton(Main,text="Auto Watering?",variable=autowaterv,onvalue="1",offvalue="0").grid(row=1,column=1)
    

   

def zeitgui():
    global Zeit
    Zeit= Tk()
   
    
    
    Label(Zeit,text="Angabe des Datensammelintervalls").grid(row=0,column=1)
    Label(Zeit,text="Angabe der Testdauer").grid(row=0,column=2)
    Label(Zeit,text="Anzahl Tage").grid(row=1)
    Label(Zeit,text="Anzahl Stunden").grid(row=2)
    Label(Zeit,text="Anzahl Minuten").grid(row=3)
    Label(Zeit,text="Anzahl Sekunden").grid(row=4)
    
    global et,eh,em,es
    et = IntVar()
    eh = IntVar()
    em = IntVar()
    es = IntVar()
    
    global et2,eh2,em2,es2   
    et2 = IntVar()
    eh2 = IntVar()
    em2 = IntVar()
    es2 = IntVar() 
    
    Entry(Zeit,textvariable=et).grid(row=1,column=1)
    Entry(Zeit,textvariable=eh).grid(row=2,column=1)
    Entry(Zeit,textvariable=em).grid(row=3,column=1)
    Entry(Zeit,textvariable=es).grid(row=4,column=1)
        
    Entry(Zeit,textvariable=et2).grid(row=1,column=2)
    Entry(Zeit,textvariable=eh2).grid(row=2,column=2) 
    Entry(Zeit,textvariable=em2).grid(row=3,column=2)
    Entry(Zeit,textvariable=es2).grid(row=4,column=2)
    
    def save():
        input_time_t = et.get()
        input_time_h = eh.get()
        input_time_m = em.get()
        input_time_s = es.get()
        
        input_time_t_2 = et2.get()
        input_time_h_2 = eh2.get()
        input_time_m_2 = em2.get()
        input_time_s_2 = es2.get()
        
         
        global input_time_g
        input_time_g = ((input_time_t*216000)+(input_time_h*3600)+(input_time_m*60)+input_time_s)
         
        global input_time_g_2
        input_time_g_2 = ((input_time_t_2*216000)+(input_time_h_2*3600)+(input_time_m_2*60)+input_time_s_2)
         
        print ("Zeitintervall zwischen Datenabfage: %s" %(input_time_g))
        print ("Zeit des gesamten Tests: %s" %(input_time_g_2))
         
        Zeit.destroy()
    Button(Zeit,text="Save",command=save).grid(row=5)
 
def start():
    global autowatervar
    autowatervar = autowaterv.get()
    
    print ("Autowaterstatus: %s" %(autowatervar))
    
    Main.destroy()
 


maingui()

mainloop()
Das Problem liegt konkret im zweiten Code bei der .get() Funktion ,welche mir die Ergebnisse der Zeiteingaben besorgen soll.
BlackJack

@janb14: Es darf in einem laufenden Programm immer nur *ein* `Tk`-Objekt zur selben Zeit geben. Das ist das *Haupt*fenster. Für weitere Fenster ist `Tkinter.Toplevel` vorgesehen.
janb14
User
Beiträge: 16
Registriert: Sonntag 5. Januar 2014, 16:53

Danke für den Tipp :D
bedeutet das ich muss in der Zeitgui den Befehl Zeit = Tk() in Zeit = Tkinter.Toplevel() ändern ?

PS: ok nun funtioniert es wenn ich komplett Tkinter noch dazu importiere vielen Dank
BlackJack

@janb14: Wenn Du nicht weisst wie ``import`` funktioniert, solltest Du vielleicht noch keine GUIs erstellen. Mit diesem unsäglichen Sternchenimport hast Du `Toplevel` im Namensraum Deines Moduls. Und alle anderen ca. 190 Namen aus dem `Tkinter`-Modul. Man sollte stattdessen entweder explizit nur das importieren was man aus einem Modul benötigt, oder das Modul importieren und dann auf die Namen darin über Attribute zugreifen. Da `Tkinter` ein wenig lang ist, und man in der Regel viele verschiedene Dinge daraus benötigt wird das meistens an den Namen `tk` gebunden, also ``import Tkinter as tk``. So sieht man wo die Namen her kommen und es kann auch keine Namenskollisionen geben.
janb14
User
Beiträge: 16
Registriert: Sonntag 5. Januar 2014, 16:53

Danke für den Hinweis.Ich bin ja selbst noch am lernen wie Python funktioniert und verbinde das Lernen mit Praxisbeispilen am Raspberry pi. Also nochmal vielen Dank für die Hilfe.
MfG jan
Antworten