`<tkinter.Tk>.iconify()` 总是需要 2 秒

`<tkinter.Tk>.iconify()` always takes 2 seconds

假设我想 iconify 一个 tkinter window。我会使用这样的东西:

from time import perf_counter
import tkinter as tk

def time(function, *args, **kwargs):
    start = perf_counter()
    function(*args, **kwargs)
    return perf_counter() - start

root = tk.Tk()
root.update() # Make sure that the window appears on the screen
print(time(root.iconify)) # 2.0016179770000235

问题是 .iconify() 到 运行 总是需要 2 秒多一点。这是为什么?我看了 tkinter's source code:

def wm_iconify(self):
    """Display widget as icon."""
    return self.tk.call('wm', 'iconify', self._w)

iconify = wm_iconify

直接带参数调用_tkinter。我尝试阅读 _tkinter 的源代码 (here),但我找不到 2 秒的去向。我的猜测是问题出在下面 _tkinter.

编辑:此问题仅影响 Python 3.8.6 + Ubuntu 20.10 但不会出现在 Python 3.7.9 + Window 10 上。

Tk 在 Unix X11 上的实现最底层(中间还有其他位,很多,但它们都非常快)是 this ,为方便起见,转载于此:

if (XIconifyWindow(winPtr->display, wmPtr->wrapperPtr->window,
        winPtr->screenNum) == 0) {
    return 0;
}
WaitForMapNotify(winPtr, 0);

WaitForMapNotify 很复杂,但确实如锡罐上所说:等待来自 X11 的 MapNotify 事件。)

它发送图标化请求,然后等待 Window 管理器响应。出于某种原因,Ubuntu 发送该消息需要很长时间(2 秒!)。我将其描述为 Ubuntu 中的错误……除非出于某种原因您启用了一些精美的动画并且 Window 管理器仅在执行它们后才完成状态更改。