2014-11-25 129 views
0

我正在嘗試每秒更新一次TKinter窗口。所以想法是應該打開一個窗口,讓Python更新字段,顯示更新的窗口。現在的情況是,第二個窗口只在我關閉第一個窗口時才顯示。我猜這與mainloop()有關。我看着.update()和.update_idletasks(),但我無法弄清楚如何實現它。 TKinter用於顯示一個有房屋的場地。所以一般是應該這樣做:如何更新python tkinter窗口

  • 生成的房子位置(已實施),在它的房子(已實現)
  • 生成房屋(已經實現)
  • 展會的新位置
  • 秀場更新字段

這是我當前的代碼。我不確定是否需要更新功能。

class Plot(tk.Frame): 
     def __init__(self, master=None): 
      tk.Frame.__init__(self, master) 
      self.grid() 

     def createWidgets(self, list_houses): 
      houses = list_houses 
      self.w = tk.Canvas(self, width = field.width*SIZE, height = field.height*SIZE, bg = '#E4E4E4') 

      ... 

      self.w.grid() 

     def update(self): 
      ? 

#GENERATES FIELD AND HOUSES 
... 

#PRINT FIRST WINDOW 
plot = Plot() 
plot.createWidgets(houses) <- PUT HOUSES IN TK INTER 
plot.master.title('map of houses') 
plot.mainloop() 

# UPDATE FIELD <- THIS PART IS ONLY EXECUTED WHEN I CLOSE THE FIRST WINDOW, WHY? 
i = 0 
while i < 2: 
    update = field.update_houses(houses) <- GENERATES NEW LOCATION OF HOUSES 

    #PRINT UPDATED WINDOW, IT SHOULD BE PRINTED IN THE SAME WINDOW! 
    plot = Plot() 
    plot.createWidgets(houses) <- PUT HOUSES IN TKINTER 
    plot.master.title('map of houses') 

    i += 1 

在此先感謝!

回答

4

您的更新字段僅在關閉窗口時執行,因爲tkinter的主循環一直運行,直到窗口關閉。由於這個主循環,在tkinter中使用(long)while循環是一個壞主意,因爲while循環鎖定了tkinter主循環。

要在不阻止主循環的情況下多次執行某些操作,請使用after方法。這會在一段時間後調用一個函數。您可以在進入主循環前調用它一次,然後在更新函數中再次調用它,以便更新函數自行調用。看看它使用after執行更新功能每秒這個小例子:

import Tkinter as tk 
import random 

def update(): 
    l.config(text=str(random.random())) 
    root.after(1000, update) 

root = tk.Tk() 
l = tk.Label(text='0') 
l.pack() 
root.after(1000, update) 
root.mainloop() 
2

你可以使用.update到窗口。這將使它更新窗口並允許所有內容在其上。