Kann mir jemand erklären, wo der fehler ist(Python Timer Tk)?
Ich habe versucht einen timer zu machen, jedoch funktioniert dieser nicht recht.
from tkinter import *
from tkinter.ttk import *
from time import sleep
root_timer = Tk()
timer = 10
lbl_timer = Label(root_timer, font=("Times New Roman", 26, "bold"),
background="white",
foreground="black")
lbl_timer.config(text=str(timer))
lbl_timer.pack(anchor="center")
def timer_up_press():
global timer
timer += 1
lbl_timer.config(text=str(timer))
lbl_timer.pack(anchor="center")
def timer_down_press():
global timer
if timer == 0:
print()
else:
timer -= 1
lbl_timer.config(text=str(timer))
lbl_timer.pack(anchor="center")
def timer_start_press():
global timer
while True:
if timer == 0:
lbl_timer.config(text='Time is Up')
sleep(1)
else:
timer -= 1
lbl_timer.config(text=str(timer))
sleep(1)
button_timer_up = Button(root_timer, text='Up', command=timer_up_press)
button_timer_down = Button(root_timer, text='Down', command=timer_down_press)
button_timer_start = Button(root_timer, text='Start', command=timer_start_press)
button_timer_up.pack()
button_timer_down.pack()
button_timer_start.pack()
root_timer.mainloop()
1 Antwort
Auch wenn ich keine Erfahrung mit TKinter habe, sollte es am folgenden Problem liegen:
Die Funktion time.sleep(1) blockiert den gesamten Thread (in deinem Fall auch Programm). In dieser Zeit wird kein weiterer Code ausgeführt. Es kann also auch nicht auf ein Button Druck reagiert werden.
Nach dem Start Button sollte der Timer durchlaufen. Dieser Teil sollte ohne Probleme funktionieren.
Ein while True ist in TKinter auch nicht so gut.
Hier gibt es ein stackoverflow Beitrag zu deinem Thema.
Deine Funktion müsste dann am Ende im etwa so aussehen:
def timer_start_press():
global timer
global root_timer
if timer == 0:
lbl_timer.config(text='Time is Up')
else:
timer -= 1
lbl_timer.config(text=str(timer))
root_timer.after(1000, timer_start_press)
Die while True Schleife hast du durch eine Rekursion abgelöst. Die Funktion ruft sich selber erneut auf.
Mit Tk().after() kannst du Aufgaben planen, ohne dass sie den Haupt Thread blockieren.
Hier gibt es die Doku zu dieser Methode. Die Wartezeit könnte theoretisch auch länger als die angegebene Zeit sein. Auch deine Methode wird langfristig etwas falsch zählen, da immer mindestens eine Sekunde gewartet wird und danach noch der Programmcode dazwischen kommt.