2014-09-04 96 views
0

我正在創建一個Python程序,在Tkinter窗口中顯示時間和天氣。我需要有時間,天氣和其他不斷更新的東西。這裏是我的舊代碼:更新Tkinter窗口的內容

import time 

from Tkinter import * 

root = Tk() 
while True: 
    now = time.localtime(time.time()) # Fetch the time 
    label = time.strftime("%I:%M", now) # Format it nicely 
    # We'll add weather later once we find a source (urllib maybe?) 
    w = Label(root, text=label) # Make our Tkinter label 
    w.pack() 
    root.mainloop() 

我從來沒有做過與Tkinter的任何東西,這是令人沮喪的是,環不起作用。顯然,Tkinter在運行時不會讓你做任何類似循環或非Tkinter的任何事情。我以爲我可以用線程做些什麼。

#!/usr/bin/env python 


# Import anything we feel like importing 
import threading 
import time 

# Thread for updating the date and weather 
class TimeThread (threading.Thread): 
    def run (self): 
     while True: 
      now = time.localtime(time.time()) # Get the time 
      label = time.strftime("%I:%M", now) # Put it in a nice format 
      global label # Make our label available to the TkinterThread class 
      time.sleep(6) 
      label = "Weather is unavailable." # We'll add in weather via urllib later. 
      time.sleep(6) 

# Thread for Tkinter UI 
class TkinterThread (threading.Thread): 
    def run (self): 
     from Tkinter import * # Import Tkinter 
     root = Tk() # Make our root widget 
     w = Label(root, text=label) # Put our time and weather into a Tkinter label 
     w.pack() # Pack our Tkinter window 
     root.mainloop() # Make it go! 

# Now that we've defined our threads, we can actually do something interesting. 
TimeThread().start() # Start our time thread 
while True: 
    TkinterThread().start() # Start our Tkinter window 
    TimeThread().start() # Update the time 
    time.sleep(3) # Wait 3 seconds and update our Tkinter interface 

這樣也行不通。出現多個空窗口,並且它們出現了一噸。我的調試器也收到了很多錯誤。

當我更新時,是否需要停止並重新打開我的窗口?我可以告訴Tkinter更新tkinter.update(root)之類的東西嗎?

是否有解決方法或解決方案,或者我錯過了什麼?如果您看到我的代碼有任何問題,請告訴我。

謝謝! 亞歷

回答

0

你可以在「鳥巢」你after電話:

def update(): 
    now = time.localtime(time.time()) 
    label = time.strftime("%I:%M:%S", now) 
    w.configure(text=label) 
    root.after(1000, update) 

現在你只需要在主循環之前調用after一次,並從現在起每秒更新。

+0

所以我得到這個: [鏈接](http://txt.do/o5we) 它不斷打開新的空白窗口的每一秒。我在這裏錯過了什麼? – user3724472 2014-09-04 16:27:38

+0

1.每次調用update時,都會創建一個新的'Tk'實例。像以前一樣將它移到函數之外。 2.啓動主循環後,不必調用'update'。當然,我沒有發表整個劇本。我只是給了你方法和一些說明如何實現你的功能。 – TidB 2014-09-04 16:30:59