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 : TipCalculatorApproot = Tkamount_var = StringVarresult_var = StringVar
Graf obiektów aplikacji: App HAS-A root, nie App IS-A Tk.
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 jedna linijka o JSON i plikach nie jest nowa – wszystko już było w rozdziale 15.
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
Otwórz praktykę →