Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Аргументы колбэка trace() переменной Tkinter

Метод 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 — будьте осторожны с бесконечными циклами.