Temporizador de cuenta regresiva de Tkinter básico

Actualmente estoy trabajando en un proyecto que requiere un temporizador de cuenta regresiva muy simple, que funciona en la GUI de tkinter y que no se basa en una recursión. He intentado cosas diferentes pero nada parece funcionar hasta ahora.

import time from tkinter import * root = Tk() root.title("Timer") root.geometry("100x100") def countdown(count): label = Label(root, text= count) label.place(x=35, y=15) for i in range(5,0,-1): countdown(i) time.sleep(1) root.mainloop() 

No puede usar la sleep porque detiene mainloop y el progtwig no funciona. Puede usar root.after para llamar a la función después de 1000ms (1s)

 import tkinter as tk def countdown(count): # change text in label label['text'] = count if count > 0: # call countdown again after 1000ms (1s) root.after(1000, countdown, count-1) root = tk.Tk() label = tk.Label(root) label.place(x=35, y=15) # call countdown first time countdown(5) # root.after(0, countdown, 5) root.mainloop() 

Principio similar a la solución de furas ya publicada, pero usando un StringVar:

 import Tkinter def button_countdown(i, label): if i > 0: i -= 1 label.set(i) root.after(1000, lambda: button_countdown(i, label)) else: close() def close(): root.destroy() root = Tkinter.Tk() counter = 10 button_label = Tkinter.StringVar() button_label.set(counter) Tkinter.Button(root, textvariable=button_label, command=close).pack() button_countdown(counter, button_label) root.mainloop() 

Esto puede hacerse más elegante si las piezas viven en la misma clase (es decir, eliminan la necesidad de la lambda ), pero creo que puede obtener el punto aquí.