@@ -191,6 +191,7 @@ class Variable:
191191 that constrain the type of the value returned from get()."""
192192 _default = ""
193193 _tk = None
194+ _tclCommands = None
194195 def __init__ (self , master = None , value = None , name = None ):
195196 """Construct a variable
196197
@@ -209,7 +210,7 @@ def __init__(self, master=None, value=None, name=None):
209210 global _varnum
210211 if not master :
211212 master = _default_root
212- self ._master = master
213+ self ._root = master . _root ()
213214 self ._tk = master .tk
214215 if name :
215216 self ._name = name
@@ -222,9 +223,15 @@ def __init__(self, master=None, value=None, name=None):
222223 self .initialize (self ._default )
223224 def __del__ (self ):
224225 """Unset the variable in Tcl."""
225- if (self ._tk is not None and
226- self ._tk .getboolean (self ._tk .call ("info" , "exists" , self ._name ))):
226+ if self ._tk is None :
227+ return
228+ if self ._tk .getboolean (self ._tk .call ("info" , "exists" , self ._name )):
227229 self ._tk .globalunsetvar (self ._name )
230+ if self ._tclCommands is not None :
231+ for name in self ._tclCommands :
232+ #print '- Tkinter: deleted command', name
233+ self ._tk .deletecommand (name )
234+ self ._tclCommands = None
228235 def __str__ (self ):
229236 """Return the name of the variable in Tcl."""
230237 return self ._name
@@ -244,7 +251,20 @@ def trace_variable(self, mode, callback):
244251
245252 Return the name of the callback.
246253 """
247- cbname = self ._master ._register (callback )
254+ f = CallWrapper (callback , None , self ).__call__
255+ cbname = repr (id (f ))
256+ try :
257+ callback = callback .__func__
258+ except AttributeError :
259+ pass
260+ try :
261+ cbname = cbname + callback .__name__
262+ except AttributeError :
263+ pass
264+ self ._tk .createcommand (cbname , f )
265+ if self ._tclCommands is None :
266+ self ._tclCommands = []
267+ self ._tclCommands .append (cbname )
248268 self ._tk .call ("trace" , "variable" , self ._name , mode , cbname )
249269 return cbname
250270 trace = trace_variable
@@ -255,7 +275,11 @@ def trace_vdelete(self, mode, cbname):
255275 CBNAME is the name of the callback returned from trace_variable or trace.
256276 """
257277 self ._tk .call ("trace" , "vdelete" , self ._name , mode , cbname )
258- self ._master .deletecommand (cbname )
278+ self ._tk .deletecommand (cbname )
279+ try :
280+ self ._tclCommands .remove (cbname )
281+ except ValueError :
282+ pass
259283 def trace_vinfo (self ):
260284 """Return all trace callback information."""
261285 return [self ._tk .split (x ) for x in self ._tk .splitlist (
0 commit comments