`<;tkinter.Tk>;。iconify()`始终需要2秒钟

`<;tkinter.Tk>;。iconify()`始终需要2秒钟,tkinter,tcl,Tkinter,Tcl,假设我想要iconifytkinter窗口。我会用这样的方式: 从时间导入性能计数器 将tkinter作为tk导入 def时间(函数、*args、**kwargs): 开始=性能计数器() 函数(*args,**kwargs) 返回性能计数器()-开始 root=tk.tk() root.update()#确保窗口显示在屏幕上 打印(时间(根图标))#2.001617977000235 问题是运行.iconify()总是需要2秒多一点的时间。为什么呢?我看了看: def wm_图标化(自):

假设我想要
iconify
tkinter窗口。我会用这样的方式:

从时间导入性能计数器
将tkinter作为tk导入
def时间(函数、*args、**kwargs):
开始=性能计数器()
函数(*args,**kwargs)
返回性能计数器()-开始
root=tk.tk()
root.update()#确保窗口显示在屏幕上
打印(时间(根图标))#2.001617977000235
问题是运行
.iconify()
总是需要2秒多一点的时间。为什么呢?我看了看:

def wm_图标化(自):
“”“将小部件显示为图标。”“”
返回self.tk.call('wm','iconify',self.\w)
象似性=wm_象似性
它直接调用带有参数的
\u tkinter
。我试着阅读
\u tkinter
的源代码(),但我找不到这2秒钟的去向。我猜问题出在下面的某个地方

编辑:这个问题只影响
Python3.8.6
+
Ubuntu20.10
,但没有出现在
Python3.7.9
+
Window 10

的Unix X11上Tk实现的最底层(中间还有其他位,很多位,但都很快),为方便起见,现转载如下:

if(XIconifyWindow)(winPtr->display,wmPtr->wrapperpertr->window,
winPtr->screenNum)==0){
返回0;
}
WaitForMapNotify(winPtr,0);
(WaitForMapNotify很复杂,但它会按照tin上的说明执行:等待来自X11的
MapNotify
事件。)

它向iconify发送请求,然后等待窗口管理器响应。出于某种原因,Ubuntu需要很长时间(2秒!)才能发送该消息。我将其描述为Ubuntu中的一个bug…除非出于某种原因,您启用了一些奇特的动画,并且窗口管理器在执行这些动画之后才完成状态更改。

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

if(XIconifyWindow)(winPtr->display,wmPtr->wrapperpertr->window,
winPtr->screenNum)==0){
返回0;
}
WaitForMapNotify(winPtr,0);
(WaitForMapNotify很复杂,但它会按照tin上的说明执行:等待来自X11的
MapNotify
事件。)


它向iconify发送请求,然后等待窗口管理器响应。出于某种原因,Ubuntu需要很长时间(2秒!)才能发送该消息。我将其描述为Ubuntu中的一个bug……除非出于某种原因,您启用了一些奇特的动画,而窗口管理器只是在执行这些动画之后才完成状态更改。

您计算时间的方式有些问题。检查此代码并查看@BlackThunder,当我有问题时,它是向我建议的
perf_counter
应该更准确,并且可以正常工作。我还忘了提到这个问题并没有出现在Windows 10上,但它出现在Ubuntu 20.10上。你计算时间的方式有些问题。检查此代码并查看@BlackThunder,当我有问题时,它是向我建议的
perf_counter
应该更准确,并且可以正常工作。另外,我忘了提到这个问题在Windows10上没有出现,但在Ubuntu 20.10上出现了。谢谢。这是我们的2秒钟。顺便说一句,我的Ubuntu上有默认设置。如果
WaitForMapNotify(winPtr,0)
被删除,会发生什么?“那个调用看起来并不重要。”TheLizzard没有它,就会出现状态不一致。我真的不知道这些不一致会带来什么后果。(所讨论的代码可以追溯到Tk的早期,在我们的SCM记录开始之前-事情在1999年左右丢失了。)哇,代码非常古老。谢谢你的帮助。这是我们的2秒钟。顺便说一句,我的Ubuntu上有默认设置。如果
WaitForMapNotify(winPtr,0)
被删除,会发生什么?“那个调用看起来并不重要。”TheLizzard没有它,就会出现状态不一致。我真的不知道这些不一致会带来什么后果。(所讨论的代码可以追溯到Tk的早期,在我们的SCM记录开始之前-事情在1999年左右丢失了。)哇,代码非常古老。谢谢你的帮助。