我目前正在使用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)
来绕过这个问题,以防止调整大小。我很想在没有这个限制的情况下工作,我很想知道为什么电话不通。也许事件循环正在内部处理一些事件,但我不确定
我认为答案是因为
update
必须在事件队列返回之前处理它中的所有事件,当您拖动窗口的边缘或角落时,调整窗口大小会向事件队列发送稳定的事件流相关问题 更多 >
编程相关推荐