文本或模式是否有instantupdating功能按钮配置()在特金特?

2024-05-28 23:58:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个“地雷”游戏的修改程序,我希望它能以图形化的方式显示每一步/点击。我用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++中的“CUT”:如果你不刷新,它们就会被堆叠。那么,有没有一种方法可以让他们一步一步地更新,或者说,立即更新? 谢谢!你知道吗


Tags: image程序config游戏iftimechecksleep
2条回答

在所有GUI系统中,您必须允许消息循环运行,以便窗口事件迅速发生。所以不要像这样使用while循环。相反,创建一个调用check\u block()和get\u next()的方法,并在延迟后使用after调用该函数。在该函数结束时,再次使用after来再次调用同一个函数,因此该函数永远每隔0.5秒调用一次。after函数将计时器事件排队,然后允许处理消息队列。一旦计时器事件触发,回调函数就会运行,它允许您执行操作并保持UI响应。你知道吗

决不应该在GUI程序中调用sleep。这是因为GUI必须始终处于“唤醒”状态,以便为事件(包括导致屏幕更新的内部事件)提供服务。相反,利用已经运行的eventloop,使用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工具包都不需要这样做。相反,您可以将按钮配置为在单击时调用函数。你知道吗

不管怎样,执行所需循环类型的方法是以固定的间隔将事件放置在事件队列中。你知道吗

相关问题 更多 >

    热门问题