2010-03-08 28 views
54

Ho bisogno di codificare un programma con la libreria tkinter di Python.Come creare un timer usando tkinter?

Il mio problema principale è che non so come creare un timer o un orologio come hh:mm:ss.

Ho bisogno di aggiornarlo (questo è quello che non so come fare).

+2

Ecco [codice di esempio su come usare 'root.after()' per implementare un timer.] (Https://gist.github.com/zed/5440b9372a15d86b5c47) – jfs

risposta

83

Le finestre root di Tkinter hanno un metodo chiamato after che può essere utilizzato per pianificare una funzione da chiamare dopo un determinato periodo di tempo. Se la stessa funzione chiama after, hai impostato un evento ricorrente automatico.

Ecco un esempio di lavoro:

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

Tenete a mente che after non garantisce la funzione verrà eseguito esattamente in tempo. Solo orari il lavoro da eseguire dopo un determinato periodo di tempo. L'app è occupata potrebbe esserci un ritardo prima che venga chiamata poiché Tkinter è a thread singolo. Il ritardo viene in genere misurato in microsecondi.

+0

non Will le chiamate ricorsive a se stesso causano l'errore "ricorsione massima per un oggetto python raggiunto"? –

+0

@SatwikPasani: no, perché non è una chiamata ricorsiva. Mette semplicemente un lavoro in coda. –

7

Esempio di orologio Python3 utilizzando frame.after() anziché l'applicazione di livello superiore. Inoltre mostra aggiornare l'etichetta con uno 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() 
+0

Questa è una buona risposta, con una cosa importante - l'ora visualizzata è in realtà l'ora del sistema, e non qualche tempo di errore accumulato (se aspetti "circa 1000 ms" 60 volte, ottieni "circa un minuto" non 60 sencondi, e l'errore cresce con il tempo). Tuttavia, l'orologio può saltare i secondi sul display: è possibile accumulare errori di secondo secondo, quindi ad es. salta 2 s avanti. Suggerirei: 'self.after (1000 - int (1000 * (time.time() - int (time.time()))) o 1000, self.onUpdate)'. Probabilmente è meglio salvare 'time.time()' su una variabile prima di questa espressione. –

+1

Io aspiro ad essere abbastanza impressionante da incorporare xkcd nei miei commenti :) – bitsmack

1

ho appena creato un timer semplice utilizzando il pattern MVP (tuttavia può essere eccessivo per quel progetto semplice). Ha chiuso, avvia/mette in pausa e un pulsante di arresto. Il tempo viene visualizzato in formato HH: MM: SS. Il conteggio del tempo viene implementato utilizzando un thread che viene eseguito più volte al secondo e la differenza tra il momento in cui il timer è stato avviato e l'ora corrente.

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

Sarebbe utile se potessi aggiungere qualche descrizione. Basta copiare/incollare il codice è raramente utile ;-) – Carpetsmoker

+0

questo codice dà l'ora esatta del locality.it funge anche da timer. –

Problemi correlati