tkinter.md
1> **Источник:** https://python-all.ru/3.5/library/tkinter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 25.1. [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) – интерфейс Python для Tcl/Tk89**Исходный код:** [Lib/tkinter/\_\_init\_\_.py](https://python-all.ru/src/3.5/Lib/tkinter/__init__.py)1011---1213Пакет [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) («Tk interface») – стандартный интерфейс Python для набора графических инструментов Tk. И Tk, и [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) доступны на большинстве Unix-платформ, а также в системах Windows. (Сам Tk не является частью Python; он поддерживается компанией ActiveState.) Можно проверить, что [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) правильно установлен в системе, выполнив `python -m tkinter` из командной строки; при этом должно открыться окно, демонстрирующее простой интерфейс Tk.1415> **См. также**16>17> **[Ресурсы Python Tkinter](https://python-all.ru/3.5/library/tkinter.html)**18>19> В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.20>21> **[TKDocs](https://python-all.ru/3.5/library/tkinter.html)**22>23> Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.24>25> **[Справочник по Tkinter: графический интерфейс для Python](https://python-all.ru/3.5/library/tkinter.html)**26>27> Онлайн-справочные материалы.28>29> **[Документация Tkinter от effbot](https://python-all.ru/3.5/library/tkinter.html)**30>31> Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.32>33> **[Руководство по Tcl/Tk](https://python-all.ru/3.5/library/tkinter.html)**34>35> Официальное руководство для последней версии Tcl/Tk.36>37> **[Программирование на Python](https://python-all.ru/3.5/library/tkinter.html)**38>39> Книга Марка Лутца, в которой прекрасно освещается Tkinter.40>41> **[Современный Tkinter для занятых разработчиков Python](https://python-all.ru/3.5/library/tkinter.html)**42>43> Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.44>45> **[Программирование на Python и Tkinter](https://python-all.ru/3.5/library/tkinter.html)**46>47> Книга Джона Грейсона (ISBN 1-884777-81-3).4849## 25.1.1. Модули Tkinter5051В большинстве случаев вам достаточно [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter), но также доступен ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем `_tkinter`. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться напрямую программистами приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.5253В дополнение к модулю интерфейса Tk, [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) включает ряд модулей Python, `tkinter.constants` является одним из наиболее важных. Импорт [`tkinter`](https://python-all.ru/3.5/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.5/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.5/library/tkinter.html#tkinter.Tcl) является фабричной функцией, которая создаёт объект, очень похожий на создаваемый классом [`Tk`](https://python-all.ru/3.5/library/tkinter.html#tkinter.Tk), за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при управлении интерпретатором Tcl в среде, где не требуется создавать лишние окна верхнего уровня, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный объектом [`Tcl()`](https://python-all.ru/3.5/library/tkinter.html#tkinter.Tcl), может создать окно верхнего уровня (и инициализировать подсистему Tk) с помощью вызова его метода `loadtk()`.7273Другие модули, обеспечивающие поддержку Tk, включают:7475**[`tkinter.scrolledtext`](https://python-all.ru/3.5/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Поддержка перетаскивания для106107[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)108109. Эта функция экспериментальная и будет объявлена устаревшей, когда ее заменит Tk DND.110111**[`turtle`](https://python-all.ru/3.5/library/turtle.html#module-turtle)**112113Черепашья графика в окне Tk.114115## 25.1.2. Спасательный круг Tkinter116117Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.118119Благодарности:120121- Tk был написан Джоном Аустерхутом во время его работы в Беркли.122- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.123- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.124- HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.125- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.126- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.127128### 25.1.2.1. Как использовать этот раздел129130Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.131132При попытке ответить на вопросы вида «как сделать то-то» часто лучше сначала выяснить, как сделать «то-то» в чистом Tk, а затем преобразовать это в соответствующий вызов [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter). Python-программисты часто могут догадаться о правильной команде Python, глядя на документацию Tk. Это означает, что для использования Tkinter необходимо немного знать Tk. Настоящий документ не может выполнить эту роль, поэтому лучшее, что можно сделать, – указать на лучшую существующую документацию. Вот несколько подсказок:133134- Авторы настоятельно рекомендуют приобрести копию страниц руководства Tk (man pages). В частности, наиболее полезны страницы руководства в каталоге `manN`. Страницы руководства `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.5/library/tkinter.html)**141>142> Руководство по Tcl/Tk на сайте www.tcl.tk.143>144> **[Домашняя страница ActiveState Tcl](https://python-all.ru/3.5/library/tkinter.html)**145>146> Разработка Tk/Tcl в основном ведется в ActiveState.147>148> **[Tcl и инструментарий Tk](https://python-all.ru/3.5/library/tkinter.html)**149>150> Книга Джона Оустерхута, создателя Tcl.151>152> **[Практическое программирование на Tcl и Tk](https://python-all.ru/3.5/library/tkinter.html)**153>154> Энциклопедическая книга Брента Уэлча.155156### 25.1.2.2. Простая программа Hello World157158```python159import tkinter as tk160161class Application(tk.Frame):162 def __init__(self, master=None):163 super().__init__(master)164 self.pack()165 self.create_widgets()166167 def create_widgets(self):168 self.hi_there = tk.Button(self)169 self.hi_there["text"] = "Hello World\n(click me)"170 self.hi_there["command"] = self.say_hi171 self.hi_there.pack(side="top")172173 self.quit = tk.Button(self, text="QUIT", fg="red",174 command=root.destroy)175 self.quit.pack(side="bottom")176177 def say_hi(self):178 print("hi there, everyone!")179180root = tk.Tk()181app = Application(master=root)182app.mainloop()183```184185## 25.1.3. Очень краткий обзор Tcl/Tk186187Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.188189Примечания:190191- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.192- Класс [`Tk`](https://python-all.ru/3.5/library/tkinter.html#tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно – система создаёт его всякий раз, когда создаётся экземпляр любого из других классов.193- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов с целью создания «настоящих» виджетов (в C++ это называется «абстрактный класс»).194195Чтобы воспользоваться этим справочным материалом, иногда потребуется уметь читать короткие фрагменты Tk и распознавать различные части команды Tk. (Смотрите раздел [Отображение базового Tk в Tkinter](https://python-all.ru/3.5/library/tkinter.html#tkinter-basic-mapping) для [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) эквивалентов того, что описано ниже.)196197Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.198199Чтобы создать виджет в Tk, команда всегда имеет следующий вид:200201```python202classCommand newPathname options203```204205***classCommand***206207Обозначает тип создаваемого виджета (кнопка, метка, меню…).208209***newPathname***210211– это новое имя для данного виджета. Все имена в Tk должны быть уникальными. Чтобы обеспечить это, виджеты в Tk именуются с помощью212213*путевых имён*214215, как файлы в файловой системе. Виджет верхнего уровня,216217*корень*218219, называется220221`.`222223(точка), а дочерние элементы разделяются дополнительными точками. Например,224225`.myApp.controlPanel.okButton`226227может быть именем виджета.228229***options***230231Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.232233Например:234235```python236button .fred -fg red -text "hi there"237 ^ ^ \______________________/238 | | |239 class new options240command widget (-opt val -opt val ...)241```242243После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:244245```python246.fred someAction someOptions247```248249Обратите внимание, что имя объекта `.fred` начинается с точки.250251Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).252253Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие, например команда `delete` поля ввода текста, нуждаются в аргументах для указания диапазона удаляемого текста.254255## 25.1.4. Отображение базового Tk в Tkinter256257Команды классов в Tk соответствуют конструкторам классов в Tkinter.258259```python260button .fred =====> fred = Button()261```262263Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.264265```python266button .panel.fred =====> fred = Button(panel)267```268269Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [Установка параметров](https://python-all.ru/3.5/library/tkinter.html#tkinter-setting-options) о настройке параметров.270271```python272button .fred -fg red =====> fred = Button(panel, fg="red")273.fred configure -fg red =====> fred["fg"] = red274 OR ==> fred.config(fg="red")275```276277В Tk для выполнения действия над виджетом используйте имя виджета как команду, затем укажите имя действия, возможно с аргументами (параметрами). В Tkinter методы вызываются на экземпляре класса для выполнения действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в `tkinter/__init__.py`.278279```python280.fred invoke =====> fred.invoke()281```282283Чтобы передать виджет упаковщику (менеджеру геометрии), вызывают pack с необязательными аргументами. В Tkinter весь этот функционал сосредоточен в классе Pack, а различные формы команды pack реализованы как методы. Все виджеты в [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) являются подклассами Packer и наследуют все методы упаковки. Смотрите документацию модуля [`tkinter.tix`](https://python-all.ru/3.5/library/tkinter.tix.html#module-tkinter.tix) для получения дополнительной информации о менеджере геометрии Form.284285```python286pack .fred -side left =====> fred.pack(side="left")287```288289## 25.1.5. Как связаны Tk и Tkinter290291Сверху вниз:292293**Ваше приложение здесь (Python)**294295Приложение на Python делает вызов296297[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)298299.300301**tkinter (пакет Python)**302303Этот вызов (например, создание виджета-кнопки) реализован в пакете304305[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)306307, который написан на Python. Эта функция на Python разбирает команды и аргументы и преобразует их в форму, которая выглядит так, как будто они пришли из скрипта Tk, а не из скрипта Python.308309**\_tkinter (C)**310311Эти команды и их аргументы будут переданы C-функции в модуле расширения312313`_tkinter`314315(обратите внимание на подчёркивание).316317**Tk Widgets (C и Tcl)**318319Эта C-функция может вызывать другие модули C, включая C-функции, составляющие библиотеку Tk. Tk реализован на C и частично на Tcl. Часть Tcl в виджетах Tk используется для привязки определённого поведения по умолчанию к виджетам и выполняется один раз в момент импорта пакета Python320321[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)322323. (Пользователь никогда не видит этот этап.)324325**Tk (C)**326327Часть Tk в Tk Widgets реализует окончательное отображение на …328329**Xlib (C)**330331библиотека Xlib для рисования графики на экране.332333## 25.1.6. Удобный справочник334335### 25.1.6.1. Установка параметров336337Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:338339**При создании объекта – с помощью именованных аргументов**340341```python342fred = Button(self, fg="red", bg="blue")343```344345**После создания объекта – используя имя параметра как индекс словаря**346347```python348fred["fg"] = "red"349fred["bg"] = "blue"350```351352**Использовать метод config() для обновления нескольких атрибутов после создания объекта**353354```python355fred.config(fg="red", bg="blue")356```357358Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.359360Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице *options(3)*.361362В этом документе не делается различий между стандартными и специфичными для виджета параметрами. Некоторые параметры не применимы к некоторым типам виджетов. Реагирует ли данный виджет на определённый параметр, зависит от класса виджета: кнопки имеют параметр `command`, а метки – нет.363364Опции, поддерживаемые данным виджетом, перечислены на странице руководства этого виджета, или их можно получить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` для этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.365366Некоторые параметры, например `bg`, являются синонимами распространённых параметров с длинными именами (`bg` – сокращение для «background»). При передаче методу `config()` имени сокращённого параметра будет возвращён 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж содержит имя синонима и «реальный» параметр (например, `('bg', 'background')`).367368| Индекс | Значение | Пример |369| --- | --- | --- |370| 0 | имя параметра | `'relief'` |371| 1 | имя параметра для поиска в базе данных | `'relief'` |372| 2 | класс параметра для поиска в базе данных | `'Relief'` |373| 3 | значение по умолчанию | `'raised'` |374| 4 | текущее значение | `'groove'` |375376Пример:377378```python379>>> print(fred.config())380{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}381```382383Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.384385### 25.1.6.2. Упаковщик386387Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *выше*, *слева от*, *заполнение* и т.д. – и самостоятельно вычисляет точные координаты размещения.388389Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.390391Обратите внимание, что виджеты не отображаются, пока их геометрия не задана с помощью менеджера геометрии. Это распространенная ошибка новичков – пропустить задание геометрии и потом удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применен, например, метод `pack()` упаковщика.392393Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:394395```python396fred.pack() # по умолчанию side = "top"397fred.pack(side="left")398fred.pack(expand=1)399```400401### 25.1.6.3. Параметры упаковщика402403За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.404405**привязка**406407Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.408409**расширение**410411Логическое значение,412413`0`414415или416417`1`418419.420421**заполнение**422423Допустимые значения:424425`'x'`426427,428429`'y'`430431,432433`'both'`434435,436437`'none'`438439.440441**ipadx и ipady**442443Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.444445**padx и pady**446447Расстояние – задает внешний отступ с каждой стороны дочернего виджета.448449**сторона**450451Допустимые значения:452453`'left'`454455,456457`'right'`458459,460461`'top'`462463,464465`'bottom'`466467.468469### 25.1.6.4. Связывание переменных виджетов470471Текущее значение некоторых виджетов (например, виджетов ввода текста) может быть напрямую связано с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Такая связь работает в обе стороны: если переменная изменяется по какой-либо причине, связанный с ней виджет обновится, отображая новое значение.472473К сожалению, в текущей реализации [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) невозможно передать виджету произвольную переменную Python через опцию `variable` или `textvariable`. Единственные переменные, с которыми это работает, – это переменные, являющиеся подклассами класса Variable, определённого в [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter).474475Уже определено много полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – метод `set()`. При соблюдении этого протокола виджет всегда будет отслеживать значение переменной без дополнительного вмешательства.476477Например:478479```python480class App(Frame):481 def __init__(self, master=None):482 super().__init__(master)483 self.pack()484485 self.entrythingy = Entry()486 self.entrythingy.pack()487488 # здесь находится переменная приложения489 self.contents = StringVar()490 # установить её в какое-либо значение491 self.contents.set("this is a variable")492 # указать виджету ввода следить за этой переменной493 self.entrythingy["textvariable"] = self.contents494495 # и здесь мы получаем колбэк, когда пользователь нажимает Ввод.496 # заставим программу вывести значение497 # переменной приложения, когда пользователь нажимает Ввод498 self.entrythingy.bind('<Key-Return>',499 self.print_contents)500501 def print_contents(self, event):502 print("hi. contents of entry is now ---->",503 self.contents.get())504```505506### 25.1.6.5. Менеджер окон507508В Tk есть служебная команда `wm` для взаимодействия с менеджером окон. Опции команды `wm` позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) эти команды реализованы как методы класса `Wm`. Виджеты верхнего уровня являются подклассами класса `Wm`, поэтому могут напрямую вызывать методы `Wm`.509510Чтобы получить окно верхнего уровня, содержащее данный виджет, часто можно просто обратиться к родителю виджета. Однако если виджет упакован внутрь фрейма, родитель не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчеркивания, что указывает на то, что функция является частью реализации, а не интерфейсом к функциональности Tk.511512Вот несколько примеров типичного использования:513514```python515import tkinter as tk516517class App(tk.Frame):518 def __init__(self, master=None):519 super().__init__(master)520 self.pack()521522# создайте приложение523myapp = App()524525#526# здесь вызовы методов класса оконного менеджера527#528myapp.master.title("My Do-Nothing Application")529myapp.master.maxsize(1000, 400)530531# запустите программу532myapp.mainloop()533```534535### 25.1.6.6. Типы данных опций Tk536537**привязка**538539Допустимые значения – направления компаса:540541`"n"`542543,544545`"ne"`546547,548549`"e"`550551,552553`"se"`554555,556557`"s"`558559,560561`"sw"`562563,564565`"w"`566567,568569`"nw"`570571, а также572573`"center"`574575.576577**битовая карта**578579Существует восемь встроенных именованных битовых карт:580581`'error'`582583,584585`'gray25'`586587,588589`'gray50'`590591,592593`'hourglass'`594595,596597`'info'`598599,600601`'questhead'`602603,604605`'question'`606607,608609`'warning'`610611. Чтобы указать имя файла X bitmap, укажите полный путь к файлу, начинающийся с612613`@`614615, например616617`"@/usr/contrib/bitmap/gumby.bit"`618619.620621**булевый**622623Можно передать целые числа 0 или 1 или строки624625`"yes"`626627или628629`"no"`630631.632633**колбэк**634635Это любая функция Python, которая не принимает аргументов. Например:636637```python638def print_it():639 print("hi there")640fred["command"] = print_it641```642643**цвет**644645Цвета могут быть заданы как имена X-цветов из файла rgb.txt, либо как строки, представляющие значения RGB в диапазонах: 4 бита:646647`"#RGB"`648649, 8 бит:650651`"#RRGGBB"`652653, 12 бит:654655`"#RRRGGGBBB"`656657, или 16 бит:658659`"#RRRRGGGGBBBB"`660661, где R,G,B здесь обозначают любые допустимые шестнадцатеричные цифры. Подробнее см. на странице 160 книги Оустерхаута.662663**курсор**664665Можно использовать стандартные имена курсоров X из666667`cursorfont.h`668669, без префикса670671`XC_`672673. Например, чтобы получить курсор-руку (674675`XC_hand2`676677), используйте строку678679`"hand2"`680681. Можно также указать собственный файл битовой карты и маски. См. страницу 179 книги Оустерхаута.682683**расстояние**684685Экранные расстояния можно указывать в пикселях или абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, где последний символ обозначает единицы:686687`c`688689для сантиметров,690691`i`692693для дюймов,694695`m`696697для миллиметров,698699`p`700701для типографских пунктов. Например, 3,5 дюйма записывается как702703`"3.5i"`704705.706707**шрифт**708709Tk использует формат имени шрифта в виде списка, например710711`{courier 10 bold}`712713. Размеры шрифта с положительными числами измеряются в пунктах; с отрицательными – в пикселях.714715**геометрия**716717Это строка вида718719`widthxheight`720721, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например:722723`fred["geometry"] = "200x100"`724725.726727**выравнивание**728729Допустимые значения – строки:730731`"left"`732733,734735`"center"`736737,738739`"right"`740741и742743`"fill"`744745.746747**регион**748749Это строка из четырёх разделённых пробелами элементов, каждый из которых является допустимым расстоянием (см. выше). Например:750751`"2 3 4 5"`752753,754755`"3i 2i 4.5i 2i"`756757и758759`"3c 2c 4c 10.43c"`760761– все являются допустимыми областями.762763**рельеф**764765Определяет стиль рамки виджета. Допустимые значения:766767`"raised"`768769,770771`"sunken"`772773,774775`"flat"`776777,778779`"groove"`780781и782783`"ridge"`784785.786787**команда прокрутки**788789Это почти всегда метод790791`set()`792793какого-либо виджета полосы прокрутки, но может быть любым методом виджета, принимающим один аргумент.794795**wrap:**796797Должно быть одним из:798799`"none"`800801,802803`"char"`804805или806807`"word"`808809.810811### 25.1.6.7. Привязки и события812813Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:814815```python816def bind(self, sequence, func, add=''):817```818819где:820821**последовательность**822823это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).824825**функция**826827– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются828829*колбэками*830831.)832833**добавить**834835является необязательным, может быть836837`''`838839или840841`'+'`842843. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача844845`'+'`846847означает, что эта функция добавляется в список функций, привязанных к данному типу события.848849Например:850851```python852def turn_red(self, event):853 event.widget["activeforeground"] = "red"854855self.button.bind("<Enter>", self.turn_red)856```857858Обратите внимание, как поле widget объекта события используется в `turn_red()` колбэке. Это поле содержит виджет, который перехватил событие X. В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как они обозначаются в Tk; это может пригодиться при обращении к страницам руководства Tk.859860| Tk | Поле события Tkinter | Tk | Поле события Tkinter |861| --- | --- | --- | --- |862| %f | фокус | %A | char |863| %h | рост | %E | send\_event |864| %k | keycode | %K | keysym |865| %s | состояние | %N | keysym\_num |866| %t | time | %T | тип |867| %w | ширина | %W | виджет |868| %x | x | %X | x\_root |869| %y | y | %Y | y\_root |870871### 25.1.6.8. Параметр index872873Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.874875**Индексы виджета Entry (index, view index и т.д.)**876877Виджеты Entry имеют опции, относящиеся к позициям символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции878879[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)880881:882883**Индексы виджета Text**884885Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.886887**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**888889Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:890891- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;892- строку `"active"`, которая указывает на позицию меню, находящуюся в данный момент под курсором;893- строку `"last"`, которая указывает на последний пункт меню;894- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;895- строку `"none"`, которая указывает на отсутствие какого-либо пункта меню, чаще всего используется с menu.activate() для деактивации всех пунктов, и наконец,896- текстовую строку, которая сопоставляется с образцом с меткой пункта меню при сканировании сверху вниз. Обратите внимание, что этот тип индекса рассматривается после всех остальных, что означает, что совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.897898### 25.1.6.9. Изображения899900Растровые изображения создаются через подклассы `tkinter.Image`:901902- `BitmapImage` можно использовать для данных X11 bitmap.903- `PhotoImage` можно использовать для цветных растровых изображений GIF и PPM/PGM.904905Оба типа изображений создаются с помощью опции `file` или `data` (доступны и другие опции).906907Затем объект изображения можно использовать везде, где какой-либо виджет (например, метки, кнопки, меню) поддерживает опцию `image`. В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка на объект изображения из Python, данные изображения также удаляются, и Tk отображает пустой прямоугольник везде, где использовалось изображение.908909## 25.1.7. Обработчики файлов910911Tk позволяет регистрировать и удалять функцию обратного вызова, которая будет вызываться из главного цикла Tk, когда возможен ввод-вывод на файловом дескрипторе. Для каждого файлового дескриптора можно зарегистрировать только один обработчик. Пример кода:912913```python914import tkinter915widget = tkinter.Tk()916mask = tkinter.READABLE | tkinter.WRITABLE917widget.tk.createfilehandler(file, mask, callback)918...919widget.tk.deletefilehandler(file)920```921922Эта функция недоступна в Windows.923924Поскольку неизвестно, сколько байт доступно для чтения, не рекомендуется использовать методы [`BufferedIOBase`](https://python-all.ru/3.5/library/io.html#io.BufferedIOBase) или [`TextIOBase`](https://python-all.ru/3.5/library/io.html#io.TextIOBase) [`read()`](https://python-all.ru/3.5/library/io.html#io.BufferedIOBase.read) или [`readline()`](https://python-all.ru/3.5/library/io.html#io.IOBase.readline), так как они будут читать строго заданное количество байт. Для сокетов подойдут методы [`recv()`](https://python-all.ru/3.5/library/socket.html#socket.socket.recv) или [`recvfrom()`](https://python-all.ru/3.5/library/socket.html#socket.socket.recvfrom); для других файлов используйте необработанное чтение или `os.read(file.fileno(), maxbytecount)`.925926#### `Widget.tk.createfilehandler(file, mask, func)`927928Регистрирует функцию обратного вызова обработчика файла *func*. Аргумент *file* может быть объектом с методом [`fileno()`](https://python-all.ru/3.5/library/io.html#io.IOBase.fileno) (например, файлом или сокетом), либо целочисленным файловым дескриптором. Аргумент *mask* представляет собой комбинацию (побитовое ИЛИ) любых из трёх констант ниже. Колбэк вызывается следующим образом:929930```python931callback(file, mask)932```933934#### `Widget.tk.deletefilehandler(file)`935936Удаляет обработчик файла.937938#### `tkinter.READABLE`939940#### `tkinter.WRITABLE`941942#### `tkinter.EXCEPTION`943944Константы, используемые в аргументе *mask*.945