“update”和“update_idletasks”有什么区别?
- 2025-04-10 09:45:00
- admin 原创
- 18
问题描述:
从effbot.org
文档中,我们可以得到有关该函数的以下信息update
:
处理所有待处理事件、调用事件回调、完成任何待处理的几何管理、根据需要重新绘制小部件以及调用所有待处理的空闲任务。应谨慎使用此方法,因为如果从错误的位置调用(例如,从事件回调中,或者从可以以任何方式从事件回调调用的函数等),可能会导致非常严重的竞争条件。如有疑问,请改用
update_idletasks
。
另一方面,该update_idletasks
功能有以下特点:
调用所有待处理的空闲任务,而不处理任何其他事件。这可用于执行几何管理并在必要时重新绘制小部件,而无需调用任何回调。
据我了解,两者都调用所有待处理的空闲任务,完成任何待处理的几何管理并根据需要重新绘制小部件。我看到的唯一区别是update
处理所有待处理的事件并调用事件回调。我想这就是为什么我们不应该update
在事件回调中调用的原因。
然而,我见过一些例子,其中update_idletasks
和update
被一个接一个地使用,我无法理解其中的原因,因为理论上update
一切都是update_idletasks
如此。
这些待处理事件和文档中提到的空闲任务到底是什么?它们之间有什么区别和联系?
既然已经回答了这个问题,那么在什么实际情况下我应该使用update
over update_idletasks
?也欢迎具体的例子。
解决方案 1:
我看到的唯一区别是 update 处理所有待处理事件并调用事件回调。我想这就是为什么我们不应该在事件回调中调用 update。
你说的这两点都是正确的。
什么是待处理事件?大多数情况下,事件都是通过 安排的after
。还有,正如您在问题中提到的,触发重绘的事件。
什么情况下应该使用update
over update_idletasks
?几乎从不。老实说,我的务实回答是“update
除非调用效果update_idletasks
不够,否则永远不要调用”。
需要记住的重要一点是, 会update
阻塞,直到所有事件都处理完毕。实际上,这意味着您将 嵌套mainloop
在 中mainloop
。在无限循环内嵌套无限循环永远不是一个好主意。
如果您看到一个函数在另一个函数之后被调用的示例,那么您看到的就是坏示例。老实说,根本没有理由这样做。我看到的很多代码调用的update
频率都比它应该调用的频率高得多。
扫码咨询,免费领取项目管理大礼包!