Глава 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()— это превращает возможный крах программы в понятное сообщение для пользователя.