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

tkinter.md

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

1> **Источник:** https://python-all.ru/3.2/library/tkinter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 24.1. [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) – интерфейс Python к Tcl/Tk89Пакет [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) («интерфейс Tk») – это стандартный интерфейс Python к набору инструментов Tk GUI. И Tk, и [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) доступны на большинстве Unix-платформ, а также в системах Windows. (Tk сам по себе не является частью Python; он поддерживается компанией ActiveState.) Проверить, что [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) правильно установлен в вашей системе, можно, выполнив в командной строке `python -m tkinter`; должно открыться окно с демонстрацией простого интерфейса Tk.1011> **См. также**12>13> **[Ресурсы Python Tkinter](https://python-all.ru/3.2/library/tkinter.html)**14>15> В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.16>17> **[TKDocs](https://python-all.ru/3.2/library/tkinter.html)**18>19> Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.20>21> **[Справочник по Tkinter: графический интерфейс для Python](https://python-all.ru/3.2/library/tkinter.html)**22>23> Онлайн-справочные материалы.24>25> **[Документация Tkinter от effbot](https://python-all.ru/3.2/library/tkinter.html)**26>27> Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.28>29> **[Руководство по Tcl/Tk](https://python-all.ru/3.2/library/tkinter.html)**30>31> Официальное руководство для последней версии Tcl/Tk.32>33> **[Программирование на Python](https://python-all.ru/3.2/library/tkinter.html)**34>35> Книга Марка Лутца, в которой прекрасно освещается Tkinter.36>37> **[Современный Tkinter для занятых разработчиков Python](https://python-all.ru/3.2/library/tkinter.html)**38>39> Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.40>41> **[Введение в Tkinter](https://python-all.ru/3.2/library/tkinter.html)**42>43> Справочные материалы Фредрика Лунда в интернете.44>45> **[Программирование на Python и Tkinter](https://python-all.ru/3.2/library/tkinter.html)**46>47> Книга Джона Грейсона (ISBN 1-884777-81-3).4849## 24.1.1. Модули Tkinter5051В большинстве случаев [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) – это всё, что действительно нужно, но также доступен ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем `_tkinter`. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться напрямую программистами приложений. Обычно это разделяемая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.5253В дополнение к модулю интерфейса Tk, [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) включает ряд модулей Python, одним из наиболее важных является `tkinter.constants`. Импорт [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) автоматически импортирует `tkinter.constants`, поэтому обычно для использования Tkinter достаточно простого оператора import:5455```python56import tkinter57```5859Или, чаще:6061```python62from tkinter import *63```6465#### `class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)`6667Класс [`Tk`](https://python-all.ru/3.2/library/tkinter.html#tkinter.Tk) создаётся без аргументов. Это создаёт верхнеуровневый виджет Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.6869#### `tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)`7071Функция [`Tcl()`](https://python-all.ru/3.2/library/tkinter.html#tkinter.Tcl) является фабричной функцией, которая создаёт объект, очень похожий на тот, что создаётся классом [`Tk`](https://python-all.ru/3.2/library/tkinter.html#tkinter.Tk), за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при работе с интерпретатором Tcl в среде, где не нужно создавать лишние верхнеуровневые окна, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный функцией [`Tcl()`](https://python-all.ru/3.2/library/tkinter.html#tkinter.Tcl), может иметь окно Toplevel (и инициализированную подсистему Tk), созданное путём вызова его метода `loadtk()`.7273Другие модули, обеспечивающие поддержку Tk, включают:7475**[`tkinter.scrolledtext`](https://python-all.ru/3.2/library/tkinter.scrolledtext.html#module-tkinter.scrolledtext)**7677Текстовый виджет со встроенной вертикальной полосой прокрутки.7879**`tkinter.colorchooser`**8081Диалоговое окно для выбора цвета пользователем.8283**`tkinter.commondialog`**8485Базовый класс для диалогов, определённых в других перечисленных здесь модулях.8687**`tkinter.filedialog`**8889Стандартные диалоги для указания файла для открытия или сохранения.9091**`tkinter.font`**9293Утилиты для работы со шрифтами.9495**`tkinter.messagebox`**9697Доступ к стандартным диалоговым окнам Tk.9899**`tkinter.simpledialog`**100101Базовые диалоги и вспомогательные функции.102103**`tkinter.dnd`**104105Поддержка перетаскивания (drag-and-drop) для106107[`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter)108109. Это экспериментальная функция, которая должна стать устаревшей, когда будет заменена на Tk DND.110111**[`turtle`](https://python-all.ru/3.2/library/turtle.html#module-turtle)**112113Черепашья графика в окне Tk.114115## 24.1.2. Спасательный круг Tkinter116117Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.118119Благодарности:120121- Tk был написан Джоном Аустерхутом во время его работы в Беркли.122- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.123- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.124- HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.125- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.126- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.127128### 24.1.2.1. Как пользоваться этим разделом129130Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.131132При попытке ответить на вопросы вида «как сделать то-то», часто лучше всего выяснить, как сделать «то-то» в чистом Tk, а затем преобразовать это в соответствующий вызов [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter). Программисты на Python часто могут догадаться о правильной команде Python, посмотрев документацию Tk. Это означает, что для использования Tkinter нужно немного знать о Tk. Этот документ не может выполнять эту роль, поэтому лучшее, что мы можем сделать, – указать вам на лучшую существующую документацию. Вот несколько подсказок:133134- Авторы настоятельно рекомендуют приобрести копию man-страниц Tk. В частности, man-страницы в каталоге `manN` наиболее полезны. Man-страницы `man3` описывают интерфейс C к библиотеке Tk и поэтому не особенно полезны для разработчиков сценариев.135- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.136- `tkinter/__init__.py` – это крайнее средство для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.137138> **См. также**139>140> **[Страницы руководства Tcl/Tk 8.6](https://python-all.ru/3.2/library/tkinter.html)**141>142> Руководство по Tcl/Tk на сайте www.tcl.tk.143>144> **[Домашняя страница ActiveState Tcl](https://python-all.ru/3.2/library/tkinter.html)**145>146> Разработка Tk/Tcl в основном ведется в ActiveState.147>148> **[Tcl и инструментарий Tk](https://python-all.ru/3.2/library/tkinter.html)**149>150> Книга Джона Остерхута, создателя Tcl.151>152> **[Практическое программирование на Tcl и Tk](https://python-all.ru/3.2/library/tkinter.html)**153>154> Энциклопедическая книга Брента Уэлча.155156### 24.1.2.2. Простая программа Hello World157158```python159from tkinter import *160161class Application(Frame):162    def say_hi(self):163        print("hi there, everyone!")164165    def createWidgets(self):166        self.QUIT = Button(self)167        self.QUIT["text"] = "QUIT"168        self.QUIT["fg"] = "red"169        self.QUIT["command"] = self.quit170171        self.QUIT.pack({"side": "left"})172173        self.hi_there = Button(self)174        self.hi_there["text"] = "Hello",175        self.hi_there["command"] = self.say_hi176177        self.hi_there.pack({"side": "left"})178179    def __init__(self, master=None):180        Frame.__init__(self, master)181        self.pack()182        self.createWidgets()183184root = Tk()185app = Application(master=root)186app.mainloop()187root.destroy()188```189190## 24.1.3. Очень краткий взгляд на Tcl/Tk191192Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.193194Примечания:195196- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.197- Класс [`Tk`](https://python-all.ru/3.2/library/tkinter.html#tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно, система создаёт один экземпляр всякий раз, когда создаётся любой из других классов.198- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов, чтобы создавать «настоящие» виджеты (в C++ это называется «абстрактный класс»).199200Чтобы использовать этот справочный материал, иногда потребуется уметь читать короткие отрывки из Tk и определять различные части команды Tk. (Смотрите раздел [*Отображение базового Tk в Tkinter*](https://python-all.ru/3.2/library/tkinter.html#tkinter-basic-mapping) для [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter)-эквивалентов приведённого ниже.)201202Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.203204Чтобы создать виджет в Tk, команда всегда имеет следующий вид:205206```python207classCommand newPathname options208```209210***classCommand***211212обозначает, какой виджет создавать (кнопку, метку, меню...)213214***newPathname***215216это новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы помочь обеспечить это, виджеты в Tk именуются с помощью217218*путевых имён*219220, как файлы в файловой системе. Верхнеуровневый виджет,221222*корень (root)*223224, называется225226`.`227228(точка) и дочерние элементы разделяются дополнительными точками. Например,229230`.myApp.controlPanel.okButton`231232может быть именем виджета.233234***опции***235236Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.237238Например:239240```python241button   .fred   -fg red -text "hi there"242   ^       ^     \______________________/243   |       |                |244 class    new            options245command  widget  (-opt val -opt val ...)246```247248После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:249250```python251.fred someAction someOptions252```253254Обратите внимание, что имя объекта, `.fred`, начинается с точки.255256Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).257258Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие же, как команда `delete` поля ввода текста, требуют аргументов для указания диапазона удаляемого текста.259260## 24.1.4. Соответствие между базовым Tk и Tkinter261262Команды классов в Tk соответствуют конструкторам классов в Tkinter.263264```python265button .fred                =====>  fred = Button()266```267268Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.269270```python271button .panel.fred          =====>  fred = Button(panel)272```273274Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [*Установка параметров*](https://python-all.ru/3.2/library/tkinter.html#tkinter-setting-options) о настройке параметров.275276```python277button .fred -fg red        =====>  fred = Button(panel, fg="red")278.fred configure -fg red     =====>  fred["fg"] = red279                            OR ==>  fred.config(fg="red")280```281282В Tk для выполнения действия над виджетом используется имя виджета как команда, за которым следует имя действия, возможно с аргументами (опциями). В Tkinter вызов методов экземпляра класса приводит к выполнению действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в `tkinter/__init__.py`.283284```python285.fred invoke                =====>  fred.invoke()286```287288Чтобы передать виджет упаковщику (менеджеру геометрии), вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализованы как методы. Все виджеты в [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) являются подклассами Packer и наследуют все методы упаковки. См. документацию модуля [`tkinter.tix`](https://python-all.ru/3.2/library/tkinter.tix.html#module-tkinter.tix) для дополнительной информации о менеджере геометрии Form.289290```python291pack .fred -side left       =====>  fred.pack(side="left")292```293294## 24.1.5. Как связаны Tk и Tkinter295296Сверху вниз:297298**Ваше приложение здесь (Python)**299300Приложение на Python выполняет вызов301302[`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter)303304.305306**tkinter (пакет Python)**307308Этот вызов (например, создание виджета-кнопки) реализован в пакете309310[`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter)311312, написанном на Python. Эта функция на Python разбирает команды и аргументы и преобразует их в форму, которая выглядит так, как если бы они пришли из скрипта Tk, а не из скрипта Python.313314**\_tkinter (C)**315316Эти команды и их аргументы передаются C-функции в модуле расширения317318`_tkinter`319320(обратите внимание на подчёркивание).321322**Tk Widgets (C и Tcl)**323324Эта C-функция может вызывать другие C-модули, включая C-функции, составляющие библиотеку Tk. Tk реализован на C и частично на Tcl. Tcl-часть виджетов Tk используется для привязки определённого поведения по умолчанию к виджетам и выполняется один раз при импорте пакета Python325326[`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter)327328. (Пользователь никогда не видит этот этап.)329330**Tk (C)**331332Часть Tk виджетов Tk реализует конечное отображение на ...333334**Xlib (C)**335336библиотека Xlib для рисования графики на экране.337338## 24.1.6. Удобный справочник339340### 24.1.6.1. Настройка параметров341342Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:343344**При создании объекта – с помощью именованных аргументов**345346```python347fred = Button(self, fg="red", bg="blue")348```349350**После создания объекта – используя имя параметра как индекс словаря**351352```python353fred["fg"] = "red"354fred["bg"] = "blue"355```356357**Использовать метод config() для обновления нескольких атрибутов после создания объекта**358359```python360fred.config(fg="red", bg="blue")361```362363Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.364365Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице *options(3)*.366367В этом документе не делается различий между стандартными и специфическими для виджета опциями. Некоторые опции не применимы к некоторым типам виджетов. Реагирует ли данный виджет на конкретную опцию, зависит от класса виджета: кнопки имеют опцию `command`, метки – нет.368369Опции, поддерживаемые данным виджетом, перечислены на его man-странице, или их можно запросить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.370371Некоторые опции, например `bg`, являются синонимами распространённых опций с длинными именами (`bg` – сокращение от «background»). Передача методу `config()` имени сокращённой опции вернёт 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж будет содержать имя синонима и «настоящую» опцию (например, `('bg', 'background')`).372373| Индекс | Значение | Пример |374| --- | --- | --- |375| 0 | имя параметра | `'relief'` |376| 1 | имя параметра для поиска в базе данных | `'relief'` |377| 2 | класс параметра для поиска в базе данных | `'Relief'` |378| 3 | значение по умолчанию | `'raised'` |379| 4 | текущее значение | `'groove'` |380381Пример:382383```python384>>> print(fred.config())385{'relief' : ('relief', 'relief', 'Relief', 'raised', 'groove')}386```387388Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.389390### 24.1.6.2. Packer391392Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *выше*, *слева от*, *заполнение* и т.д. – и самостоятельно вычисляет точные координаты размещения.393394Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.395396Обратите внимание, что виджеты не отображаются, пока для них не указана геометрия с помощью менеджера геометрии. Типичная ошибка новичков – пропустить указание геометрии, а затем удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применён, например, метод упаковщика `pack()`.397398Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:399400```python401fred.pack()                     # по умолчанию side = "top"402fred.pack(side="left")403fred.pack(expand=1)404```405406### 24.1.6.3. Параметры Packer407408За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.409410**привязка**411412Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.413414**расширение**415416Логическое значение,417418`0`419420или421422`1`423424.425426**заполнение**427428Допустимые значения:429430`'x'`431432,433434`'y'`435436,437438`'both'`439440,441442`'none'`443444.445446**ipadx и ipady**447448Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.449450**padx и pady**451452Расстояние – задает внешний отступ с каждой стороны дочернего виджета.453454**сторона**455456Допустимые значения:457458`'left'`459460,461462`'right'`463464,465466`'top'`467468,469470`'bottom'`471472.473474### 24.1.6.4. Связывание переменных виджетов475476Текущее значение некоторых виджетов (например, полей ввода текста) можно напрямую связать с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Эта связь работает в обе стороны: если переменная по какой-либо причине изменяется, виджет, к которому она привязана, обновляется, отражая новое значение.477478К сожалению, в текущей реализации [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) невозможно передать произвольную переменную Python виджету через опцию `variable` или `textvariable`. Единственные типы переменных, для которых это работает, – это переменные, являющиеся подклассами класса Variable, определённого в [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter).479480Уже определено много полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – вызовите метод `set()`. Если следовать этому протоколу, виджет будет всегда отслеживать значение переменной без дополнительных действий с вашей стороны.481482Например:483484```python485class App(Frame):486    def __init__(self, master=None):487        Frame.__init__(self, master)488        self.pack()489490        self.entrythingy = Entry()491        self.entrythingy.pack()492493        # здесь находится переменная приложения494        self.contents = StringVar()495        # установить её в какое-либо значение496        self.contents.set("this is a variable")497        # указать виджету ввода следить за этой переменной498        self.entrythingy["textvariable"] = self.contents499500        # и здесь мы получаем колбэк, когда пользователь нажимает Ввод.501        # заставим программу вывести значение502        # переменной приложения, когда пользователь нажимает Ввод503        self.entrythingy.bind('<Key-Return>',504                              self.print_contents)505506    def print_contents(self, event):507        print("hi. contents of entry is now ---->",508              self.contents.get())509```510511### 24.1.6.5. Менеджер окон512513В Tk есть служебная команда `wm` для взаимодействия с оконным менеджером. Опции команды `wm` позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) эти команды реализованы как методы класса `Wm`. Виджеты верхнего уровня являются подклассами класса `Wm` и поэтому могут вызывать методы `Wm` напрямую.514515Чтобы получить окно верхнего уровня, содержащее данный виджет, можно часто просто обратиться к мастеру (master) виджета. Конечно, если виджет был упакован внутри фрейма, мастер не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчёркивания, чтобы обозначить, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.516517Вот несколько примеров типичного использования:518519```python520from tkinter import *521class App(Frame):522    def __init__(self, master=None):523        Frame.__init__(self, master)524        self.pack()525526# создайте приложение527myapp = App()528529#530# здесь вызовы методов класса оконного менеджера531#532myapp.master.title("My Do-Nothing Application")533myapp.master.maxsize(1000, 400)534535# запустите программу536myapp.mainloop()537```538539### 24.1.6.6. Типы данных параметров Tk540541**привязка**542543Допустимые значения – стороны света:544545`"n"`546547,548549`"ne"`550551,552553`"e"`554555,556557`"se"`558559,560561`"s"`562563,564565`"sw"`566567,568569`"w"`570571,572573`"nw"`574575, а также576577`"center"`578579.580581**битовая карта**582583Существует восемь встроенных именованных битовых карт:584585`'error'`586587,588589`'gray25'`590591,592593`'gray50'`594595,596597`'hourglass'`598599,600601`'info'`602603,604605`'questhead'`606607,608609`'question'`610611,612613`'warning'`614615. Чтобы указать имя файла битовой карты X, укажите полный путь к файлу, перед которым ставится616617`@`618619, например620621`"@/usr/contrib/bitmap/gumby.bit"`622623.624625**булевый**626627Можно передавать целые числа 0 или 1 или строки628629`"yes"`630631или632633`"no"`634635.636637**колбэк**638639Это любая функция Python, которая не принимает аргументов. Например:640641```python642def print_it():643    print("hi there")644fred["command"] = print_it645```646647**цвет**648649Цвета могут задаваться как имена цветов X из файла rgb.txt, или как строки, представляющие значения RGB в 4-битном:650651`"#RGB"`652653, 8-битном:654655`"#RRGGBB"`656657, 12-битном:658659`"#RRRGGGBBB"`660661или 16-битном:662663`"#RRRRGGGGBBBB"`664665диапазонах, где R,G,B здесь представляют любую допустимую шестнадцатеричную цифру. См. страницу 160 книги Уэстерхута для подробностей.666667**курсор**668669Стандартные имена курсоров X из670671`cursorfont.h`672673можно использовать без префикса674675`XC_`676677. Например, чтобы получить курсор в виде руки (678679`XC_hand2`680681), используйте строку682683`"hand2"`684685. Также можно указать собственные файлы битовой карты и маски. См. стр. 179 книги Остерхаута.686687**расстояние**688689Экранные расстояния можно задавать в пикселях или в абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, причём конечный символ обозначает единицу измерения:690691`c`692693для сантиметров,694695`i`696697для дюймов,698699`m`700701для миллиметров,702703`p`704705для типографских пунктов. Например, 3,5 дюйма выражается как706707`"3.5i"`708709.710711**шрифт**712713Tk использует формат списка имён шрифтов, например714715`{courier 10 bold}`716717. Размеры шрифта с положительными числами задаются в пунктах; размеры с отрицательными числами задаются в пикселях.718719**геометрия**720721Это строка вида722723`widthxheight`724725, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например:726727`fred["geometry"] = "200x100"`728729.730731**выравнивание**732733Допустимые значения – строки:734735`"left"`736737,738739`"center"`740741,742743`"right"`744745и746747`"fill"`748749.750751**регион**752753Это строка с четырьмя элементами, разделёнными пробелами, каждый из которых является допустимым расстоянием (см. выше). Например:754755`"2 3 4 5"`756757и758759`"3i 2i 4.5i 2i"`760761и762763`"3c 2c 4c 10.43c"`764765– всё это допустимые области.766767**рельеф**768769Определяет стиль границы виджета. Допустимые значения:770771`"raised"`772773,774775`"sunken"`776777,778779`"flat"`780781,782783`"groove"`784785и786787`"ridge"`788789.790791**команда прокрутки**792793Почти всегда это метод794795`set()`796797какого-нибудь виджета полосы прокрутки, но может быть любым методом виджета, принимающим единственный аргумент.798799**перенос:**800801Должно быть одним из:802803`"none"`804805,806807`"char"`808809или810811`"word"`812813.814815### 24.1.6.7. Привязки и события816817Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:818819```python820def bind(self, sequence, func, add=''):821```822823где:824825**последовательность**826827это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).828829**функция**830831– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются832833*колбэками*834835.)836837**добавить**838839является необязательным, может быть840841`''`842843или844845`'+'`846847. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача848849`'+'`850851означает, что эта функция добавляется в список функций, привязанных к данному типу события.852853Например:854855```python856def turnRed(self, event):857    event.widget["activeforeground"] = "red"858859self.button.bind("<Enter>", self.turnRed)860```861862Обратите внимание, как в колбэке `turnRed()` происходит обращение к полю widget события. Это поле содержит виджет, который поймал X-событие. В следующей таблице перечислены другие поля события, к которым можно обращаться, и то, как они обозначаются в Tk, что может быть полезно при обращении к справочным страницам Tk (man pages).863864| Tk | Поле события Tkinter | Tk | Поле события Tkinter |865| --- | --- | --- | --- |866| %f | фокус | %A | char |867| %h | рост | %E | send\_event |868| %k | keycode | %K | keysym |869| %s | состояние | %N | keysym\_num |870| %t | time | %T | тип |871| %w | ширина | %W | виджет |872| %x | x | %X | x\_root |873| %y | y | %Y | y\_root |874875### 24.1.6.8. Параметр index876877Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.878879**Индексы виджета Entry (index, view index и т.д.)**880881Виджеты ввода имеют опции, ссылающиеся на позиции символов в отображаемом тексте. Для доступа к этим особым точкам в текстовых виджетах можно использовать функции [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter):882883**AtEnd()**884885относится к последней позиции в тексте886887**AtInsert()**888889относится к точке, где находится текстовый курсор890891**AtSelFirst()**892893указывает начальную точку выделенного текста894895**AtSelLast()**896897обозначает последнюю точку выделенного текста и, наконец,898899**At(x\[, y\])**900901относится к символу по координатам пикселей902903*x*904905,906907*y*908909(при этом910911*y*912913не используется в случае виджета ввода текста, который содержит одну строку текста).914915**Индексы виджета Text**916917Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.918919**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**920921Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:922923- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;924- строка `"active"`, которая указывает на позицию меню, находящуюся в данный момент под курсором;925- строка `"last"`, которая указывает на последний пункт меню;926- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;927- строка `"none"`, которая означает отсутствие пункта меню; чаще всего используется с menu.activate() для деактивации всех пунктов; и наконец,928- текстовая строка, которая сопоставляется по шаблону с меткой пункта меню, при этом поиск выполняется сверху вниз. Обратите внимание, что этот тип индекса обрабатывается после всех остальных, то есть совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.929930### 24.1.6.9. Изображения931932Растровые изображения (Bitmap/Pixelmap) можно создавать через подклассы `tkinter.Image`:933934- `BitmapImage` можно использовать для растровых данных X11.935- `PhotoImage` можно использовать для цветных растровых изображений в форматах GIF и PPM/PGM.936937Любой тип изображения создаётся с помощью опции `file` или `data` (другие опции также доступны).938939Затем объект изображения можно использовать везде, где опция `image` поддерживается каким-либо виджетом (например, метками, кнопками, меню). В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка Python на объект изображения, данные изображения также удаляются, и Tk будет отображать пустой прямоугольник там, где использовалось изображение.940