Rozdział 23 · Aneks

Aplikacja Notes F: projekt domowy

pliki i Tkinter razem, ale czytanie i zapisywanie są przenoszone do funkcji, które nie mają pojęcia o interfejsie.

Ostatni Projekt Home łączy pliki (rozdział 15) i aplikację Tkinter: Notes z polem tekstowym oraz przyciskami Zapisz, Wczytaj, Wyczyść. Praca z plikiem jest przenoszona do Niektóre funkcje, które w ogóle nie wiedzą o istnieniu Tkinter:

notes_app.py
def sohranit_v_fajl(put: Path, tekst: str) -> None:
    put.write_text(tekst, encoding="utf-8")

def zagruzit_iz_fajla(put: Path) -> str:
    if not put.exists():
        raise FileNotFoundError(put)
    return put.read_text(encoding="utf-8")
Funkcje plikowe bez Tkinter — łatwo to sprawdzić testem
sohranit_v_fajl() oraz zagruzit_iz_fajla() zwykłe Path i nie odwołuje się do żadnego widżetu — test może je wywołać w katalogu tymczasowym pytest, bez jednego okna na ekranie.

Obsługa błędów i niezapisane zmiany

Warstwa interfejsu łapie konkretne wyjątki, a nie próbuje zgadywać, co poszło nie tak, — i ostrzega, jeśli spróbujemy załadować plik nad jeszcze niesionym tekstem:

notes_app.py
def zagruzit_zametku() -> None:
    if est_nesohranennye_izmeneniya.get():
        status_text.set(„Są niezapisane zmiany – najpierw zapisz lub wyczyść pole”)
        return
    try:
        tekst = zagruzit_iz_fajla(fajl_zametok)
    except FileNotFoundError:
        status_text.set(„Plik notatek jeszcze nie został utworzony — najpierw zapisz plik.”)
        return
    except (PermissionError, OSError) as oshibka:
        status_text.set(f"Nie udało się załadować: {oshibka}")
        return

Pełny kod: projects/tkinter/notes-app/notes_app.py

Quest

★★ Zadanie samodzielne
Zapisz pod inną nazwą

Dodaj przycisk „Zapisz jako”

GitHubPraktyka GitHub

Issue „Add notes app project” feat/notes, test dla zapisywanie i ładowanie przez plik tymczasowy (round-trip do UTF-8) oraz do FileNotFoundError jeśli jakiś plik jest nieobecny, Pull Request.

Praktyka: Zapisz, wczytaj i Brakujący plik
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →

Wyniki aplikacji

Co powtórzyliśmy na sześciu projektach

  • Bezpieczne przetwarzanie arytmetyki przez ast — zamiast eval(), nawet ograniczonego.
  • Sprawdzalna losowość: Generator random.Random jest przekazywany jawnie, a nie pobierany z globalnego stanu modułu random.
  • Tabela reguł zamiast łańcucha warunków — i pełna kontrola wszystkich możliwych kombinacji.
  • Ruch na delta time: prędkości w pikselach na sekundę, a nie w pikselach na klatkę.
  • Sprawdzenie ograniczeń fizycznych (temperatura nie może być niższa od zera absolutnego) — nie tylko formalny input-output liczb.
  • Operacje na plikach oddzielnie od interfejsu — ze konkretnym przetwarzaniem FileNotFoundError, PermissionError i OSError, a nie ogólnym except Exception.
  • Każdy projekt działa w tym samym procesie: SafeSort: Issue, Branch, Tests, Commit Pull Request.