`<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 管理器仅在执行它们后才完成状态更改。
假设我想 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 管理器仅在执行它们后才完成状态更改。