“update”和“update_idletasks”之间有什么区别?

时间:2015-03-20 03:18:17

标签: python python-3.x tkinter

effbot.org文档中,我们有关于update函数的以下内容:

  

处理所有待处理事件,调用事件回调,完成任何事件   挂起的几何管理,根据需要重绘小部件和调用   所有挂起的空闲任务。应该小心使用这种方法,因为它   如果从错误中调出,可能会导致真正令人讨厌的竞争条件   放置(例如,从事件回调中,或从函数中)   可以以任何方式从事件回调中调用,等等。什么时候进去   怀疑,改为使用update_idletasks

另一方面,关于update_idletasks功能的问题是:

  

调用所有待处理的空闲任务,而不处理任何其他事件。   这可用于执行几何管理和重绘小部件   如果有必要,不要回拨任何回调。

据我所知,调用所有待处理的空闲任务完成任何待处理的几何管理重绘小部件。我看到的唯一区别是update 处理所有待处理事件调用事件回调。这就是为什么我们不应该在甚至回调中调用update的原因。我猜想。

但是,我看到examples其中update_idletasksupdate一个接一个地使用,我无法理解原因,因为理论上update完成update_idletasks所做的一切。

文档正在讨论的这些待处理事件空闲任务究竟是什么?有什么区别和关系?

有人回答说,在真实情况下我应该update使用update_idletasks吗?具体的例子也很受欢迎。

1 个答案:

答案 0 :(得分:14)

  

我看到的唯一区别是更新处理所有待处理事件   并调用事件回调。这就是为什么我们不应该调用更新   在一个甚至回调中,我想。

两个帐户都是正确的。

什么是未决事件?主要使用after安排的活动。而且,正如您在问题中提到的那样,触发重绘的事件。

您应该使用update而不是update_idletasks的情况?几乎从不。老实说,我务实的答案是“永远不要打{{1​​}},除非打电话给update做得不够”。

要记住的重要一点是,update_idletasks会阻止所有事件的处理。实际上,这意味着您在update内嵌套了mainloop。在无限循环中有一个无限循环永远不是一个好主意。

如果你看到一个被一个接一个地调用的例子,你会看到不好的例子。老实说,完全没有理由这样做。我看到很多代码调用mainloop的方式比以往更频繁。