Rozdział 16 · Tworzenie fajnych aplikacji z Tkinter
Klasa aplikacji i ustawienia trwałe
Aplikacja jest także obiektem: z własnym stanem, widgetami atrybutów i metodami obsługi użytkownika.
klasa aplikacji to kompozycja, a nie dziedziczenie Tk
Bezpośrednie powiązanie z rozdziałem 14. Dla aplikacji bardziej skomplikowanych niż para widżetów wygodnie jest zebrać wszystko w jednej klasie:
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=„Czytaj”, command=self.on_calculate).pack()
def on_calculate(self):
...
root = tk.Tk()
app = TipCalculatorApp(root)
root.mainloop()
App zawiera root, a nie dziedziczy po Tk
class App: z self.root = root jest głównym modelem tego kursu: zależność od Tk jest wyraźnie widoczna w konstruktorze. Dziedziczenie class App(tk.Tk): jest również możliwe i występuje w praktyce, ale tutaj łatwiej zrozumieć skład, a nie "błędny" kontra "właściwy".Nie każdy widget jest atrybutem self
Zapisz do
self.виджет tylko to, do czego potrzebujesz uzyskać dostęp później z innej metody (pole wejściowe, etykieta wyniku). Tymczasowe widgety utworzone i umieszczone w jednym miejscu mogą pozostać jako zmienne lokalne build_ui().Ustawienia trwałe – Przejdź do rozdziału 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
kiedy aplikacja się uruchamia
↓load_settings()
↓
TipCalculatorApp(root, settings)
↓
użytkownik zmienia ustawienia
save_settings() przed zamknięciem
↓nastroyki.json
Ani jednej nowej idei dotyczącej plików
load_settings()/save_settings() korzystać z niczego poza tym, czego już się nauczyliśmy w rozdziale 15 — json, pathlib, bezpieczne domyślne ustawienia. GUI po prostu nazywa te funkcje przy starcie i przed zamknięciem.Praktyka: load_settings/save_settings dla GUI
Sprawdza się bez tkinter — przenosimy funkcje persistence rozdziału 15