我目前正在与tkinter
合作,并试图将tkinter.Tk.update
的回调转换为与异步代码兼容的东西。我已经弄清楚了大多数事情,事件等待,协议,但是剩下的唯一事情就是窗口更新。
update()
方法在调整窗口大小时阻塞。这使我的异步代码更加混乱,因为所有内容都必须运行且不会阻塞。我无法在另一个线程中运行它,例如this answer notes。
下面是一些测试代码,这些代码将计时对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
的调用所花费的时间。
<Motion>
您可以尝试重新调整窗口大小,然后运行打印功能。如果离开它,什么也不会发生。这意味着事件循环始终在处理调整大小后的事件。
注意:在屏幕上移动鼠标不会触发它,尽管对事件进行了一些修改以检查事件,但<Configure>
事件比{{1 }}事件。
我目前可以通过运行tkinter.Tk.resizable(False, False)
来避免调整大小,从而绕过此问题。我非常想在没有此限制的情况下工作,并且我对通话为什么受阻感兴趣。也许事件循环在内部处理了事件,但我不确定。
答案 0 :(得分:1)
为什么在调整窗口大小时tkinter.Tk.update()会阻塞?
我认为答案是因为update
必须在返回事件队列之前处理事件队列中的所有事件,并且在调整窗口大小时,在拖动事件的边缘或拐角时会将稳定的事件流发送到事件队列中窗户。