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 шт):

Автор решения: insolor

Почему зависает и как решить проблему когда-то подробно описал здесь: 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()

Анимация

→ Ссылка