2010-03-08 94 views
54

Necesito codificar un programa con la biblioteca tkinter de Python.Cómo crear un temporizador usando tkinter?

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

Lo necesito para actualizarse (eso es lo que no sé hacer).

+2

Aquí está [ejemplo de código en la forma de usar 'root.after()' para implementar un contador de tiempo.] (Https://gist.github.com/zed/5440b9372a15d86b5c47) – jfs

Respuesta

83

Las ventanas raíz de Tkinter tienen un método llamado after que se puede utilizar para programar una función a la que llamar después de un período de tiempo determinado. Si esa función llama al after, ha configurado un evento recurrente automático.

Aquí es un ejemplo de trabajo:

# 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() 

tener en cuenta que after no garantiza la función se ejecutará exactamente a tiempo. Solo programa el trabajo que se ejecutará 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 generalmente se mide en microsegundos.

+0

no Will las llamadas recursivas a sí mismo causan el error "máximo de las recursiones para un objeto python alcanzado"? –

+0

@SatwikPasani: no, porque no es una llamada recursiva. Simplemente pone un trabajo en una cola. –

7

ejemplo de reloj Python3 utilizando el marco.después() en lugar de la aplicación de nivel superior. También muestra la actualización de la etiqueta con una VarCadena()

#!/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() 
+0

Esta es una buena respuesta, con una cosa importante: el tiempo que se muestra es realmente el tiempo del sistema, y ​​no un tiempo de error acumulado (si esperas "aproximadamente 1000 ms" 60 veces, obtienes "alrededor de un minuto" no 60 segundos, y el error crece con el tiempo). Sin embargo, su reloj puede omitir segundos en la pantalla, puede acumular errores por debajo del segundo y luego p. salte 2 s hacia adelante. Yo sugeriría: 'self.after (1000 - int (1000 * (time.time() - int (time.time()))) o 1000, self.onUpdate)'. Probablemente sea mejor guardar 'time.time()' en una variable antes de esta expresión. –

+1

Yo aspiro a ser lo suficientemente impresionante como para incorporar xkcd en mis comentarios :) – bitsmack

1

simplemente he creado un simple temporizador utilizando el patrón MVP (sin embargo, puede ser excesiva para que proyecto simple). Tiene salida, inicio/pausa y un botón de detención. La hora se muestra en formato HH: MM: SS. El conteo de tiempo se implementa utilizando un hilo que se ejecuta varias veces por segundo y la diferencia entre el tiempo que el temporizador comenzó y el tiempo actual.

Source code on github

1
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() 
+1

Sería útil si pudiera agregar alguna descripción. Simplemente copiar/pegar el código rara vez es útil ;-) – Carpetsmoker

+0

este código da la hora exacta de la localidad.it también sirve como un temporizador. –

Cuestiones relacionadas