代码之家  ›  专栏  ›  技术社区  ›  GeeTransit

为什么特金特。蒂克。在调整窗口大小时更新()块?

  •  1
  • GeeTransit  · 技术社区  · 5 年前

    我目前与 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
    

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

    注意:在屏幕上移动鼠标不会触发事件,但只需稍加修改即可检查事件 <Motion> 事件发生了 方法 <Configure> 事件。

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   Bryan Oakley    5 年前

    为什么特金特。蒂克。在调整窗口大小时更新()块?

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