2017-05-22 2 views
0

Ich versuche, eine kleine Python-GUI-App mit Tkinter zu bauen. Ein Hauptfenster öffnet sich, wenn die App geöffnet wird. Dann kann man auf einen Button klicken, um einen neuen Toplevel zu öffnen. In dieser Toplevel gibt es einen Timer (Countdown), der startet, wenn eine Taste gedrückt wird.Tkinter friert ein, während auf Callback warten mit nach

Mein Problem ist, dass die Toplevel friert, während der Timer herunter zählt. Ich habe wahrscheinlich etwas Grundlegendes über Tkinter verpasst (und wie man den Code strukturiert). Ich hoffe, Sie können klären, warum der Code nicht wie vorgesehen funktioniert.

from tkinter import * 

class Application:def __init__(self, master=NONE): 
    self.root = Tk() 

    btnTimer = Button(self.root, text="Open timer", command=self.open_timer) 
    btnTimer.grid(row=1, column=0) 

    self.root.mainloop() 

def open_timer(self): 
    # Hide main window 
    self.root.withdraw() # Hide main window 

    # Make window for controls 
    self.wdowControl = Toplevel(self.root) 

    # Timer 
    self.wdowControl.timerText = Label(self.wdowControl, text="00:00:00", font=("Helvetica", 80)) 
    self.wdowControl.timerText.grid(row=0, column=0) 

    btnStart = Button(self.wdowControl, text="Start timer", command=self.start_timer) 
    btnStart.grid(row=1, column=0) 

def start_timer(self): 
    self.update_timer(5) # Timer in seconds 

def update_timer(self, t): 
    if t > 0: 
     m, s = divmod(t, 60) 
     h, m = divmod(m, 60) 

     timeLeft = "%d:%02d:%02d" % (h, m, s) 
     self.wdowControl.timerText.configure(text=timeLeft) 
     t -= 1 
     self.wdowControl.after(1000, self.update_timer(t)) 
    else: 
     self.wdowControl.timerText.configure(text="00:00:00", fg='red') 

app = Application()) 

Hinweis:Ich begann gestern mit Python Codierung und ich habe wahrscheinlich mit den grundlegenden Dingen nicht gestartet ich zuerst lernen sollte. Aber hey, das macht mich glücklich. :)

Antwort

1

Wenn Sie nach in der folgenden Zeile verwenden;

self.wdowControl.after(1000, self.update_timer(t)) 

Die Funktion wird sofort aufgerufen. Das bedeutet, dass dein Programm einfriert, da es sich immer wieder selbst aufruft.

Um Variablen wie in diesem Fall unter Verwendung von after zu übergeben, geben Sie sie mithilfe eines anderen Kommas nach dem Funktionsnamen an. Um also Ihr Programm zu reparieren, müssen Sie die Zeile ändern, die ich erwähnt habe:

self.wdowControl.after(1000, self.update_timer, t) 

Hoffe, das hilft!

+0

Danke! Kennst du die Logik dahinter? – sgtbp

+0

Wenn Sie nach einer Phrase '()' setzen, versucht Python, diese Funktion aufzurufen, unabhängig davon, ob sie in einer Anweisung wie 'after' steht. Tkinter verwendet daher den Funktionsnamen, den Sie aufrufen möchten, und alle Argumente, die Sie übergeben möchten, so dass dies bei der Angabe möglich ist. – SneakyTurtle

Verwandte Themen