2010-03-08 4 views
54

Ich muss ein Programm mit Python-tkinter-Bibliothek programmieren.Wie erstelle ich einen Timer mit tkinter?

Mein großes Problem ist, dass ich weiß nicht, wie ein Timer oder eine Uhr wie hh:mm:ss zu erstellen.

Ich brauche es, um sich selbst zu aktualisieren (das ist, was ich nicht weiß, wie zu tun ist).

+2

Hier [Codebeispiel, wie man verwenden 'root.after()' einen Timer zu implementieren.] Ist (https://gist.github.com/zed/5440b9372a15d86b5c47) – jfs

Antwort

83

Tkinter-Root-Fenster haben eine Methode namens after, mit der eine Funktion geplant werden kann, die nach einer bestimmten Zeit aufgerufen wird. Wenn diese Funktion selbst after aufruft, haben Sie ein automatisch wiederkehrendes Ereignis eingerichtet.

Hier ist ein funktionierendes Beispiel:

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

Beachten Sie, dass after die Funktion nicht garantiert genau zum richtigen Zeitpunkt ausführen. Es ist nur Zeitpläne der Job nach einer bestimmten Zeit ausgeführt werden. Wenn die App beschäftigt ist, kann es eine Verzögerung geben, bevor sie aufgerufen wird, da Tkinter single-threaded ist. Die Verzögerung wird typischerweise in Mikrosekunden gemessen.

+0

nic die rekursiven Aufrufe an sich selbst verursachen den Fehler "maximale Rekursion für ein Python-Objekt erreicht"? –

+0

@SatwikPasani: Nein, weil es kein rekursiver Aufruf ist. Es stellt lediglich einen Job in eine Warteschlange. –

7

Beispiel für Python3-Clock mit der Datei frame.after() anstelle der Top-Level-Anwendung. Auch zeigt das Etikett mit einem StringVar Aktualisierung()

#!/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

Dies ist eine gute Antwort, mit einer wichtigen Sache - die angezeigte Zeit ist wirklich die Systemzeit, und nicht einige akkumulierte Fehlerzeit (wenn Sie "1000 ms" 60 Mal warten, erhalten Sie "etwa eine Minute" nicht 60 Sekunden, und der Fehler wächst mit der Zeit). Allerdings - Ihre Uhr kann Sekunden auf dem Display überspringen - Sie können Sub-Sekunden-Fehler akkumulieren, und dann z. überspringen Sie 2 s vorwärts. Ich würde vorschlagen: 'self.after (1000 - int (1000 * (time.time() - int (time.time()))) oder 1000, self.onUpdate)'. Wahrscheinlich ist es besser, 'time.time()' in eine Variable vor diesem Ausdruck zu speichern. –

+1

Ich strebe an, fantastisch genug zu sein, um xkcd's in meine Kommentare einzubetten :) – bitsmack

1

ich nur eine einfache Timer mit dem MVP-Muster erstellt (aber es kann Overkill für das einfache Projekt sein). Es hat beendet, Start/Pause und eine Stopp-Taste. Die Uhrzeit wird im Format HH: MM: SS angezeigt. Die Zeitzählung wird mit einem Thread durchgeführt, der mehrmals pro Sekunde ausgeführt wird, und der Unterschied zwischen der Zeit, zu der der Timer gestartet wurde, und der aktuellen Zeit.

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

Es wäre hilfreich, wenn Sie eine Beschreibung hinzufügen könnten. Einfach Code kopieren/einfügen ist selten sinnvoll ;-) – Carpetsmoker

+0

Dieser Code gibt die genaue Zeit des Ortes an. Er dient auch als Timer. –