如何更新Python Tkinter窗口

6

我目前正在尝试每秒更新一个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

感谢您提前的支持!

2个回答

8
你的更新字段仅在关闭窗口时执行,因为tkinter的主循环会一直运行,直到窗口关闭。由于这个主循环,在tkinter中使用(长时间的)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()

6
你可以使用.update方法来更新窗口,这将使窗口更新并允许所有内容显示在其中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接