我目前正在尝试每秒更新一个TKinter窗口。所以想法是应该打开一个窗口,让python更新字段,显示更新窗口。现在的情况是第二个窗口仅在我关闭第一个窗口时显示。我猜这与mainloop()有关。我查看了.update()和.update_idletasks(),但我无法弄清楚如何实现它。 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
提前致谢!
答案 0 :(得分:4)
您的更新字段仅在关闭窗口时执行,因为tkinter的主循环一直运行直到窗口关闭。由于这个主循环,在tkinter中使用(long)while循环是个坏主意,因为while循环锁定了tkinter mainloop。
要多次执行操作而不阻止主循环,请使用after
方法。这会在一段时间后调用一个函数。您可以在进入mainloop之前调用它一次,然后在更新函数中再次调用它,以便更新函数自行调用。看一下这个小例子,它使用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()
答案 1 :(得分:2)
您可以使用.update
到窗口。这将使它更新窗口并允许其中的所有内容。