From: Thomas L. <ta...@ec...> - 2004-10-20 11:55:23
|
On Tue, Oct 19, 2004 at 09:54:40AM -0700, Ken Hayber wrote: > Thomas Leonard wrote: > >On Sat, Oct 16, 2004 at 01:14:38PM -0700, Ken Hayber wrote: > > > >>Thomas, > >> > >>I noticed that using more than one ToggleItem in a menu didn't work. The > >>update function of the _last_ item got called for _all_ items. > >> > >>The problem seems to be that the update_callbacks array stores the widget > >>on which to call the update, but this widget is not bound at the time it > >>goes into the array. So all widget references are shared and end up > >>being the last widget in the loop. [...] > >A simpler change might be (untested): > > > >- self.update_callbacks.append(lambda: fn(self, widget)) > >+ self.update_callbacks.append(lambda w=widget: fn(self, w)) > > > > No, at least not as written. But I think I see what you were trying to do. > I think w is still just a reference to widget; 'w' is still changing when > 'widget' does. No, my patch did fix the widget problem... but 'fn' had exactly the same issue so it still didn't work ;-) Fixed now, and I've added a unittest to check for it as well. > It (w) really needs to be a copy(?) or a reference to the original widget, > not the variable 'widget' itself? Some of the underlying python > implementation stuff is unclear to me. In w=widget, 'widget' is looked up when the lamba is created and the thing it points to is stored, to become 'w' when the function is invoked. Thanks, -- Dr Thomas Leonard http://rox.sourceforge.net tal at ecs.soton.ac.uk tal197 at users.sourceforge.net GPG: 9242 9807 C985 3C07 44A6 8B9A AE07 8280 59A5 3CC1 |