Глава 23 · Ещё больше мини-проектов

Проект 23-6: Знакомство с файлами и Tkinter

Простое приложение «Заметки» — и подведение итогов главы.

Проект 23-6: Знакомство с файлами и Tkinter

Последний мини-проект главы объединяет файлы (глава 14) и Tkinter (главы 16-19): простое приложение «Заметки» с текстовым полем и тремя кнопками — сохранить, загрузить, очистить:

sohranenie_zagruzka.py
FAJL_ZAMETOK = Path(__file__).parent / "zametka.txt"

def sohranit_zametku():
    tekst = polye_teksta.get("1.0", "end-1c")
    FAJL_ZAMETOK.write_text(tekst, encoding="utf-8")
    status_text.set(f"Сохранено в {FAJL_ZAMETOK.name}")

def zagruzit_zametku():
    if not FAJL_ZAMETOK.exists():
        status_text.set("Файл заметки ещё не создан — сначала сохраните.")
        return
    tekst = FAJL_ZAMETOK.read_text(encoding="utf-8")
    polye_teksta.delete("1.0", "end")
    polye_teksta.insert("1.0", tekst)
"1.0" и "end-1c" — адресация текста в Text
У виджета Text (в отличие от Entry) текст адресуется парой «строка.столбец»: "1.0" — самое начало (строка 1, столбец 0), "end-1c" — конец текста без завершающего невидимого перевода строки, который Tkinter добавляет сам.
Проверка exists() перед чтением
Если попытаться прочитать несуществующий файл через read_text(), программа упадёт с FileNotFoundError. Проверка if not FAJL_ZAMETOK.exists(): превращает падение программы в понятное сообщение для пользователя.

Полный код: 📄 projects/tkinter/notes-app/notes_app.py

★★ Самостоятельная задача
Предупреждение о несохранённых изменениях

Заведите переменную byli_izmeneniya = False, ставьте её в True при любом изменении текста и показывайте предупреждение при попытке «Очистить поле», если она True.

Практика в Jupyter Notebook
23-06-fajly-tkinter.ipynb · сохранение, загрузка и обработка отсутствующего файла
Открыть ноутбук →

Итоги

Что мы узнали в этой главе

  • Шесть небольших проектов показывают, как уже знакомые инструменты — Tkinter, Pygame, файлы, классы, словари — снова и снова складываются в новые приложения.
  • Безопасный eval() с проверкой символов и пустым __builtins__ позволяет вычислять арифметические выражения, не рискуя выполнить произвольный код.
  • Словарь — отличный способ описать отношения между вариантами (кто кого побеждает, что во что переводится), избегая длинных цепочек if/elif.
  • Класс превращает набор связанных переменных (позиция, скорость, цвет мяча) в один объект — и сразу же позволяет завести их сколько угодно через список.
  • Перед чтением файла стоит проверять Path.exists() — это превращает возможный крах программы в понятное сообщение для пользователя.