多次运行一个函数并在 tkinter 上显示输出

问题描述

我正在编写“The Game Of Life”并使用 tkinter 作为 GUI。我有一个网格(只是一个 20 x 20 个按钮的网格)和一个“updateGrid”函数,它获取网格的当前值并根据生命游戏的规则更新它。我将“updateGrid”函数链接到“Next”按钮,因此如果单击“Next”按钮,网格就会更新。我想实现一个“runGrid”函数,(连接到一个“运行”按钮)多次运行“updateGrid”函数。我试过这个:

def runGrid():
    for i in range(0,10):
        updateGrid()
        time.sleep(4)

但似乎 tkinter GUI 仅在 runGrid 功能完成后才会更新。我希望 tkinter GUI 在每次迭代后更新,以便用户可以看到 runGrid 函数的进度。

这是按下任何按钮之前网格的屏幕截图:

enter image description here

这是'runGrid'函数执行后的网格截图:

enter image description here

滑翔机(图案)在 10 次移动中从第一个位置“移动”到最后一个位置,但是,使用 runGrid 函数只能看到第一个和最后一个位置。如果连续调用 updateGrid 函数 10 次,则可以看到一举一动。

解决方法

当 GUI(tkitnerPyQt、其他 GUI、其他语言)运行您的函数时,它们不会立即更新小部件,而是等待您的代码结束并仅更新所有小部件一次。这样他们的工作量就会减少,而且他们只重绘一次窗口,所以它不会闪烁。


您可以使用 after(milliseconds,function_name,[arg1,...]) 定期执行函数而不阻塞 mainloop

像这样

def runGrid(i=10):
    updateGrid()
    if i > 0:
       root.after(4000,runGrid,i-1)  # 4000ms = 4s

最终你可以使用root.update()来强制mainloop重绘窗口

def runGrid():
    for i in range(0,10):
        updateGrid()
        root.update()
        time.sleep(4)