2012-05-15 12 views
6

Ich bin ziemlich neu in Python und möchte eine Bezeichnung in Tkinter mit meiner Countdown-Timer-Funktion setzen. Im Moment wird nur das Label auf "10" gesetzt, sobald 10 erreicht ist und ich verstehe nicht wirklich warum. Auch wenn ich den Timer auf ein Terminal drucken lasse, ist die Zeit abgelaufen! Bit druckt nie.Einen Countdown-Timer mit Python und Tkinter machen?

import time 
import tkinter as tk 

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

    ## Define a timer. 
    def Pomodoro(self): 
     p = 10.00 
     t = time.time() 
     n = 0 
     while n - t < p: ## Loop while the number of seconds is less than the integer defined in "p" 
      n = time.time() 
      if n == t + p: 
       self.label.configure(text="Time's up!") 
      else: 
       self.label.configure(text=round(n - t)) 

app=App() 

EDIT: Eine frühere Antwort zeigte, dass der Grund der "Time's up!" nie, weil, wie unwahrscheinlich es war für n gearbeitet ist genau mit der Verwendung von time.timet + p wegen Unschärfen zu gleichen. Die endgültige Konsole basierte Version des Timers war:

import time 

## Define a static Pomodoro timer. 
def Countdown(): 
     p = 2.00 
     alarm = time.time() + p 
     while True: ## Loop infinitely 
      n = time.time() 
      if n < alarm: 
       print(round(alarm - n)) 
      else: 
       print("Time's up!") 
       break 

Countdown() 

Dies ist jedoch nicht aus den Gründen, Bryan Oakley erwähnt in seiner Antwort und Kommentare mit Tkinter funktioniert.

+0

hier ist ein [Codebeispiel eines Countdowns mit Tkinter implementiert] (https://gist.github.com/zed/1951815) – jfs

Antwort

8

Tkinter hat bereits eine Endlosschleife ausgeführt (die Ereignisschleife) und eine Möglichkeit, Dinge nach Ablauf einer bestimmten Zeitspanne zu planen (mit after). Sie können dies ausnutzen, indem Sie eine Funktion schreiben, die sich selbst jede Sekunde aufruft, um die Anzeige zu aktualisieren. Sie können eine Klassenvariable verwenden, um die verbleibende Zeit zu verfolgen.

import Tkinter as tk 

class ExampleApp(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.label = tk.Label(self, text="", width=10) 
     self.label.pack() 
     self.remaining = 0 
     self.countdown(10) 

    def countdown(self, remaining = None): 
     if remaining is not None: 
      self.remaining = remaining 

     if self.remaining <= 0: 
      self.label.configure(text="time's up!") 
     else: 
      self.label.configure(text="%d" % self.remaining) 
      self.remaining = self.remaining - 1 
      self.after(1000, self.countdown) 

if __name__ == "__main__": 
    app = ExampleApp() 
    app.mainloop() 
+0

, die eine Menge erklärt, danke. Ich habe mich gefragt, warum es nur aktualisiert wird, sobald der letzte Gegenstand erreicht ist, auch nachdem ich ihn auf verschiedene Arten neu geschrieben habe. –

+0

@RyanHasse: Die Anzeige wird nur aktualisiert, wenn Tkinter auf Ereignisse reagieren kann, die die Anzeige aktualisieren. Diese Ereignisse werden nur von der Ereignisschleife verarbeitet. Wenn Sie eine eigene Schleife haben, verhungern Sie die Ereignisschleife und verhindern so, dass Neuanforderungs-Anfragen auftreten. –