Hoy te enseñaré cómo hacer un cronómetro simple con Tkinter y Python. Vamos a mostrar el tiempo transcurrido en un Label de Tkinter que a su vez estará dentro de una ventana.
Todo esto lo haremos con el lenguaje de programación Python, Tkinter y la función after
del mismo.
Por cierto, esto será muy parecido a cuando hicimos un reloj con Python, así que te invito a que leas ese post antes que este para que tengas bases más sólidas.
Funcionamiento
Lo que haremos será marcar la fecha de inicio usando datetime de Python. Después vamos a crear las ventanas y todo lo demás.
Luego vamos a definir una función que se va a estar invocando cada medio segundo. En esta función vamos a obtener la diferencia del tiempo transcurrido y colocarla en el label.
Después de esto vamos a encolar esa función para que sea llamada después de que haya transcurrido un tiempo, usando a raiz.after
.
De este modo la función será llamada desde Tkinter, y al ser invocada va a volver a encolarse, logrando que se invoque de manera recurrente durante toda la ejecución del programa.
Calculando tiempo transcurrido
Primero vamos a definir la hora de inicio. En este caso es la hora en la que el programa comienza a ejecutarse, pero podría ser otro valor:
hora_inicio = datetime.now()
Después veamos la función que va a calcular el tiempo transcurrido para el cronómetro en Python:
def obtener_tiempo_transcurrido_formateado():
segundos_transcurridos= (datetime.now() - hora_inicio).total_seconds()
return segundos_a_segundos_minutos_y_horas(int(segundos_transcurridos))
El cálculo se está haciendo en la línea 2. Si te fijas estamos invocando a una función que va a formatear los segundos, misma que se ve así:
def segundos_a_segundos_minutos_y_horas(segundos):
horas = int(segundos / 60 / 60)
segundos -= horas*60*60
minutos = int(segundos/60)
segundos -= minutos*60
return f"{horas:02d}:{minutos:02d}:{segundos:02d}"
Cronómetro con Python
Ya tenemos las funciones, ahora vamos a mostrar el tiempo transcurrido en Tkinter. Para ello definimos una StringVar que va a estar relacionada con un Label de la ventana:
variable_hora_actual = tk.StringVar(raiz, value=obtener_tiempo_transcurrido_formateado())
Su valor inicial estará en 0. Después de eso veamos la verdadera función que se va a refrescar cada N milisegundos:
def refrescar_tiempo_transcurrido():
print("Refrescando!")
variable_hora_actual.set(obtener_tiempo_transcurrido_formateado())
raiz.after(INTERVALO_REFRESCO, refrescar_tiempo_transcurrido)
Hace un momento te hablé de encolar la función, pues eso es lo que está pasando en la línea 4.
Ventana de Tkinter
Finalmente la ventana queda así:
raiz = tk.Tk()
variable_hora_actual = tk.StringVar(raiz, value=obtener_tiempo_transcurrido_formateado())
raiz.etiqueta = tk.Label(
raiz, textvariable=variable_hora_actual, font=f"Consolas 60")
raiz.etiqueta.pack(side="top")
app = tk.Frame()
raiz.title("Cronómetro con Tkinter - By Parzibyte")
refrescar_tiempo_transcurrido()
app.pack()
app.mainloop()
Si te fijas, estamos llamando a la función que refresca el cronómetro en la línea 8. Solo la llamamos una vez, pues dentro de ella se va a encolar para que la raíz la esté invocando periódicamente.
Poniendo todo junto
Finalmente llegamos al código completo que queda así:
"""
https://parzibyte.me/blog
"""
from datetime import datetime
import tkinter as tk
INTERVALO_REFRESCO = 500 # En milisegundos
hora_inicio = datetime.now()
def segundos_a_segundos_minutos_y_horas(segundos):
horas = int(segundos / 60 / 60)
segundos -= horas*60*60
minutos = int(segundos/60)
segundos -= minutos*60
return f"{horas:02d}:{minutos:02d}:{segundos:02d}"
def obtener_tiempo_transcurrido_formateado():
segundos_transcurridos= (datetime.now() - hora_inicio).total_seconds()
return segundos_a_segundos_minutos_y_horas(int(segundos_transcurridos))
def refrescar_tiempo_transcurrido():
print("Refrescando!")
variable_hora_actual.set(obtener_tiempo_transcurrido_formateado())
raiz.after(INTERVALO_REFRESCO, refrescar_tiempo_transcurrido)
raiz = tk.Tk()
variable_hora_actual = tk.StringVar(raiz, value=obtener_tiempo_transcurrido_formateado())
raiz.etiqueta = tk.Label(
raiz, textvariable=variable_hora_actual, font=f"Consolas 60")
raiz.etiqueta.pack(side="top")
app = tk.Frame()
raiz.title("Cronómetro con Tkinter - By Parzibyte")
refrescar_tiempo_transcurrido()
app.pack()
app.mainloop()
Como siempre te digo, la mejor manera de probar el código es descargándolo y ejecutándolo en tu entorno. Si lo vas a probar no olvides instalar Python.
Por aquí te dejo con más tutoriales de Python. Ah, también hice un cronómetro hace tiempo pero con JavaScript.