Документация Python неофициальный перевод

tkinter.md

691 строк · 55.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.9/library/tkinter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) – интерфейс Python к Tcl/Tk89**Исходный код:** [Lib/tkinter/\_\_init\_\_.py](https://python-all.ru/src/3.9/Lib/tkinter/__init__.py)1011---1213Пакет [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) («Tk interface») – это стандартный интерфейс Python к набору инструментов GUI Tcl/Tk. Как Tk, так и [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) доступны на большинстве Unix-платформ, включая macOS, а также в Windows.1415Запуск `python -m tkinter` из командной строки должен открыть окно, демонстрирующее простой интерфейс Tk, показывая, что [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) корректно установлен в системе, а также отображая версию Tcl/Tk, чтобы можно было прочитать документацию Tcl/Tk, соответствующую этой версии.1617> **См. также**18>19> - **[TkDocs](https://python-all.ru/3.9/library/tkinter.html)**20>21>   Обширное руководство по созданию пользовательских интерфейсов с помощью Tkinter. Объясняет ключевые концепции и иллюстрирует рекомендуемые подходы с использованием современного API.22> - **[Справочник по Tkinter 8.5: GUI для Python](https://python-all.ru/3.9/library/tkinter.html)**23>24>   Справочная документация по Tkinter 8.5 с подробным описанием доступных классов, методов и опций.25>26> Ресурсы по Tcl/Tk:27>28> - **[Команды Tk](https://python-all.ru/3.9/library/tkinter.html)**29>30>   Исчерпывающий справочник по каждой из базовых команд Tcl/Tk, используемых Tkinter.31> - **[Домашняя страница Tcl/Tk](https://python-all.ru/3.9/library/tkinter.html)**32>33>   Дополнительная документация и ссылки на разработку ядра Tcl/Tk.34>35> Книги:36>37> - **[Современный Tkinter для занятых разработчиков Python](https://python-all.ru/3.9/library/tkinter.html)**38>39>   Автор: Mark Roseman. (ISBN 978-1999149567)40> - **[Python and Tkinter Programming](https://python-all.ru/3.9/library/tkinter.html)**41>42>   By Alan Moore. (ISBN 978-1788835886)43> - **[Программирование на Python](https://python-all.ru/3.9/library/tkinter.html)**44>45>   Автор: Mark Lutz; отличное освещение Tkinter. (ISBN 978-0596158101)46> - **[Tcl и инструментарий Tk (2-е издание)](https://python-all.ru/3.9/library/tkinter.html)**47>48>   Авторы: John Ousterhout, изобретатель Tcl/Tk, и Ken Jones; Tkinter не рассматривается. (ISBN 978-0321336330)4950## Модули Tkinter5152Поддержка Tkinter распределена по нескольким модулям. Большинству приложений понадобится основной модуль [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter), а также модуль [`tkinter.ttk`](https://python-all.ru/3.9/library/tkinter.ttk.html#module-tkinter.ttk), предоставляющий современный набор тематических виджетов и API:5354```python55from tkinter import *56from tkinter import ttk57```5859#### `class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)`6061Создаёт виджет верхнего уровня Tk, который обычно является главным окном приложения, и инициализирует интерпретатор Tcl для этого виджета. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.6263Класс [`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk) обычно создаётся со значениями по умолчанию. Однако в настоящее время распознаются следующие именованные аргументы:6465***screenName***6667При указании (в виде строки) устанавливает переменную окружения `DISPLAY`. (только X11)6869***baseName***7071Имя файла профиля. По умолчанию *baseName* берётся из имени программы (`sys.argv[0]`).7273***className***7475Имя класса виджета. Используется как файл профиля, а также как имя, с которым вызывается Tcl (*argv0* в *interp*).7677***useTk***7879Если `True`, инициализировать подсистему Tk. Функция [`tkinter.Tcl()`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tcl) устанавливает это в `False`.8081***sync***8283Если `True`, выполнять все команды X-сервера синхронно, чтобы ошибки сообщались немедленно. Может использоваться для отладки. (только X11)8485***use***8687Задаёт *id* окна, в которое встраивается приложение, вместо того чтобы создавать его как независимое окно верхнего уровня. *id* должен быть указан так же, как значение опции -use для виджетов верхнего уровня (то есть иметь форму, подобную возвращаемой `winfo_id()`).8889Обратите внимание, что на некоторых платформах это будет работать корректно только если *id* ссылается на Tk-фрейм или окно верхнего уровня, у которых включена опция -container.9091[`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk) читает и интерпретирует файлы профилей с именами `.className.tcl` и `.baseName.tcl` в интерпретатор Tcl и вызывает [`exec()`](https://python-all.ru/3.9/library/functions.html#exec) для содержимого `.className.py` и `.baseName.py`. Путь к файлам профилей задаётся переменной окружения `HOME` или, если она не определена, то [`os.curdir`](https://python-all.ru/3.9/library/os.html#os.curdir).9293#### `tk`9495Объект приложения Tk, созданный созданием экземпляра [`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk). Он предоставляет доступ к интерпретатору Tcl. Каждый виджет, прикреплённый к тому же экземпляру [`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk), имеет одинаковое значение для своего атрибута [`tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk.tk).9697#### `master`9899Объект виджета, который содержит данный виджет. Для [`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk) атрибут *master* равен [`None`](https://python-all.ru/3.9/library/constants.html#None), поскольку это главное окно. Термины *master* и *parent* похожи и иногда используются как взаимозаменяемые имена аргументов; однако вызов `winfo_parent()` возвращает строку с именем виджета, тогда как [`master`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk.master) возвращает объект. *parent*/*child* отражает древовидное отношение, а *master*/*slave* – структуру контейнера.100101#### `children`102103Непосредственные потомки этого виджета в виде [`dict`](https://python-all.ru/3.9/library/stdtypes.html#dict) с именами дочерних виджетов в качестве ключей и объектами экземпляров потомков в качестве значений.104105#### `tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)`106107Функция [`Tcl()`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tcl) является фабричной функцией, которая создаёт объект, очень похожий на создаваемый классом [`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk), за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при управлении интерпретатором Tcl в среде, где не требуется создавать лишние окна верхнего уровня, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный объектом [`Tcl()`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tcl), может создать окно верхнего уровня (и инициализировать подсистему Tk) с помощью вызова его метода `loadtk()`.108109Модули, обеспечивающие поддержку Tk, включают:110111**[`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter)**112113Основной модуль Tkinter.114115**[`tkinter.colorchooser`](https://python-all.ru/3.9/library/tkinter.colorchooser.html#module-tkinter.colorchooser)**116117Диалоговое окно для выбора цвета пользователем.118119**[`tkinter.commondialog`](https://python-all.ru/3.9/library/dialog.html#module-tkinter.commondialog)**120121Базовый класс для диалогов, определённых в других перечисленных здесь модулях.122123**[`tkinter.filedialog`](https://python-all.ru/3.9/library/dialog.html#module-tkinter.filedialog)**124125Стандартные диалоги для указания файла для открытия или сохранения.126127**[`tkinter.font`](https://python-all.ru/3.9/library/tkinter.font.html#module-tkinter.font)**128129Утилиты для работы со шрифтами.130131**[`tkinter.messagebox`](https://python-all.ru/3.9/library/tkinter.messagebox.html#module-tkinter.messagebox)**132133Доступ к стандартным диалоговым окнам Tk.134135**[`tkinter.scrolledtext`](https://python-all.ru/3.9/library/tkinter.scrolledtext.html#module-tkinter.scrolledtext)**136137Текстовый виджет со встроенной вертикальной полосой прокрутки.138139**[`tkinter.simpledialog`](https://python-all.ru/3.9/library/dialog.html#module-tkinter.simpledialog)**140141Базовые диалоги и вспомогательные функции.142143**[`tkinter.ttk`](https://python-all.ru/3.9/library/tkinter.ttk.html#module-tkinter.ttk)**144145Набор тематических виджетов, представленный в Tk 8.5, предоставляющий современные альтернативы многим классическим виджетам из основного модуля [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter).146147Дополнительные модули:148149**`_tkinter`**150151Двоичный модуль, содержащий низкоуровневый интерфейс к Tcl/Tk. Он автоматически импортируется основным модулем [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) и никогда не должен использоваться напрямую программистами приложений. Обычно это разделяемая библиотека (или DLL), но в некоторых случаях может быть статически слинкована с интерпретатором Python.152153**`idlelib`**154155Интегрированная среда разработки и обучения Python (IDLE). Основана на [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter).156157**`tkinter.constants`**158159Символические константы, которые можно использовать вместо строк при передаче различных параметров вызовам Tkinter. Автоматически импортируются основным модулем [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter).160161**[`tkinter.dnd`](https://python-all.ru/3.9/library/tkinter.dnd.html#module-tkinter.dnd)**162163(экспериментально) Поддержка перетаскивания для [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter). Станет устаревшим, когда будет заменён на Tk DND.164165**[`tkinter.tix`](https://python-all.ru/3.9/library/tkinter.tix.html#module-tkinter.tix)**166167(Устарело) Старый сторонний пакет Tcl/Tk, который добавляет несколько новых виджетов. Лучшие альтернативы для большинства из них можно найти в [`tkinter.ttk`](https://python-all.ru/3.9/library/tkinter.ttk.html#module-tkinter.ttk).168169**[`turtle`](https://python-all.ru/3.9/library/turtle.html#module-turtle)**170171Черепашья графика в окне Tk.172173## Спасательный круг Tkinter174175Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.176177Благодарности:178179- Tk был написан Джоном Аустерхутом во время его работы в Беркли.180- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.181- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.182- HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.183- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.184- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.185186### Как использовать этот раздел187188Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.189190При попытке ответить на вопросы типа «как мне сделать то-то», часто лучше всего выяснить, как сделать это «то-то» на чистом Tk, а затем преобразовать это в соответствующий вызов [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter). Программисты на Python часто могут угадать правильную команду Python, взглянув на документацию Tk. Это означает, что для использования Tkinter придётся немного знать Tk. Данный документ не может выполнить эту роль, поэтому лучшее, что можно сделать – указать на лучшую существующую документацию. Вот несколько советов:191192- Авторы настоятельно рекомендуют приобрести копию страниц руководства Tk (man pages). В частности, наиболее полезны страницы руководства в каталоге `manN`. Страницы руководства `man3` описывают интерфейс C к библиотеке Tk и поэтому не особенно полезны для разработчиков скриптов.193- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.194- `tkinter/__init__.py` является последним средством для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.195196### Простая программа Hello World197198```python199import tkinter as tk200201class Application(tk.Frame):202    def __init__(self, master=None):203        super().__init__(master)204        self.master = master205        self.pack()206        self.create_widgets()207208    def create_widgets(self):209        self.hi_there = tk.Button(self)210        self.hi_there["text"] = "Hello World\n(click me)"211        self.hi_there["command"] = self.say_hi212        self.hi_there.pack(side="top")213214        self.quit = tk.Button(self, text="QUIT", fg="red",215                              command=self.master.destroy)216        self.quit.pack(side="bottom")217218    def say_hi(self):219        print("hi there, everyone!")220221root = tk.Tk()222app = Application(master=root)223app.mainloop()224```225226## Краткий (очень) обзор Tcl/Tk227228Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.229230Примечания:231232- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.233- Класс [`Tk`](https://python-all.ru/3.9/library/tkinter.html#tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно – система создаёт его всякий раз, когда создаётся экземпляр любого из других классов.234- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов с целью создания «настоящих» виджетов (в C++ это называется «абстрактный класс»).235236Чтобы воспользоваться этим справочным материалом, иногда потребуется уметь читать короткие фрагменты Tk и распознавать различные части команды Tk. (Смотрите раздел [Отображение базового Tk в Tkinter](https://python-all.ru/3.9/library/tkinter.html#tkinter-basic-mapping) для [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) эквивалентов того, что описано ниже.)237238Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.239240Чтобы создать виджет в Tk, команда всегда имеет следующий вид:241242```python243classCommand newPathname options244```245246***classCommand***247248Обозначает тип создаваемого виджета (кнопка, метка, меню…).249250***newPathname***251252– это новое имя для данного виджета. Все имена в Tk должны быть уникальными. Чтобы обеспечить это, виджеты в Tk именуются с помощью *путевых имён*, как файлы в файловой системе. Виджет верхнего уровня, *корень*, называется `.` (точка), а дочерние элементы разделяются дополнительными точками. Например, `.myApp.controlPanel.okButton` может быть именем виджета.253254***options***255256Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.257258Например:259260```python261button   .fred   -fg red -text "hi there"262   ^       ^     \______________________/263   |       |                |264 class    new            options265command  widget  (-opt val -opt val ...)266```267268После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:269270```python271.fred someAction someOptions272```273274Обратите внимание, что имя объекта `.fred` начинается с точки.275276Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).277278Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие, например команда `delete` поля ввода текста, нуждаются в аргументах для указания диапазона удаляемого текста.279280## Отображение базового Tk в Tkinter281282Команды классов в Tk соответствуют конструкторам классов в Tkinter.283284```python285button .fred                =====>  fred = Button()286```287288Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.289290```python291button .panel.fred          =====>  fred = Button(panel)292```293294Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [Установка параметров](https://python-all.ru/3.9/library/tkinter.html#tkinter-setting-options) о настройке параметров.295296```python297button .fred -fg red        =====>  fred = Button(panel, fg="red")298.fred configure -fg red     =====>  fred["fg"] = red299                            OR ==>  fred.config(fg="red")300```301302В Tk для выполнения действия над виджетом используйте имя виджета как команду, затем укажите имя действия, возможно с аргументами (параметрами). В Tkinter методы вызываются на экземпляре класса для выполнения действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в `tkinter/__init__.py`.303304```python305.fred invoke                =====>  fred.invoke()306```307308Чтобы передать виджет упаковщику (менеджеру геометрии), вызывают pack с необязательными аргументами. В Tkinter весь этот функционал сосредоточен в классе Pack, а различные формы команды pack реализованы как методы. Все виджеты в [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) являются подклассами Packer и наследуют все методы упаковки. Смотрите документацию модуля [`tkinter.tix`](https://python-all.ru/3.9/library/tkinter.tix.html#module-tkinter.tix) для получения дополнительной информации о менеджере геометрии Form.309310```python311pack .fred -side left       =====>  fred.pack(side="left")312```313314## Как связаны Tk и Tkinter315316Сверху вниз:317318**Ваше приложение здесь (Python)**319320Приложение на Python делает вызов [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter).321322**tkinter (пакет Python)**323324Этот вызов (например, создание виджета-кнопки) реализован в пакете [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter), который написан на Python. Эта функция на Python разбирает команды и аргументы и преобразует их в форму, которая выглядит так, как будто они пришли из скрипта Tk, а не из скрипта Python.325326**\_tkinter (C)**327328Эти команды и их аргументы будут переданы C-функции в модуле расширения `_tkinter` (обратите внимание на подчёркивание).329330**Tk Widgets (C и Tcl)**331332Эта C-функция может вызывать другие модули C, включая C-функции, составляющие библиотеку Tk. Tk реализован на C и частично на Tcl. Часть Tcl в виджетах Tk используется для привязки определённого поведения по умолчанию к виджетам и выполняется один раз в момент импорта пакета Python [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter). (Пользователь никогда не видит этот этап.)333334**Tk (C)**335336Часть Tk в Tk Widgets реализует окончательное отображение на …337338**Xlib (C)**339340библиотека Xlib для рисования графики на экране.341342## Краткий справочник343344### Установка опций345346Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:347348**При создании объекта – с помощью именованных аргументов**349350```python351fred = Button(self, fg="red", bg="blue")352```353354**После создания объекта – используя имя параметра как индекс словаря**355356```python357fred["fg"] = "red"358fred["bg"] = "blue"359```360361**Использовать метод config() для обновления нескольких атрибутов после создания объекта**362363```python364fred.config(fg="red", bg="blue")365```366367Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.368369Обратите внимание, что man-страницы перечисляют «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первое – список параметров, общих для многих виджетов, второе – параметры, свойственные конкретному виджету. Стандартные параметры задокументированы на man-странице *[options(3)](https://python-all.ru/3.9/library/tkinter.html)*.370371В этом документе не делается различий между стандартными и специфичными для виджета параметрами. Некоторые параметры не применимы к некоторым типам виджетов. Реагирует ли данный виджет на определённый параметр, зависит от класса виджета: кнопки имеют параметр `command`, а метки – нет.372373Опции, поддерживаемые данным виджетом, перечислены на странице руководства этого виджета, или их можно получить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` для этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.374375Некоторые параметры, например `bg`, являются синонимами распространённых параметров с длинными именами (`bg` – сокращение для «background»). При передаче методу `config()` имени сокращённого параметра будет возвращён 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж содержит имя синонима и «реальный» параметр (например, `('bg', 'background')`).376377| Индекс | Значение | Пример |378| --- | --- | --- |379| 0 | имя параметра | `'relief'` |380| 1 | имя параметра для поиска в базе данных | `'relief'` |381| 2 | класс параметра для поиска в базе данных | `'Relief'` |382| 3 | значение по умолчанию | `'raised'` |383| 4 | текущее значение | `'groove'` |384385Пример:386387```python388>>> print(fred.config())389{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}390```391392Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.393394### Упаковщик395396Упаковщик – один из механизмов управления геометрией Tk. Менеджеры геометрии используются для задания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *сверху*, *слева от*, *заполнение* и т.д. – и сам вычисляет точные координаты размещения.397398Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.399400Обратите внимание, что виджеты не отображаются, пока их геометрия не задана с помощью менеджера геометрии. Это распространенная ошибка новичков – пропустить задание геометрии и потом удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применен, например, метод `pack()` упаковщика.401402Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:403404```python405fred.pack()                     # по умолчанию side = "top"406fred.pack(side="left")407fred.pack(expand=1)408```409410### Опции упаковщика411412За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.413414**привязка**415416Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.417418**расширение**419420Логическое значение, `0` или `1`.421422**заполнение**423424Допустимые значения: `'x'`, `'y'`, `'both'`, `'none'`.425426**ipadx и ipady**427428Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.429430**padx и pady**431432Расстояние – задает внешний отступ с каждой стороны дочернего виджета.433434**сторона**435436Допустимые значения: `'left'`, `'right'`, `'top'`, `'bottom'`.437438### Привязка переменных виджетов439440Текущее значение некоторых виджетов (например, виджетов ввода текста) может быть напрямую связано с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Такая связь работает в обе стороны: если переменная изменяется по какой-либо причине, связанный с ней виджет обновится, отображая новое значение.441442К сожалению, в текущей реализации [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) невозможно передать виджету произвольную переменную Python через опцию `variable` или `textvariable`. Единственные переменные, с которыми это работает, – это переменные, являющиеся подклассами класса Variable, определённого в [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter).443444Уже определено много полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – метод `set()`. При соблюдении этого протокола виджет всегда будет отслеживать значение переменной без дополнительного вмешательства.445446Например:447448```python449import tkinter as tk450451class App(tk.Frame):452    def __init__(self, master):453        super().__init__(master)454        self.pack()455456        self.entrythingy = tk.Entry()457        self.entrythingy.pack()458459        # Создайте переменную приложения.460        self.contents = tk.StringVar()461        # Установите её в некоторое значение.462        self.contents.set("this is a variable")463        # Укажите виджету ввода отслеживать эту переменную.464        self.entrythingy["textvariable"] = self.contents465466        # Определите колбэк для события нажатия Return.467        # Он выводит текущее значение переменной.468        self.entrythingy.bind('<Key-Return>',469                             self.print_contents)470471    def print_contents(self, event):472        print("Hi. The current entry content is:",473              self.contents.get())474475root = tk.Tk()476myapp = App(root)477myapp.mainloop()478```479480### Менеджер окон481482В Tk есть служебная команда `wm` для взаимодействия с менеджером окон. Опции команды `wm` позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter) эти команды реализованы как методы класса `Wm`. Виджеты верхнего уровня являются подклассами класса `Wm`, поэтому могут напрямую вызывать методы `Wm`.483484Чтобы получить окно верхнего уровня, содержащее данный виджет, часто можно просто обратиться к родителю виджета. Однако если виджет упакован внутрь фрейма, родитель не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчеркивания, что указывает на то, что функция является частью реализации, а не интерфейсом к функциональности Tk.485486Вот несколько примеров типичного использования:487488```python489import tkinter as tk490491class App(tk.Frame):492    def __init__(self, master=None):493        super().__init__(master)494        self.pack()495496# создайте приложение497myapp = App()498499#500# здесь вызовы методов класса оконного менеджера501#502myapp.master.title("My Do-Nothing Application")503myapp.master.maxsize(1000, 400)504505# запустите программу506myapp.mainloop()507```508509### Типы данных опций Tk510511**привязка**512513Допустимые значения – направления компаса: `"n"`, `"ne"`, `"e"`, `"se"`, `"s"`, `"sw"`, `"w"`, `"nw"`, а также `"center"`.514515**битовая карта**516517Существует восемь встроенных именованных битовых карт: `'error'`, `'gray25'`, `'gray50'`, `'hourglass'`, `'info'`, `'questhead'`, `'question'`, `'warning'`. Чтобы указать имя файла X bitmap, укажите полный путь к файлу, начинающийся с `@`, например `"@/usr/contrib/bitmap/gumby.bit"`.518519**булевый**520521Можно передать целые числа 0 или 1 или строки `"yes"` или `"no"`.522523**колбэк**524525Это любая функция Python, которая не принимает аргументов. Например:526527```python528def print_it():529    print("hi there")530fred["command"] = print_it531```532533**цвет**534535Цвета можно задавать именами цветов X из файла rgb.txt или строками, представляющими значения RGB в 4-битном: `"#RGB"`, 8-битном: `"#RRGGBB"`, 12-битном: `"#RRRGGGBBB"` или 16-битном: `"#RRRRGGGGBBBB"` диапазонах, где R,G,B обозначают любую допустимую шестнадцатеричную цифру. Подробнее см. на стр. 160 книги Оустерхаута.536537**курсор**538539Можно использовать стандартные имена курсоров X из `cursorfont.h`, без префикса `XC_`. Например, чтобы получить курсор-руку (`XC_hand2`), используйте строку `"hand2"`. Можно также указать собственный файл битовой карты и маски. См. страницу 179 книги Оустерхаута.540541**расстояние**542543Экранные расстояния можно указывать в пикселях или абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, где последний символ обозначает единицы: `c` для сантиметров, `i` для дюймов, `m` для миллиметров, `p` для типографских пунктов. Например, 3,5 дюйма записывается как `"3.5i"`.544545**шрифт**546547Tk использует формат имени шрифта в виде списка, например `{courier 10 bold}`. Размеры шрифта с положительными числами измеряются в пунктах; с отрицательными – в пикселях.548549**геометрия**550551Это строка вида `widthxheight`, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например: `fred["geometry"] = "200x100"`.552553**выравнивание**554555Допустимые значения – строки: `"left"`, `"center"`, `"right"` и `"fill"`.556557**регион**558559Это строка из четырёх разделённых пробелами элементов, каждый из которых является допустимым расстоянием (см. выше). Например: `"2 3 4 5"`, `"3i 2i 4.5i 2i"` и `"3c 2c 4c 10.43c"` – все являются допустимыми областями.560561**рельеф**562563Определяет стиль рамки виджета. Допустимые значения: `"raised"`, `"sunken"`, `"flat"`, `"groove"` и `"ridge"`.564565**команда прокрутки**566567Это почти всегда метод `set()` какого-либо виджета полосы прокрутки, но может быть любым методом виджета, принимающим один аргумент.568569**перенос**570571Должно быть одним из: `"none"`, `"char"` или `"word"`.572573### Привязки и события574575Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:576577```python578def bind(self, sequence, func, add=''):579```580581где:582583**последовательность**584585это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).586587**функция**588589– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются *колбэками*.)590591**добавить**592593является необязательным, может быть `''` или `'+'`. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача `'+'` означает, что эта функция добавляется в список функций, привязанных к данному типу события.594595Например:596597```python598def turn_red(self, event):599    event.widget["activeforeground"] = "red"600601self.button.bind("<Enter>", self.turn_red)602```603604Обратите внимание, как поле widget объекта события используется в `turn_red()` колбэке. Это поле содержит виджет, который перехватил событие X. В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как они обозначаются в Tk; это может пригодиться при обращении к страницам руководства Tk.605606| Tk | Поле события Tkinter | Tk | Поле события Tkinter |607| --- | --- | --- | --- |608| %f | фокус | %A | char |609| %h | рост | %E | send\_event |610| %k | keycode | %K | keysym |611| %s | состояние | %N | keysym\_num |612| %t | time | %T | тип |613| %w | width | %W | widget |614| %x | x | %X | x\_root |615| %y | y | %Y | y\_root |616617### Параметр index618619Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.620621**Индексы виджета Entry (index, view index и т.д.)**622623Виджеты Entry имеют опции, относящиеся к позициям символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции [`tkinter`](https://python-all.ru/3.9/library/tkinter.html#module-tkinter):624625**Индексы виджета Text**626627Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.628629**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**630631Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:632633- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;634- строку `"active"`, которая указывает на позицию меню, находящуюся в данный момент под курсором;635- строку `"last"`, которая указывает на последний пункт меню;636- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;637- строку `"none"`, которая указывает на отсутствие какого-либо пункта меню, чаще всего используется с menu.activate() для деактивации всех пунктов, и наконец,638- текстовую строку, которая сопоставляется с образцом с меткой пункта меню при сканировании сверху вниз. Обратите внимание, что этот тип индекса рассматривается после всех остальных, что означает, что совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.639640### Изображения641642Изображения разных форматов можно создать через соответствующий подкласс `tkinter.Image`:643644- `BitmapImage` для изображений в формате XBM.645- `PhotoImage` для изображений в форматах PGM, PPM, GIF и PNG. Последний поддерживается начиная с Tk 8.6.646647Оба типа изображений создаются с помощью опции `file` или `data` (доступны и другие опции).648649Затем объект изображения можно использовать везде, где какой-либо виджет (например, метки, кнопки, меню) поддерживает опцию `image`. В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка на объект изображения из Python, данные изображения также удаляются, и Tk отображает пустой прямоугольник везде, где использовалось изображение.650651> **См. также**652>653> Пакет [Pillow](https://python-all.ru/3.9/library/tkinter.html) добавляет поддержку форматов BMP, JPEG, TIFF, WebP и других.654655## Обработчики файлов656657Tk позволяет регистрировать и удалять функцию обратного вызова, которая будет вызываться из главного цикла Tk, когда возможен ввод-вывод на файловом дескрипторе. Для каждого файлового дескриптора можно зарегистрировать только один обработчик. Пример кода:658659```python660import tkinter661widget = tkinter.Tk()662mask = tkinter.READABLE | tkinter.WRITABLE663widget.tk.createfilehandler(file, mask, callback)664...665widget.tk.deletefilehandler(file)666```667668Эта функция недоступна в Windows.669670Поскольку неизвестно, сколько байт доступно для чтения, не рекомендуется использовать методы [`BufferedIOBase`](https://python-all.ru/3.9/library/io.html#io.BufferedIOBase) или [`TextIOBase`](https://python-all.ru/3.9/library/io.html#io.TextIOBase) [`read()`](https://python-all.ru/3.9/library/io.html#io.BufferedIOBase.read) или [`readline()`](https://python-all.ru/3.9/library/io.html#io.IOBase.readline), так как они будут читать строго заданное количество байт. Для сокетов подойдут методы [`recv()`](https://python-all.ru/3.9/library/socket.html#socket.socket.recv) или [`recvfrom()`](https://python-all.ru/3.9/library/socket.html#socket.socket.recvfrom); для других файлов используйте необработанное чтение или `os.read(file.fileno(), maxbytecount)`.671672#### `Widget.tk.createfilehandler(file, mask, func)`673674Регистрирует функцию обратного вызова обработчика файла *func*. Аргумент *file* может быть объектом с методом [`fileno()`](https://python-all.ru/3.9/library/io.html#io.IOBase.fileno) (например, файлом или сокетом), либо целочисленным файловым дескриптором. Аргумент *mask* представляет собой комбинацию (побитовое ИЛИ) любых из трёх констант ниже. Колбэк вызывается следующим образом:675676```python677callback(file, mask)678```679680#### `Widget.tk.deletefilehandler(file)`681682Удаляет обработчик файла.683684#### `tkinter.READABLE`685686#### `tkinter.WRITABLE`687688#### `tkinter.EXCEPTION`689690Константы, используемые в аргументе *mask*.691