当前位置: 代码迷 >> python >> 在tkinter中是否存在用于文本或模式的即时更新功能,例如button.config()?
  详细解决方案

在tkinter中是否存在用于文本或模式的即时更新功能,例如button.config()?

热度:32   发布时间:2023-06-19 09:07:56.0

我写了一个修改过的“地雷”游戏程序,希望它能以图形方式显示每个步骤/单击。 我使用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”:如果不刷新,它们会堆积在一起。 因此,是否有一种方法可以使它们逐步更新,或者说立即更新? 谢谢!

在所有GUI系统中,都必须允许运行消息循环,以便迅速发生Windowing事件。 因此,请勿使用while循环。 而是创建一个调用check_block()和get_next()的方法,并在延迟后使用after来调用该函数。 在该函数结束时,你使用after一次可调用相同的功能,使这个函数被调用每0.5秒永远。 after函数将计时器事件排队,然后让消息队列得到处理。 计时器事件触发后,将运行回调函数,该回调函数可让您执行操作并保持UI响应。

您永远不要在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工具包。 而是将按钮配置为在单击时调用一个函数。

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

  相关解决方案