Глава 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 содержит 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
Ни единой новой идеи о файлах
load_settings()/save_settings() не используют ничего, кроме того, что уже изучено в главе 15 — json, pathlib, безопасные значения по умолчанию. GUI просто вызывает эти функции при старте и перед закрытием.Практика: load_settings/save_settings для GUI
Проверяется без tkinter — переносим функции persistence главы 15