Глава 16 · Создаём классные приложения с Tkinter

Переменные Tkinter

Специальные переменные, которые сами обновляют связанные с ними виджеты на экране.

Обычные переменные Python не «знают», когда их значение используется в интерфейсе — связь с виджетом нужно устанавливать явно, каждый раз заново. Для случаев, когда несколько виджетов должны отражать одно и то же значение синхронно, Tkinter предлагает свои специальные переменные: StringVar, IntVar, BooleanVar, DoubleVar.

peremennye_tkinter.py
import tkinter as tk

root = tk.Tk()

imya = tk.StringVar(value="Гость")

label = tk.Label(root, textvariable=imya)   # метка сама обновится при смене imya
label.pack()

def smenit_imya():
    imya.set("Cartesian")

button = tk.Button(root, text="Сменить имя", command=smenit_imya)
button.pack()

root.mainloop()

Значение достают методом .get() и меняют методом .set() — а виджеты, связанные через textvariable (или variable у Radiobutton/Checkbutton), обновляются на экране автоматически.

imya : StringVar
значение = "Гость"
связаны через одну переменную
label (textvariable=imya)
Один StringVar может связывать сразу несколько виджетов — все они видят одно значение.
Tk-переменные не заменяют обычные переменные Python
StringVar и подобные — специальный инструмент именно для связи с виджетами, а не universal-замена всех переменных программы. Обычные int, str, list по-прежнему отлично подходят для хранения данных приложения, которые не отображаются напрямую в виджете.

Чуть глубже: trace_add

Можно реагировать на каждое изменение Tk-переменной:

trace_add.py
def pri_izmenenii(*args):
    print("Новое значение:", imya.get())

imya.trace_add("write", pri_izmenenii)

Это удобно для «реактивных» интерфейсов, но не обязательно на старте — большинство форм прекрасно обходятся обычным чтением значения по кнопке.

Практика: StringVar и связанные виджеты
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →