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í.