Метод trace() переменной Tkinter (StringVar, IntVar и др.) позволяет отслеживать изменения значения. Колбэк получает три аргумента: name (имя переменной), index (индекс) и mode (режим: 'r' - чтение, 'w' - запись, 'u' - удаление).
Пример кода
from tkinter import *
win = Tk()
win.geometry("750x250")
my_variable = StringVar()
def trace_callback(var_name, index, mode):
print(f"Variable: {var_name}, Index: {index}, Mode: {mode}")
print(f"Value: {my_variable.get()}")
my_variable.trace_add("write", trace_callback)
Label(win, textvariable=my_variable).pack(padx=5, pady=5)
Entry(win, textvariable=my_variable, width=20).pack(ipadx=20, padx=5, pady=5)
win.mainloop()
Вывод в консоль при вводе "Hello World"
Variable: PY_VAR0, Index: , Mode: write
Value: H
Variable: PY_VAR0, Index: , Mode: write
Value: He
Variable: PY_VAR0, Index: , Mode: write
Value: Hel
Variable: PY_VAR0, Index: , Mode: write
Value: Hell
Variable: PY_VAR0, Index: , Mode: write
Value: Hello
Variable: PY_VAR0, Index: , Mode: write
Value: Hello
Variable: PY_VAR0, Index: , Mode: write
Value: Hello W
Variable: PY_VAR0, Index: , Mode: write
Value: Hello Wo
Variable: PY_VAR0, Index: , Mode: write
Value: Hello Wor
Variable: PY_VAR0, Index: , Mode: write
Value: Hello Worl
Variable: PY_VAR0, Index: , Mode: write
Value: Hello World
Режимы trace (mode)
| Режим | Описание |
|---|---|
'r' (read) | Переменная читается (например, через .get()) |
'w' (write) | Значение переменной меняется |
'u' (unset) | Переменная удаляется |
trace_add() vs trace_variable()
trace_variable(mode, callback)- старый API (deprecated)trace_add(mode, callback)- новый API (Python 3.6+), рекомендуетсяtrace_remove(name, callback)- удалить trace
Практическое применение
# Валидация ввода в реальном времени
def validate_input(var_name, index, mode):
value = my_var.get()
if not value.isdigit() and value != "":
my_var.set(value[:-1]) # Удалить последний недопустимый символ
my_var = StringVar()
my_var.trace_add("write", validate_input)
Entry(win, textvariable=my_var).pack()
# Автосохранение
def auto_save(var_name, index, mode):
save_to_config(my_var.get())
config_var = StringVar()
config_var.trace_add("write", auto_save)
Важное замечание
Колбэк trace вызывается после изменения значения. Если вы меняете значение внутри колбэка (как в валидации), это вызовет еще один вызов trace — будьте осторожны с бесконечными циклами.