为什么在调整窗口大小时tkinter.Tk.update()会阻塞?

2024-05-13 20:21:25 发布

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

我目前正在使用curio,并试图将tkinter的回调转换成与异步代码兼容的东西。我已经搞清楚了大部分事情,事件等待,协议,但唯一剩下的是窗口更新

tkinter.Tk.update方法在调整窗口大小时阻塞。这就毁了我的异步代码,因为所有东西都必须在没有阻塞的情况下运行。我不能在另一个线程中运行这个,因为this answer notes

下面是一些测试代码,用于计算调用update()所需的时间

import tkinter
from time import monotonic

window = tkinter.Tk()
try:
    while True:
        started = monotonic()
        window.update() # This is the blocking call
        delta = monotonic() - started
        if delta >= 0.5:
            print(f'{func.__name__} took {delta} seconds to run')

except tkinter.TclError:
    # The window is closed
    pass

您可以尝试调整窗口的大小一秒钟,然后运行print函数。如果你离开它,什么也不会发生。这意味着事件循环总是在处理来自调整大小的事件

注意:在屏幕上移动鼠标不会触发它,尽管稍微修改一下以检查事件,<Motion>事件的发生方式比<Configure>事件的发生方式要多

我现在可以通过运行tkinter.Tk.resizable(False, False)来绕过这个问题,以防止调整大小。我很想在没有这个限制的情况下工作,我很想知道为什么电话不通。也许事件循环正在内部处理一些事件,但我不确定


Tags: 代码importfalseistkinter方式事件情况
1条回答
网友
1楼 · 发布于 2024-05-13 20:21:25

Why does tkinter.Tk.update() block while the window is being resized?

我认为答案是因为update必须在事件队列返回之前处理它中的所有事件,当您拖动窗口的边缘或角落时,调整窗口大小会向事件队列发送稳定的事件流

相关问题 更多 >