2012-05-15 9 views
6

Tôi khá mới đối với Python và muốn đặt nhãn trong Tkinter bằng chức năng đếm ngược thời gian của tôi. Ngay bây giờ tất cả những gì nó làm là đặt lable thành "10" sau khi đạt tới 10 và tôi không thực sự hiểu tại sao. Ngoài ra, ngay cả khi tôi có in hẹn giờ đến một thiết bị đầu cuối thay vì "Thời gian lên!" bit không bao giờ in.Tạo đồng hồ đếm ngược bằng Python và Tkinter?

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: Một câu trả lời trước đó đã chỉ ra rằng lý do "Time's up!" bao giờ làm việc là vì không làm thế nào nó đã cho n để bằng chính xáct + p do không chính xác bằng cách sử dụng time.time. Phiên bản dựa trên bảng điều khiển cuối cùng của bộ hẹn giờ là:

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

Tuy nhiên, điều này không phù hợp với lý do mà Bryan Oakley đề cập trong câu trả lời và nhận xét của anh ấy.

+0

đây là [ví dụ về đếm ngược được triển khai bằng Tkinter] (https://gist.github.com/zed/1951815) – jfs

Trả lời

8

Tkinter đã có vòng lặp vô hạn đang chạy (vòng lặp sự kiện) và cách lập lịch để mọi thứ chạy sau một khoảng thời gian đã trôi qua (sử dụng after). Bạn có thể tận dụng điều này bằng cách viết một hàm gọi chính nó sau một giây để cập nhật màn hình. Bạn có thể sử dụng biến lớp để theo dõi thời gian còn lại.

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

Điều đó giải thích rất nhiều, cảm ơn bạn. Tôi đã tự hỏi tại sao nó chỉ cập nhật một khi mục cuối cùng đạt được ngay cả sau khi tôi viết lại nó một vài cách khác nhau. –

+0

@RyanHasse: chỉ hiển thị các cập nhật khi Tkinter có thể phản hồi các sự kiện yêu cầu cập nhật màn hình. Những sự kiện này chỉ được xử lý bởi vòng lặp sự kiện. Nếu bạn có vòng lặp của riêng mình, nó sẽ bỏ đói vòng lặp sự kiện, ngăn không cho vẽ lại yêu cầu xảy ra. –