问题描述
我写了一个修改过的“地雷”游戏程序,希望它能以图形方式显示每个步骤/单击。
我使用time.sleep(0.5)
进行暂停。
因此,一般而言,主程序如下所示:
check_block():
if mine == 0: buttons[current].config(image = tile_clicked) elif mine == 1: buttons[current].config(image = tile[1]) ...
while(1):
time.sleep(0.5) check_block() get_next() if check_fail(): break
但是,按钮不会每0.5秒更新一次:当game(loop)
完成时,它们都一起更新。
我想这就像C ++中的“ cout”:如果不刷新,它们会堆积在一起。 因此,是否有一种方法可以使它们逐步更新,或者说立即更新? 谢谢!
1楼
在所有GUI系统中,都必须允许运行消息循环,以便迅速发生Windowing事件。
因此,请勿使用while循环。
而是创建一个调用check_block()和get_next()的方法,并在延迟后使用after
来调用该函数。
在该函数结束时,你使用after
一次可调用相同的功能,使这个函数被调用每0.5秒永远。
after函数将计时器事件排队,然后让消息队列得到处理。
计时器事件触发后,将运行回调函数,该回调函数可让您执行操作并保持UI响应。
2楼
您永远不要在GUI程序中调用sleep。
这是因为GUI必须始终处于“唤醒状态”,以便它可以处理事件(包括导致屏幕更新的内部事件)。
相反,通过使用after
方法来定期将事件放入队列,以利用已经在运行的事件循环。
在您的情况下,可以将while循环替换为:
def do_check():
check_block()
if not check_fail():
root.after(500, do_check)
# in your initialization code, start the loop by calling it directly:
do_check()
我不知道您的get_next
函数做什么,所以我也不知道您是否也需要定期调用它。
可能不是。
我猜想它等待下一次按钮按下,您不需要使用tkinter或大多数其他GUI工具包。
而是将按钮配置为在单击时调用一个函数。
无论如何,执行所需的循环类型的方法是定期将事件放置在事件队列中。