Каковы аргументы для обратных вызовов метода трассировки переменной Tkinter?

Python имеет классы для переменных Tkinter StringVar(), BooleanVar() и т.д. Все они используют методы get(), set(string) и trace(mode, callback). Функция callback, переданная как второй аргумент trace(mode, callback), передается по четырем аргументам, self, n, m, x.

Для примера BooleanVar() они выглядят как '', 'PYVAR0', 'w'.

Третий аргумент x представляется режимом, который вызвал трассировку, в моем случае переменная была изменена. Однако какова первая переменная, представляющая собой пустую строку? Что второе, если я должен был догадаться, что я бы назвал внутреннее имя переменной?

Ответ 1

Первый аргумент - это имя внутренней переменной. Более или менее бесполезный в контексте tkinter, но чрезвычайно полезный для базового интерпретатора tcl.

Если первый аргумент представляет собой переменную списка (маловероятно в tkinter), второй аргумент будет индексом в этом списке. Если это переменная масштабирования, второй аргумент будет пустой строкой.

Третий аргумент - это операция, полезная, если вы используете тот же метод для чтения, записи и/или удаления переменной. Этот аргумент указывает, какая операция вызвала обратный вызов. Это будет "w" для операции записи (установка переменной) и "r" для операции чтения (получение значения переменной). Это будет "u", если переменная будет удалена ( "u" является коротким для "unset" )

Tkinter - это оболочка python вокруг интерпретатора tcl/tk. Окончательную документацию для переменных трасс можно найти здесь: http://tcl.tk/man/tcl8.5/TclCmd/trace.htm#M14. Хотя, это только документы, как работает внутренняя трассировка, обертка tkinter иногда массирует данные.

Ответ 2

Первый аргумент - это имя переменной, но не "бесполезно", поскольку вы можете установить его при объявлении переменной, например:

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

Когда вы проверяете первый аргумент в обратном вызове трассировки, он будет равен "Name of someVar". Используя имя для различения переменных, вы можете привязать один и тот же обработчик для отслеживания изменений к любому числу переменных, а не для использования отдельного обработчика для каждой переменной.