如何将回调绑定到 Tkinter 调整大小事件而不会被冗余调用多次?

How can I bind a callback to a Tkinter resize event without it getting called multiple times redundantly?

我有一个带有大量嵌套小部件的 tkinter GUI。我想在 window 调整大小时重新调整它的一部分,所以我将回调绑定到调整大小事件:

self.parent.bind("<Configure>", self.onsize)

但是,每当 window 调整大小时,self.onsize() 就会被调用约 100 次,这会减慢一切,并且在少数情况下会在超过最大递归深度后导致崩溃。我假设这是因为在调整父级 window 大小时,每个小部件都会单独重新缩放,因此它会被调用。

如何设置此回调以便在调整父 window 和所有内部链接的小部件的大小后仅调用一次?

或者,我如何根据传递的 event 参数中包含的信息判断该事件是对应于父 window 还是父的子?

I am assuming that this is because it is getting called as every single widgets gets rescaled individually in the process of resizing the parent window.

也许,也许不是。这取决于 parent 是什么,以及您在绑定函数中所做的事情。如果绑定的小部件(在您的示例中为 self.parent)是根 window 或 Toplevel 的实例,则绑定将应用于所有 child windows。否则,该事件只会为它绑定的小部件触发。

最有可能的是,您的函数正在做一些事情来使小部件在响应事件时调整大小。这将触发一个新事件,这就是你得到递归错误的原因。简而言之,您不应该在绑定函数中做一些事情来导致接收到事件的小部件改变大小。

How can I set this callback up so that it is only called once, after the parent window and all of the internally linked widgets have been resized?

一个解决方案是使用 after_idle 让绑定函数安排另一个函数在 tkinter 完成重绘后调用。这是否适用于您的具体情况很难说,因为您的问题没有说明您实际这样做的原因。如果您的函数本身正在调用 updateupdate_idletasks 它可能无法工作,因为这些函数处理空闲事件。

alternatively, how can I tell from the information contained in the event parameter that gets passed, whether or not the event corresponds to the parent window, or to a child of the parent?

事件的 widget 属性 object 会告诉您哪个小部件收到了事件。