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

Класс приложения и персистентные настройки

Приложение — тоже объект: со своим состоянием, виджетами-атрибутами и методами-обработчиками.

Класс приложения — композиция, а не наследование Tk

Прямая связь с главой 14. Для приложений сложнее пары виджетов удобно собрать всё в один класс:

klass_prilozheniya.py
class TipCalculatorApp:
    def __init__(self, root):
        self.root = root
        self.amount_var = tk.StringVar()
        self.build_ui()

    def build_ui(self):
        ttk.Entry(self.root, textvariable=self.amount_var).pack()
        ttk.Button(self.root, text="Считать", command=self.on_calculate).pack()

    def on_calculate(self):
        ...

root = tk.Tk()
app = TipCalculatorApp(root)
root.mainloop()
app : TipCalculatorApproot = Tkamount_var = StringVarresult_var = StringVar
Объектный граф приложения: App HAS-A root, а не App IS-A Tk.
App содержит root, а не наследует от Tk
class App: с self.root = root — основная модель этого курса: зависимость от Tk видна явно в конструкторе. Наследование class App(tk.Tk): тоже возможно и встречается на практике — но композиция здесь проще для рассуждений, не «неправильный» вариант против «правильного».
Не каждый виджет — атрибут self
Сохраняйте в self.виджет только то, к чему понадобится обратиться позже из другого метода (поле ввода, метка результата). Временные виджеты, созданные и размещённые в одном месте, можно оставить локальными переменными build_ui().

Персистентные настройки — мост к главе 15

nastroyki_gui.py
import json
from pathlib import Path

DEFAULT_SETTINGS = {"theme": "light", "window_width": 900}

def load_settings(path):
    if not path.exists():
        return dict(DEFAULT_SETTINGS)
    with path.open("r", encoding="utf-8") as f:
        return json.load(f)

def save_settings(path, settings):
    with path.open("w", encoding="utf-8") as f:
        json.dump(settings, f, ensure_ascii=False, indent=2)
nastroyki.json
при старте приложения
load_settings()
TipCalculatorApp(root, settings)
пользователь меняет настройку
save_settings() перед закрытием
nastroyki.json
Ни одна строчка про JSON и файлы не нова — всё уже было в главе 15.
Ни единой новой идеи о файлах
load_settings()/save_settings() не используют ничего, кроме того, что уже изучено в главе 15 — json, pathlib, безопасные значения по умолчанию. GUI просто вызывает эти функции при старте и перед закрытием.
Практика: load_settings/save_settings для GUI
Проверяется без tkinter — переносим функции persistence главы 15
Открыть практику →