Python 3.x 如何将回调绑定到Tkinter resize事件,而不重复调用多次?

Python 3.x 如何将回调绑定到Tkinter resize事件,而不重复调用多次?,python-3.x,tkinter,callback,window-resize,Python 3.x,Tkinter,Callback,Window Resize,我有一个tkinter GUI,其中包含大量嵌套的小部件。我想在调整窗口大小时重新调整部分大小,因此我已将回调绑定到调整大小事件: self.parent.bind("<Configure>", self.onsize) self.parent.bind(“,self.onsize) 但是,每当调整窗口的大小时,self.onsize()都会被调用约100次,这会减慢速度,在少数情况下会在超过最大递归深度后导致崩溃。我假设这是因为在调整父窗口大小的过程中,每个小部件都会被单独重新

我有一个tkinter GUI,其中包含大量嵌套的小部件。我想在调整窗口大小时重新调整部分大小,因此我已将回调绑定到调整大小事件:

self.parent.bind("<Configure>", self.onsize)
self.parent.bind(“,self.onsize)
但是,每当调整窗口的大小时,
self.onsize()
都会被调用约100次,这会减慢速度,在少数情况下会在超过最大递归深度后导致崩溃。我假设这是因为在调整父窗口大小的过程中,每个小部件都会被单独重新缩放,所以会调用它

如何设置此回调,以便在调整父窗口和所有内部链接小部件的大小后只调用一次

或者,如何从传递的
事件
参数中包含的信息判断该事件是否对应于父窗口或父窗口的子窗口

我假设这是因为在调整父窗口大小的过程中,每个小部件都会被单独重新缩放,所以会调用它

也许,也许不是。这取决于父函数是什么,以及您在绑定函数中执行的操作。如果绑定的小部件(
self.parent
,在您的示例中)是根窗口或
Toplevel
的实例,则绑定将应用于所有子窗口。否则,事件将仅为绑定到的小部件触发

最可能的情况是,您的函数正在做一些事情,以使小部件在响应事件时调整大小。这将触发一个新事件,这就是为什么会出现递归错误。简而言之,您不应该在绑定函数中执行某些操作,以导致接收事件的小部件更改大小

如何设置此回调,以便在调整父窗口和所有内部链接小部件的大小后只调用一次

一种解决方案是让绑定函数在完成tkinter重绘后,在空闲后使用
调度另一个要调用的函数。这在你的具体案例中是否有效很难说,因为你的问题并没有说明你为什么要这么做。如果您的函数本身正在调用
update
update\u idletasks
,它可能无法工作,因为这些函数处理空闲事件

或者,如何从传递的事件参数中包含的信息判断事件是否对应于父窗口或父窗口的子窗口


事件对象的
小部件
属性将告诉您哪个小部件收到了事件。

是的,看起来您是对的-在某些情况下,调整大小会导致从该小部件生成其他调整大小事件,并且它会爆炸。很抱歉,没有提供详细信息-对于我遇到的问题,我对这个问题的理解比我应该做的更深了一点,所以MWE将是棘手的。我会努力的。我在空闲后尝试了
路线,但运气不好。我怀疑我只是从根本上做错了,也许是时候进行重构而不必处理这个问题了。