我写了一个“矿山”游戏的修改程序,我希望它以图形方式显示每一步/点击。我使用time.sleep(0.5)
暂停。所以,一般来说主程序就像:
check_block():
if mine == 0: buttons[current].config(image = tile_clicked) elif mine == 1: buttons[current].config(image = tile[1]) ...
,而(1):
time.sleep(0.5) check_block() get_next() if check_fail(): break
但是,按钮不会每0.5秒更新一次:当game(loop)
完成时,它们会一起更新。
我想这就像C ++中的'cout'一样:如果你不刷新它们就会堆积起来。那么,有没有一种方法可以让它们一步一步地更新,或者说立即更新? 谢谢!
答案 0 :(得分:0)
在所有GUI系统中,您必须允许消息循环运行,以便及时发生Windowing事件。所以不要像这样使用while循环。相反,创建一个调用check_block()和get_next()的方法,并使用after
在延迟后调用该函数。在该函数结束时,再次使用after
再次调用相同的函数,以便每0.5秒永远调用此函数。 after函数将计时器事件排队,然后处理消息队列。一旦你的计时器事件触发,就会运行回调函数,它允许你做事并保持UI的响应。
答案 1 :(得分:0)
你永远不应该在GUI程序中调用sleep。这是因为GUI必须始终“清醒”,以便它可以为事件(包括导致屏幕更新的内部事件)提供服务。相反,通过使用after
方法定期将事件放入队列,利用已经运行的eventloop。
在您的情况下,您可以用以下内容替换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工具包。而是将按钮配置为在单击时调用函数。
无论如何,执行所需循环类型的方法是定期将事件放在事件队列中。