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.

Choque de Tkinter en Python.

Estaba intentando hacer un cronómetro en Python pero cada vez que deja de funcionar debido a un desbordamiento, ¿alguien puede arreglar esto por favor??

Código:

import time
from tkinter import *
cur = time.time()
root = Tk()
def functio():
    while True:
        s = time.time() - cur
        l1 = Label(root,text=s)
        l1.pack()
        l1.destroy()
        time.sleep(0.5)
Button(root, text='Comenzar', command=functio).pack()
root.mainloop()
Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado:

    1. El bucle while en functio() se ejecuta infinitamente, lo cual no es necesario para un cronómetro.
    2. El widget Label se está destruyendo después de la creación, por lo que no será visible para el usuario.
    3. La llamada a time.sleep(0.5) no es necesaria, ya que puede hacer que la GUI se congele y no responda.

    Para solucionar estos problemas, aquí hay una versión actualizada del código:

    import time
    from tkinter import *
    
    root = Tk()
    
    def update_label():
        # Calcular el tiempo transcurrido desde que se inició el cronómetro
        elapsed_time = time.time() - start_time
    
        # Actualizar la etiqueta con el nuevo tiempo transcurrido
        time_str = time.strftime('%H:%M:%S', time.gmtime(elapsed_time))
        label.config(text=time_str)
    
        # Programar la función para que se ejecute de nuevo después de 1 milisegundo
        root.after(1, update_label)
    
    def start_stopwatch():
        global start_time, label
        start_time = time.time()
    
        # Crear el widget de etiqueta para mostrar el tiempo transcurrido
        label = Label(root, text='00:00:00', font=('Arial', 24), width=8)
        label.pack()
    
        # Actualizar la etiqueta cada milisegundo
        root.after(1, update_label)
    
    # Crear el botón de inicio
    start_btn = Button(root, text='Start', command=start_stopwatch)
    start_btn.pack()
    
    root.mainloop()
    

    Esta versión del código utiliza la función time.strftime() para formatear el tiempo transcurrido en horas, minutos y segundos. También utiliza el método after() del objeto Tk para programar que la función update_label() se ejecute de nuevo después de 1 milisegundo, en lugar de utilizar un bucle while o una llamada a time.sleep().

    Tenga en cuenta que el widget label se crea dentro de la función start_stopwatch(), y la variable start_time se declara como global para que pueda ser accesible por las otras funciones. Además, el widget Label no se está destruyendo después de la creación, ya que debe ser visible para el usuario durante toda la duración del cronómetro.

Comments are closed.