@@ -343,16 +343,9 @@ def set(self, value):
343343 def get (self ):
344344 """Return value of variable."""
345345 return self ._tk .globalgetvar (self ._name )
346- def trace_variable (self , mode , callback ):
347- """Define a trace callback for the variable.
348346
349- MODE is one of "r", "w", "u" for read, write, undefine.
350- CALLBACK must be a function which is called when
351- the variable is read, written or undefined.
352-
353- Return the name of the callback.
354- """
355- f = CallWrapper (callback , None , self ).__call__
347+ def _register (self , callback ):
348+ f = CallWrapper (callback , None , self ._root ).__call__
356349 cbname = repr (id (f ))
357350 try :
358351 callback = callback .__func__
@@ -366,25 +359,99 @@ def trace_variable(self, mode, callback):
366359 if self ._tclCommands is None :
367360 self ._tclCommands = []
368361 self ._tclCommands .append (cbname )
362+ return cbname
363+
364+ def trace_add (self , mode , callback ):
365+ """Define a trace callback for the variable.
366+
367+ Mode is one of "read", "write", "unset", or a list or tuple of
368+ such strings.
369+ Callback must be a function which is called when the variable is
370+ read, written or unset.
371+
372+ Return the name of the callback.
373+ """
374+ cbname = self ._register (callback )
375+ self ._tk .call ('trace' , 'add' , 'variable' ,
376+ self ._name , mode , (cbname ,))
377+ return cbname
378+
379+ def trace_remove (self , mode , cbname ):
380+ """Delete the trace callback for a variable.
381+
382+ Mode is one of "read", "write", "unset" or a list or tuple of
383+ such strings. Must be same as were specified in trace_add().
384+ cbname is the name of the callback returned from trace_add().
385+ """
386+ self ._tk .call ('trace' , 'remove' , 'variable' ,
387+ self ._name , mode , cbname )
388+ for m , ca in self .trace_info ():
389+ if self ._tk .splitlist (ca )[0 ] == cbname :
390+ break
391+ else :
392+ self ._tk .deletecommand (cbname )
393+ try :
394+ self ._tclCommands .remove (cbname )
395+ except ValueError :
396+ pass
397+
398+ def trace_info (self ):
399+ """Return all trace callback information."""
400+ splitlist = self ._tk .splitlist
401+ return [(splitlist (k ), v ) for k , v in map (splitlist ,
402+ splitlist (self ._tk .call ('trace' , 'info' , 'variable' , self ._name )))]
403+
404+ def trace_variable (self , mode , callback ):
405+ """Define a trace callback for the variable.
406+
407+ MODE is one of "r", "w", "u" for read, write, undefine.
408+ CALLBACK must be a function which is called when
409+ the variable is read, written or undefined.
410+
411+ Return the name of the callback.
412+
413+ This deprecated method wraps a deprecated Tcl method that will
414+ likely be removed in the future. Use trace_add() instead.
415+ """
416+ # TODO: Add deprecation warning
417+ cbname = self ._register (callback )
369418 self ._tk .call ("trace" , "variable" , self ._name , mode , cbname )
370419 return cbname
420+
371421 trace = trace_variable
422+
372423 def trace_vdelete (self , mode , cbname ):
373424 """Delete the trace callback for a variable.
374425
375426 MODE is one of "r", "w", "u" for read, write, undefine.
376427 CBNAME is the name of the callback returned from trace_variable or trace.
428+
429+ This deprecated method wraps a deprecated Tcl method that will
430+ likely be removed in the future. Use trace_remove() instead.
377431 """
432+ # TODO: Add deprecation warning
378433 self ._tk .call ("trace" , "vdelete" , self ._name , mode , cbname )
379- self ._tk .deletecommand (cbname )
380- try :
381- self ._tclCommands .remove (cbname )
382- except ValueError :
383- pass
434+ cbname = self ._tk .splitlist (cbname )[0 ]
435+ for m , ca in self .trace_info ():
436+ if self ._tk .splitlist (ca )[0 ] == cbname :
437+ break
438+ else :
439+ self ._tk .deletecommand (cbname )
440+ try :
441+ self ._tclCommands .remove (cbname )
442+ except ValueError :
443+ pass
444+
384445 def trace_vinfo (self ):
385- """Return all trace callback information."""
446+ """Return all trace callback information.
447+
448+ This deprecated method wraps a deprecated Tcl method that will
449+ likely be removed in the future. Use trace_info() instead.
450+ """
451+ # TODO: Add deprecation warning
386452 return [self ._tk .splitlist (x ) for x in self ._tk .splitlist (
387453 self ._tk .call ("trace" , "vinfo" , self ._name ))]
454+
388455 def __eq__ (self , other ):
389456 """Comparison for equality (==).
390457
0 commit comments