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:
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")
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:
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
Dodaj przycisk „Zapisz jako”
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.
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.