¿Cómo puedo programar actualizaciones (por ejemplo, para actualizar un reloj) en tkinter?
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.
Las ventanas raíz de Tkinter tienen un método llamado after
que 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, after
habrá 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 after
no 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.
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()
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()