es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tkinter temporizador de 60 segundos.

Estoy intentando hacer un temporizador de 60 segundos para un proyecto, pero estoy atascado aquí. Mi variable “temp” no se actualiza en mi ventana cada vez que la recorro. Cualquier ayuda sería genial.

import tkinter
import time

root = tkinter.Tk()
root.geometry("300x250")
root.title("Contador de Tiempo")

Frame = tkinter.Frame(root)
Frame.pack(side=tkinter.TOP)

Label1 = tkinter.Label(Frame, text="Temporizador")
Label1.pack(side=tkinter.LEFT)

def timer(*args, **kwargs):
    temp = int(temps.get())
    while temp > -1:
        temps.set(str(temp))
        root.update()
        time.sleep(1)
        temp -= 1

temps = tkinter.StringVar()
temps.set("60")
temps.trace("w", timer)
label = tkinter.Label(Frame, textvariable=temps)
label.pack(side=tkinter.LEFT)
label.after(1000, timer)

root.mainloop()
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar en la función timer. Ya que contiene un bucle while que se retrasa un segundo y decrementa la variable temp hasta alcanzar -1, está bloqueando el hilo principal de la interfaz gráfica tkinter y evitando que la variable se actualice en la ventana.

    Para solucionar esto, puedes utilizar el método after de tkinter para llamar repetidamente a una función que reduce la variable temp y actualiza la etiqueta. Aquí tienes un ejemplo de cómo puedes modificar el código:

    import tkinter
    
    root = tkinter.Tk()
    root.geometry("300x250")
    root.title("Contador de Tiempo")
    
    frame = tkinter.Frame(root)
    frame.pack(side=tkinter.TOP)
    
    label1 = tkinter.Label(frame, text="Temporizador")
    label1.pack(side=tkinter.LEFT)
    
    def update_timer():
        temp = int(temps.get())
        if temp >= 0:
            temps.set(str(temp))
            root.after(1000, update_timer)
        else:
            # hacer algo cuando el temporizador llegue a 0
            pass
    
    temps = tkinter.StringVar()
    temps.set("60")
    label = tkinter.Label(frame, textvariable=temps)
    label.pack(side=tkinter.LEFT)
    
    root.after(1000, update_timer)
    root.mainloop()
    

    En este código, la función update_timer obtiene el valor actual de temps y actualiza la etiqueta con su valor. Si temp es mayor o igual a 0, se programa a sí misma para que se ejecute nuevamente en 1000ms utilizando root.after, que es una forma no bloqueante de retrasar la ejecución. Una vez que temp alcanza 0, puedes realizar cualquier acción deseada.

Comments are closed.