While с after Python
Зависает на одном месте, в чем проблема? Переменные аналогичны с моим предыдущим вопросом (https://ru.stackoverflow.com/questions/1559138/Почему-зависает-while-python).
def cvv():
global sl
eo = int(eskolo.get())
et = int(eskolt.get())
sl = int(eo * 60 + et)
while sl > 0:
def k():
sl -= 1
timer.after(1000,k)
if sl == 0:
lo.configure(text="Таймер прошел")
timer.destroy()
Ответы (1 шт):
Почему зависает и как решить проблему когда-то подробно описал здесь: Sleep и while True в tkinter, ссылку уже давал вам в комментариях вашему предыдущему вопросу.
В общем-то и код вам нужно переписать аналогично первому же примеру из ответа по ссылке.
Цикл while вообще уберите, используйте только планирование следующего запуска функции через метод after. Выход из такого "цикла" делайте проверкой текущего значения st через if, и если условие не выполняется, то просто не вызываете after.
Минимальный пример
import tkinter as tk
def timer_function(sl):
if sl <= 0:
lo.configure(text="Таймер прошел")
# timer.destroy() # <-- не нужно делать сразу после вывода сообщения, вы так сообщение даже не успеете увидеть
return
lo.configure(text=sl) # Выводим текущее значение таймера, чтобы было видно, что что-то происходит
sl -= 1
timer.after(1000, timer_function, sl) # Планируем выполнение функции через 1000 мс, новое значение sl передаем через параметр
def cvv():
eo = int(eskolo.get())
et = int(eskolt.get())
sl = int(eo * 60 + et)
timer_function(sl)
timer = tk.Tk()
eskolo = tk.Entry(timer)
eskolo.pack()
eskolt = tk.Entry(timer)
eskolt.pack()
tk.Button(timer, text="Start timer", command=cvv).pack()
lo = tk.Label(timer)
lo.pack()
timer.mainloop()
