文本或模式的即时更新功能是否为tkinter中的button.config()?

时间:2014-03-09 22:51:05

标签: python tkinter

我写了一个“矿山”游戏的修改程序,我希望它以图形方式显示每一步/点击。我使用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'一样:如果你不刷新它们就会堆积起来。那么,有没有一种方法可以让它们一步一步地更新,或者说立即更新? 谢谢!

2 个答案:

答案 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工具包。而是将按钮配置为在单击时调用函数。

无论如何,执行所需循环类型的方法是定期将事件放在事件队列中。