问题描述
我正在编写“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 函数的进度。
这是'runGrid'函数执行后的网格截图:
滑翔机(图案)在 10 次移动中从第一个位置“移动”到最后一个位置,但是,使用 runGrid 函数只能看到第一个和最后一个位置。如果连续调用 updateGrid 函数 10 次,则可以看到一举一动。
解决方法
当 GUI(tkitner
、PyQt
、其他 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)