¿Cómo puedo programar actualizaciones (por ejemplo, para actualizar un reloj) en tkinter?

Resuelto Diego Castro asked hace 14 años • 8 respuestas

Estoy escribiendo un programa con la biblioteca tkinter de Python.

Mi principal problema es que no sé cómo crear un temporizador o un reloj como hh:mm:ss.

Necesito que se actualice solo (eso es lo que no sé cómo hacer); cuando lo uso time.sleep()en un bucle, toda la GUI se congela.

Diego Castro avatar Mar 08 '10 16:03 Diego Castro
Aceptado

Las ventanas raíz de Tkinter tienen un método llamado afterque se puede usar para programar la llamada de una función después de un período de tiempo determinado. Si esa función llama, afterhabrá configurado un evento recurrente automáticamente.

Aquí hay un ejemplo práctico:

# for python 3.x use 'tkinter' rather than 'Tkinter'
import Tkinter as tk
import time

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="")
        self.label.pack()
        self.update_clock()
        self.root.mainloop()

    def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.label.configure(text=now)
        self.root.after(1000, self.update_clock)

app=App()

Tenga en cuenta que eso afterno garantiza que la función se ejecutará exactamente a tiempo. Solo programa la ejecución del trabajo después de un período de tiempo determinado. Si la aplicación está ocupada, puede haber un retraso antes de que se llame, ya que Tkinter tiene un solo subproceso. El retraso normalmente se mide en microsegundos.

Bryan Oakley avatar Mar 08 '2010 12:03 Bryan Oakley

Ejemplo de reloj de Python3 que utiliza frame.after() en lugar de la aplicación de nivel superior. También muestra la actualización de la etiqueta con StringVar()

#!/usr/bin/env python3

# Display UTC.
# started with https://docs.python.org/3.4/library/tkinter.html#module-tkinter

import tkinter as tk
import time

def current_iso8601():
    """Get current date and time in ISO8601"""
    # https://en.wikipedia.org/wiki/ISO_8601
    # https://xkcd.com/1179/
    return time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.now = tk.StringVar()
        self.time = tk.Label(self, font=('Helvetica', 24))
        self.time.pack(side="top")
        self.time["textvariable"] = self.now

        self.QUIT = tk.Button(self, text="QUIT", fg="red",
                                            command=root.destroy)
        self.QUIT.pack(side="bottom")

        # initial time display
        self.onUpdate()

    def onUpdate(self):
        # update displayed time
        self.now.set(current_iso8601())
        # schedule timer to call myself after 1 second
        self.after(1000, self.onUpdate)

root = tk.Tk()
app = Application(master=root)
root.mainloop()
David Poole avatar Dec 01 '2015 14:12 David Poole
from tkinter import *
import time
tk=Tk()
def clock():
    t=time.strftime('%I:%M:%S',time.localtime())
    if t!='':
        label1.config(text=t,font='times 25')
    tk.after(100,clock)
label1=Label(tk,justify='center')
label1.pack()
clock()
tk.mainloop()
Ravikiran D avatar Sep 26 '2017 13:09 Ravikiran D