python

Cronómetro con Tkinter y Python

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

Cronómetro con Python y Tkinter – Mostrar tiempo transcurrido

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

3 días hace

Esta web usa cookies.