{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fd36aced",
   "metadata": {},
   "source": [
    "# 23-06 · Файлы и Tkinter\n",
    "\n",
    "Практика к разделу [«Проект 23-6: Знакомство с файлами и Tkinter»](../../site/chapters/glava-23/23-06-fajly-tkinter-itogi.html). Полный файл — `projects/tkinter/notes-app/notes_app.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf0f4250",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Проверить сохранение и загрузку заметки, а также поведение при отсутствии сохранённого файла."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a119bdc",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c1b6f549",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:50.995977Z",
     "iopub.status.busy": "2026-08-14T20:59:50.995867Z",
     "iopub.status.idle": "2026-08-14T20:59:51.145982Z",
     "shell.execute_reply": "2026-08-14T20:59:51.145506Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Файл заметки ещё не создан — сначала сохраните.\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "\n",
    "sys.path.insert(0, \"../../projects/tkinter/notes-app\")\n",
    "import notes_app as na\n",
    "\n",
    "if na.FAJL_ZAMETOK.exists():\n",
    "    na.FAJL_ZAMETOK.unlink()\n",
    "\n",
    "na.zagruzit_zametku()\n",
    "print(na.status_text.get())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a18a0396",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "496ad73b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:51.147012Z",
     "iopub.status.busy": "2026-08-14T20:59:51.146875Z",
     "iopub.status.idle": "2026-08-14T20:59:51.149160Z",
     "shell.execute_reply": "2026-08-14T20:59:51.148729Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: попытка загрузки без сохранённого файла даёт понятное сообщение, а не падение.\n"
     ]
    }
   ],
   "source": [
    "assert \"ещё не создан\" in na.status_text.get()\n",
    "print(\"Верно: попытка загрузки без сохранённого файла даёт понятное сообщение, а не падение.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53c11648",
   "metadata": {},
   "source": [
    "## Эксперимент — сохраняем и загружаем заметку"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1c9be8d5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:51.150152Z",
     "iopub.status.busy": "2026-08-14T20:59:51.149986Z",
     "iopub.status.idle": "2026-08-14T20:59:51.153118Z",
     "shell.execute_reply": "2026-08-14T20:59:51.152709Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: сохранение записывает содержимое поля в файл.\n",
      "Верно: после очистки поля загрузка восстанавливает текст из файла.\n"
     ]
    }
   ],
   "source": [
    "na.polye_teksta.insert(\"1.0\", \"Купить молоко\\nПозвонить маме\")\n",
    "na.sohranit_zametku()\n",
    "\n",
    "assert na.FAJL_ZAMETOK.exists()\n",
    "assert na.FAJL_ZAMETOK.read_text(encoding=\"utf-8\") == \"Купить молоко\\nПозвонить маме\"\n",
    "print(\"Верно: сохранение записывает содержимое поля в файл.\")\n",
    "\n",
    "na.ochistit_polye()\n",
    "assert na.polye_teksta.get(\"1.0\", \"end-1c\") == \"\"\n",
    "\n",
    "na.zagruzit_zametku()\n",
    "assert na.polye_teksta.get(\"1.0\", \"end-1c\") == \"Купить молоко\\nПозвонить маме\"\n",
    "print(\"Верно: после очистки поля загрузка восстанавливает текст из файла.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1627ddf5",
   "metadata": {},
   "source": [
    "## Задание ★ Базовая практика\n",
    "\n",
    "Уберите тестовый файл заметки, чтобы не засорять репозиторий, и убедитесь, что он действительно удалён."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "60434101",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:51.154257Z",
     "iopub.status.busy": "2026-08-14T20:59:51.154146Z",
     "iopub.status.idle": "2026-08-14T20:59:51.156409Z",
     "shell.execute_reply": "2026-08-14T20:59:51.156032Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: тестовый файл заметки удалён.\n"
     ]
    }
   ],
   "source": [
    "na.FAJL_ZAMETOK.unlink()\n",
    "assert not na.FAJL_ZAMETOK.exists()\n",
    "print(\"Верно: тестовый файл заметки удалён.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
