Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are the arguments to Tkinter variable trace method callbacks?

Tags:

Python has classes for Tkinter variables StringVar(), BooleanVar(), etc. These all share the methods get(), set(string), and trace(mode, callback). The callback function passed as the second argument to trace(mode, callback) is passed four arguments, self, n, m, x.

For an example of a BooleanVar() these appear to be '', 'PYVAR0', 'w'.

The third argument x appears to be the mode that triggered the trace, in my case the variable was changed. However, what is the first variable that appears to be an empty string? What is the second, if I had to guess I'd say some internal name for the variable?

like image 665
ToothlessRebel Avatar asked Apr 17 '15 04:04

ToothlessRebel


2 Answers

The first argument is the internal variable name. You can use this name as an argument to the tkinter getvar and setvar methods. If you give your variable a name (eg: StringVar(name='foo')) this will be the given name, otherwise it will be a name generated for you by tkinter (eg: PYVAR0)

If the first argument represents a list variable (highly unlikely in tkinter), the second argument will be an index into that list. If it is a scalar variable, the second argument will be the empty string.

The third argument is the operation, useful if you are using the same method for reading, writing and/or deleting the variable. This argument tells you which operation triggered the callback. It will be one of "read", "write", or "unset".

Tkinter is a python wrapper around a tcl/tk interpreter. The definitive documentation for variable traces can be found here: http://tcl.tk/man/tcl8.5/TclCmd/trace.htm#M14. Though, this only documents how the internal trace works, the tkinter wrapper sometimes massages the data.

like image 98
Bryan Oakley Avatar answered Sep 28 '22 03:09

Bryan Oakley


The first argument is the name of the variable, but is not "useless" since you can set it when you declare the variable, e.g.:

someVar = IntVar(name="Name of someVar") 

When you check the first argument in the trace callback it will equal "Name of someVar". Using the name to distinguish between variables, you can then bind the same handler to trace changes to any number of variables, rather than needing a separate handler for each variable.

like image 21
Keith Caulfield Avatar answered Sep 28 '22 03:09

Keith Caulfield