{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f6407a4e",
   "metadata": {},
   "source": [
    "# 16-19 · filedialog и pathlib\n",
    "\n",
    "Практика к разделу [«Открываем и сохраняем файлы: filedialog и pathlib»](../../site/chapters/glava-16/16-19-filedialog-i-pathlib.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "249885ea",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Правильно обработать отмену диалога перед работой с путём."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7fbf159",
   "metadata": {},
   "source": [
    "## Про mainloop() в этом ноутбуке\n",
    "\n",
    "В обычном `.py`-файле приложение запускают через `root.mainloop()` — эта команда «замирает» и ждёт, пока пользователь не закроет окно. В автоматически выполняемом ноутбуке нет живого пользователя за окном, поэтому здесь вместо `root.mainloop()` мы вызовем `root.update()` (обрабатывает события один раз, без ожидания) и затем `root.destroy()` — интерфейс строится точно так же, просто без бесконечного ожидания в конце."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9fa86779",
   "metadata": {},
   "source": [
    "## Про filedialog в этом ноутбуке\n",
    "\n",
    "Диалог выбора файла ждёт живого пользователя. В автоматически выполняемом ноутбуке нужные функции `filedialog` временно подменены заранее заготовленными ответами."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9af9f865",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-18T21:45:16.682897Z",
     "iopub.status.busy": "2026-08-18T21:45:16.682791Z",
     "iopub.status.idle": "2026-08-18T21:45:16.746284Z",
     "shell.execute_reply": "2026-08-18T21:45:16.745728Z"
    }
   },
   "outputs": [],
   "source": [
    "from tkinter import filedialog\n",
    "\n",
    "filedialog.askopenfilename = lambda *args, **kwargs: ''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "83ae39a3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-18T21:45:16.747441Z",
     "iopub.status.busy": "2026-08-18T21:45:16.747302Z",
     "iopub.status.idle": "2026-08-18T21:45:16.750526Z",
     "shell.execute_reply": "2026-08-18T21:45:16.750009Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отмена обработана корректно: True\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "\n",
    "filename = filedialog.askopenfilename()\n",
    "if not filename:\n",
    "    otmena_obrabotana = True\n",
    "else:\n",
    "    otmena_obrabotana = False\n",
    "    Path(filename).read_text(encoding=\"utf-8\")\n",
    "\n",
    "print(\"Отмена обработана корректно:\", otmena_obrabotana)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90769c38",
   "metadata": {},
   "source": [
    "## Задание ★ Базовая практика — успешный выбор файла"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d10b2cb",
   "metadata": {},
   "source": [
    "## Про filedialog в этом ноутбуке\n",
    "\n",
    "Диалог выбора файла ждёт живого пользователя. В автоматически выполняемом ноутбуке нужные функции `filedialog` временно подменены заранее заготовленными ответами."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a2621410",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-18T21:45:16.753338Z",
     "iopub.status.busy": "2026-08-18T21:45:16.753216Z",
     "iopub.status.idle": "2026-08-18T21:45:16.756455Z",
     "shell.execute_reply": "2026-08-18T21:45:16.755572Z"
    }
   },
   "outputs": [],
   "source": [
    "from tkinter import filedialog\n",
    "\n",
    "filedialog.askopenfilename = lambda *args, **kwargs: 'privet_gui.txt'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cb7ea77a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-18T21:45:16.757751Z",
     "iopub.status.busy": "2026-08-18T21:45:16.757620Z",
     "iopub.status.idle": "2026-08-18T21:45:16.760565Z",
     "shell.execute_reply": "2026-08-18T21:45:16.760068Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Привет из GUI!\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "\n",
    "Path(\"privet_gui.txt\").write_text(\"Привет из GUI!\", encoding=\"utf-8\")\n",
    "\n",
    "filename = filedialog.askopenfilename()\n",
    "if filename:\n",
    "    text = Path(filename).read_text(encoding=\"utf-8\")\n",
    "print(text)"
   ]
  }
 ],
 "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
}
