> **Источник:** https://python-all.ru/3.5/library/tkinter.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 25.1. [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) – интерфейс Python для Tcl/Tk

**Исходный код:** [Lib/tkinter/\_\_init\_\_.py](https://python-all.ru/src/3.5/Lib/tkinter/__init__.py)

---

Пакет [`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.

> **См. также**
>
> **[Ресурсы Python Tkinter](https://python-all.ru/3.5/library/tkinter.html)**
>
> В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.
>
> **[TKDocs](https://python-all.ru/3.5/library/tkinter.html)**
>
> Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.
>
> **[Справочник по Tkinter: графический интерфейс для Python](https://python-all.ru/3.5/library/tkinter.html)**
>
> Онлайн-справочные материалы.
>
> **[Документация Tkinter от effbot](https://python-all.ru/3.5/library/tkinter.html)**
>
> Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.
>
> **[Руководство по Tcl/Tk](https://python-all.ru/3.5/library/tkinter.html)**
>
> Официальное руководство для последней версии Tcl/Tk.
>
> **[Программирование на Python](https://python-all.ru/3.5/library/tkinter.html)**
>
> Книга Марка Лутца, в которой прекрасно освещается Tkinter.
>
> **[Современный Tkinter для занятых разработчиков Python](https://python-all.ru/3.5/library/tkinter.html)**
>
> Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.
>
> **[Программирование на Python и Tkinter](https://python-all.ru/3.5/library/tkinter.html)**
>
> Книга Джона Грейсона (ISBN 1-884777-81-3).

## 25.1.1. Модули Tkinter

В большинстве случаев вам достаточно [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter), но также доступен ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем `_tkinter`. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться напрямую программистами приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.

В дополнение к модулю интерфейса 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:

```python
import tkinter
```

Или, чаще:

```python
from tkinter import *
```

#### `class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)`

Класс [`Tk`](https://python-all.ru/3.5/library/tkinter.html#tkinter.Tk) создается без аргументов. Это создает виджет верхнего уровня Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.

#### `tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)`

Функция [`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()`.

Другие модули, обеспечивающие поддержку Tk, включают:

**[`tkinter.scrolledtext`](https://python-all.ru/3.5/library/tkinter.scrolledtext.html#module-tkinter.scrolledtext)**

Текстовый виджет со встроенной вертикальной полосой прокрутки.

**`tkinter.colorchooser`**

Диалоговое окно для выбора цвета пользователем.

**`tkinter.commondialog`**

Базовый класс для диалогов, определённых в других перечисленных здесь модулях.

**`tkinter.filedialog`**

Стандартные диалоги для указания файла для открытия или сохранения.

**`tkinter.font`**

Утилиты для работы со шрифтами.

**`tkinter.messagebox`**

Доступ к стандартным диалоговым окнам Tk.

**`tkinter.simpledialog`**

Базовые диалоги и вспомогательные функции.

**`tkinter.dnd`**

Поддержка перетаскивания для

[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)

. Эта функция экспериментальная и будет объявлена устаревшей, когда ее заменит Tk DND.

**[`turtle`](https://python-all.ru/3.5/library/turtle.html#module-turtle)**

Черепашья графика в окне Tk.

## 25.1.2. Спасательный круг Tkinter

Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.

Благодарности:

- Tk был написан Джоном Аустерхутом во время его работы в Беркли.
- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.
- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.
- HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.
- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.
- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.

### 25.1.2.1. Как использовать этот раздел

Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.

При попытке ответить на вопросы вида «как сделать то-то» часто лучше сначала выяснить, как сделать «то-то» в чистом Tk, а затем преобразовать это в соответствующий вызов [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter). Python-программисты часто могут догадаться о правильной команде Python, глядя на документацию Tk. Это означает, что для использования Tkinter необходимо немного знать Tk. Настоящий документ не может выполнить эту роль, поэтому лучшее, что можно сделать, – указать на лучшую существующую документацию. Вот несколько подсказок:

- Авторы настоятельно рекомендуют приобрести копию страниц руководства Tk (man pages). В частности, наиболее полезны страницы руководства в каталоге `manN`. Страницы руководства `man3` описывают интерфейс C к библиотеке Tk и поэтому не особенно полезны для разработчиков скриптов.
- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.
- `tkinter/__init__.py` является последним средством для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.

> **См. также**
>
> **[Страницы руководства Tcl/Tk 8.6](https://python-all.ru/3.5/library/tkinter.html)**
>
> Руководство по Tcl/Tk на сайте www.tcl.tk.
>
> **[Домашняя страница ActiveState Tcl](https://python-all.ru/3.5/library/tkinter.html)**
>
> Разработка Tk/Tcl в основном ведется в ActiveState.
>
> **[Tcl и инструментарий Tk](https://python-all.ru/3.5/library/tkinter.html)**
>
> Книга Джона Оустерхута, создателя Tcl.
>
> **[Практическое программирование на Tcl и Tk](https://python-all.ru/3.5/library/tkinter.html)**
>
> Энциклопедическая книга Брента Уэлча.

### 25.1.2.2. Простая программа Hello World

```python
import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=root.destroy)
        self.quit.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()
```

## 25.1.3. Очень краткий обзор Tcl/Tk

Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.

Примечания:

- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.
- Класс [`Tk`](https://python-all.ru/3.5/library/tkinter.html#tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно – система создаёт его всякий раз, когда создаётся экземпляр любого из других классов.
- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов с целью создания «настоящих» виджетов (в C++ это называется «абстрактный класс»).

Чтобы воспользоваться этим справочным материалом, иногда потребуется уметь читать короткие фрагменты 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) эквивалентов того, что описано ниже.)

Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.

Чтобы создать виджет в Tk, команда всегда имеет следующий вид:

```python
classCommand newPathname options
```

***classCommand***

Обозначает тип создаваемого виджета (кнопка, метка, меню…).

***newPathname***

– это новое имя для данного виджета. Все имена в Tk должны быть уникальными. Чтобы обеспечить это, виджеты в Tk именуются с помощью

*путевых имён*

, как файлы в файловой системе. Виджет верхнего уровня,

*корень*

, называется

`.`

(точка), а дочерние элементы разделяются дополнительными точками. Например,

`.myApp.controlPanel.okButton`

может быть именем виджета.

***options***

Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.

Например:

```python
button   .fred   -fg red -text "hi there"
   ^       ^     \______________________/
   |       |                |
 class    new            options
command  widget  (-opt val -opt val ...)
```

После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:

```python
.fred someAction someOptions
```

Обратите внимание, что имя объекта `.fred` начинается с точки.

Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).

Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие, например команда `delete` поля ввода текста, нуждаются в аргументах для указания диапазона удаляемого текста.

## 25.1.4. Отображение базового Tk в Tkinter

Команды классов в Tk соответствуют конструкторам классов в Tkinter.

```python
button .fred                =====>  fred = Button()
```

Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.

```python
button .panel.fred          =====>  fred = Button(panel)
```

Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [Установка параметров](https://python-all.ru/3.5/library/tkinter.html#tkinter-setting-options) о настройке параметров.

```python
button .fred -fg red        =====>  fred = Button(panel, fg="red")
.fred configure -fg red     =====>  fred["fg"] = red
                            OR ==>  fred.config(fg="red")
```

В Tk для выполнения действия над виджетом используйте имя виджета как команду, затем укажите имя действия, возможно с аргументами (параметрами). В Tkinter методы вызываются на экземпляре класса для выполнения действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в `tkinter/__init__.py`.

```python
.fred invoke                =====>  fred.invoke()
```

Чтобы передать виджет упаковщику (менеджеру геометрии), вызывают 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.

```python
pack .fred -side left       =====>  fred.pack(side="left")
```

## 25.1.5. Как связаны Tk и Tkinter

Сверху вниз:

**Ваше приложение здесь (Python)**

Приложение на Python делает вызов

[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)

.

**tkinter (пакет Python)**

Этот вызов (например, создание виджета-кнопки) реализован в пакете

[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)

, который написан на Python. Эта функция на Python разбирает команды и аргументы и преобразует их в форму, которая выглядит так, как будто они пришли из скрипта Tk, а не из скрипта Python.

**\_tkinter (C)**

Эти команды и их аргументы будут переданы C-функции в модуле расширения

`_tkinter`

(обратите внимание на подчёркивание).

**Tk Widgets (C и Tcl)**

Эта C-функция может вызывать другие модули C, включая C-функции, составляющие библиотеку Tk. Tk реализован на C и частично на Tcl. Часть Tcl в виджетах Tk используется для привязки определённого поведения по умолчанию к виджетам и выполняется один раз в момент импорта пакета Python

[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)

. (Пользователь никогда не видит этот этап.)

**Tk (C)**

Часть Tk в Tk Widgets реализует окончательное отображение на …

**Xlib (C)**

библиотека Xlib для рисования графики на экране.

## 25.1.6. Удобный справочник

### 25.1.6.1. Установка параметров

Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:

**При создании объекта – с помощью именованных аргументов**

```python
fred = Button(self, fg="red", bg="blue")
```

**После создания объекта – используя имя параметра как индекс словаря**

```python
fred["fg"] = "red"
fred["bg"] = "blue"
```

**Использовать метод config() для обновления нескольких атрибутов после создания объекта**

```python
fred.config(fg="red", bg="blue")
```

Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.

Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице *options(3)*.

В этом документе не делается различий между стандартными и специфичными для виджета параметрами. Некоторые параметры не применимы к некоторым типам виджетов. Реагирует ли данный виджет на определённый параметр, зависит от класса виджета: кнопки имеют параметр `command`, а метки – нет.

Опции, поддерживаемые данным виджетом, перечислены на странице руководства этого виджета, или их можно получить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` для этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.

Некоторые параметры, например `bg`, являются синонимами распространённых параметров с длинными именами (`bg` – сокращение для «background»). При передаче методу `config()` имени сокращённого параметра будет возвращён 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж содержит имя синонима и «реальный» параметр (например, `('bg', 'background')`).

| Индекс | Значение | Пример |
| --- | --- | --- |
| 0 | имя параметра | `'relief'` |
| 1 | имя параметра для поиска в базе данных | `'relief'` |
| 2 | класс параметра для поиска в базе данных | `'Relief'` |
| 3 | значение по умолчанию | `'raised'` |
| 4 | текущее значение | `'groove'` |

Пример:

```python
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
```

Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.

### 25.1.6.2. Упаковщик

Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *выше*, *слева от*, *заполнение* и т.д. – и самостоятельно вычисляет точные координаты размещения.

Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.

Обратите внимание, что виджеты не отображаются, пока их геометрия не задана с помощью менеджера геометрии. Это распространенная ошибка новичков – пропустить задание геометрии и потом удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применен, например, метод `pack()` упаковщика.

Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:

```python
fred.pack()                     # по умолчанию side = "top"
fred.pack(side="left")
fred.pack(expand=1)
```

### 25.1.6.3. Параметры упаковщика

За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.

**привязка**

Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.

**расширение**

Логическое значение,

`0`

или

`1`

.

**заполнение**

Допустимые значения:

`'x'`

,

`'y'`

,

`'both'`

,

`'none'`

.

**ipadx и ipady**

Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.

**padx и pady**

Расстояние – задает внешний отступ с каждой стороны дочернего виджета.

**сторона**

Допустимые значения:

`'left'`

,

`'right'`

,

`'top'`

,

`'bottom'`

.

### 25.1.6.4. Связывание переменных виджетов

Текущее значение некоторых виджетов (например, виджетов ввода текста) может быть напрямую связано с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Такая связь работает в обе стороны: если переменная изменяется по какой-либо причине, связанный с ней виджет обновится, отображая новое значение.

К сожалению, в текущей реализации [`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).

Уже определено много полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – метод `set()`. При соблюдении этого протокола виджет всегда будет отслеживать значение переменной без дополнительного вмешательства.

Например:

```python
class App(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

        self.entrythingy = Entry()
        self.entrythingy.pack()

        # здесь находится переменная приложения
        self.contents = StringVar()
        # установить её в какое-либо значение
        self.contents.set("this is a variable")
        # указать виджету ввода следить за этой переменной
        self.entrythingy["textvariable"] = self.contents

        # и здесь мы получаем колбэк, когда пользователь нажимает Ввод.
        # заставим программу вывести значение
        # переменной приложения, когда пользователь нажимает Ввод
        self.entrythingy.bind('<Key-Return>',
                              self.print_contents)

    def print_contents(self, event):
        print("hi. contents of entry is now ---->",
              self.contents.get())
```

### 25.1.6.5. Менеджер окон

В Tk есть служебная команда `wm` для взаимодействия с менеджером окон. Опции команды `wm` позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В [`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter) эти команды реализованы как методы класса `Wm`. Виджеты верхнего уровня являются подклассами класса `Wm`, поэтому могут напрямую вызывать методы `Wm`.

Чтобы получить окно верхнего уровня, содержащее данный виджет, часто можно просто обратиться к родителю виджета. Однако если виджет упакован внутрь фрейма, родитель не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчеркивания, что указывает на то, что функция является частью реализации, а не интерфейсом к функциональности Tk.

Вот несколько примеров типичного использования:

```python
import tkinter as tk

class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

# создайте приложение
myapp = App()

#
# здесь вызовы методов класса оконного менеджера
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)

# запустите программу
myapp.mainloop()
```

### 25.1.6.6. Типы данных опций Tk

**привязка**

Допустимые значения – направления компаса:

`"n"`

,

`"ne"`

,

`"e"`

,

`"se"`

,

`"s"`

,

`"sw"`

,

`"w"`

,

`"nw"`

, а также

`"center"`

.

**битовая карта**

Существует восемь встроенных именованных битовых карт:

`'error'`

,

`'gray25'`

,

`'gray50'`

,

`'hourglass'`

,

`'info'`

,

`'questhead'`

,

`'question'`

,

`'warning'`

. Чтобы указать имя файла X bitmap, укажите полный путь к файлу, начинающийся с

`@`

, например

`"@/usr/contrib/bitmap/gumby.bit"`

.

**булевый**

Можно передать целые числа 0 или 1 или строки

`"yes"`

или

`"no"`

.

**колбэк**

Это любая функция Python, которая не принимает аргументов. Например:

```python
def print_it():
    print("hi there")
fred["command"] = print_it
```

**цвет**

Цвета могут быть заданы как имена X-цветов из файла rgb.txt, либо как строки, представляющие значения RGB в диапазонах: 4 бита:

`"#RGB"`

, 8 бит:

`"#RRGGBB"`

, 12 бит:

`"#RRRGGGBBB"`

, или 16 бит:

`"#RRRRGGGGBBBB"`

, где R,G,B здесь обозначают любые допустимые шестнадцатеричные цифры. Подробнее см. на странице 160 книги Оустерхаута.

**курсор**

Можно использовать стандартные имена курсоров X из

`cursorfont.h`

, без префикса

`XC_`

. Например, чтобы получить курсор-руку (

`XC_hand2`

), используйте строку

`"hand2"`

. Можно также указать собственный файл битовой карты и маски. См. страницу 179 книги Оустерхаута.

**расстояние**

Экранные расстояния можно указывать в пикселях или абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, где последний символ обозначает единицы:

`c`

для сантиметров,

`i`

для дюймов,

`m`

для миллиметров,

`p`

для типографских пунктов. Например, 3,5 дюйма записывается как

`"3.5i"`

.

**шрифт**

Tk использует формат имени шрифта в виде списка, например

`{courier 10 bold}`

. Размеры шрифта с положительными числами измеряются в пунктах; с отрицательными – в пикселях.

**геометрия**

Это строка вида

`widthxheight`

, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например:

`fred["geometry"] = "200x100"`

.

**выравнивание**

Допустимые значения – строки:

`"left"`

,

`"center"`

,

`"right"`

и

`"fill"`

.

**регион**

Это строка из четырёх разделённых пробелами элементов, каждый из которых является допустимым расстоянием (см. выше). Например:

`"2 3 4 5"`

,

`"3i 2i 4.5i 2i"`

и

`"3c 2c 4c 10.43c"`

– все являются допустимыми областями.

**рельеф**

Определяет стиль рамки виджета. Допустимые значения:

`"raised"`

,

`"sunken"`

,

`"flat"`

,

`"groove"`

и

`"ridge"`

.

**команда прокрутки**

Это почти всегда метод

`set()`

какого-либо виджета полосы прокрутки, но может быть любым методом виджета, принимающим один аргумент.

**wrap:**

Должно быть одним из:

`"none"`

,

`"char"`

или

`"word"`

.

### 25.1.6.7. Привязки и события

Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:

```python
def bind(self, sequence, func, add=''):
```

где:

**последовательность**

это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).

**функция**

– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются

*колбэками*

.)

**добавить**

является необязательным, может быть

`''`

или

`'+'`

. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача

`'+'`

означает, что эта функция добавляется в список функций, привязанных к данному типу события.

Например:

```python
def turn_red(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turn_red)
```

Обратите внимание, как поле widget объекта события используется в `turn_red()` колбэке. Это поле содержит виджет, который перехватил событие X. В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как они обозначаются в Tk; это может пригодиться при обращении к страницам руководства Tk.

| Tk | Поле события Tkinter | Tk | Поле события Tkinter |
| --- | --- | --- | --- |
| %f | фокус | %A | char |
| %h | рост | %E | send\_event |
| %k | keycode | %K | keysym |
| %s | состояние | %N | keysym\_num |
| %t | time | %T | тип |
| %w | ширина | %W | виджет |
| %x | x | %X | x\_root |
| %y | y | %Y | y\_root |

### 25.1.6.8. Параметр index

Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.

**Индексы виджета Entry (index, view index и т.д.)**

Виджеты Entry имеют опции, относящиеся к позициям символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции

[`tkinter`](https://python-all.ru/3.5/library/tkinter.html#module-tkinter)

:

**Индексы виджета Text**

Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.

**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**

Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:

- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;
- строку `"active"`, которая указывает на позицию меню, находящуюся в данный момент под курсором;
- строку `"last"`, которая указывает на последний пункт меню;
- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;
- строку `"none"`, которая указывает на отсутствие какого-либо пункта меню, чаще всего используется с menu.activate() для деактивации всех пунктов, и наконец,
- текстовую строку, которая сопоставляется с образцом с меткой пункта меню при сканировании сверху вниз. Обратите внимание, что этот тип индекса рассматривается после всех остальных, что означает, что совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.

### 25.1.6.9. Изображения

Растровые изображения создаются через подклассы `tkinter.Image`:

- `BitmapImage` можно использовать для данных X11 bitmap.
- `PhotoImage` можно использовать для цветных растровых изображений GIF и PPM/PGM.

Оба типа изображений создаются с помощью опции `file` или `data` (доступны и другие опции).

Затем объект изображения можно использовать везде, где какой-либо виджет (например, метки, кнопки, меню) поддерживает опцию `image`. В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка на объект изображения из Python, данные изображения также удаляются, и Tk отображает пустой прямоугольник везде, где использовалось изображение.

## 25.1.7. Обработчики файлов

Tk позволяет регистрировать и удалять функцию обратного вызова, которая будет вызываться из главного цикла Tk, когда возможен ввод-вывод на файловом дескрипторе. Для каждого файлового дескриптора можно зарегистрировать только один обработчик. Пример кода:

```python
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
```

Эта функция недоступна в Windows.

Поскольку неизвестно, сколько байт доступно для чтения, не рекомендуется использовать методы [`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)`.

#### `Widget.tk.createfilehandler(file, mask, func)`

Регистрирует функцию обратного вызова обработчика файла *func*. Аргумент *file* может быть объектом с методом [`fileno()`](https://python-all.ru/3.5/library/io.html#io.IOBase.fileno) (например, файлом или сокетом), либо целочисленным файловым дескриптором. Аргумент *mask* представляет собой комбинацию (побитовое ИЛИ) любых из трёх констант ниже. Колбэк вызывается следующим образом:

```python
callback(file, mask)
```

#### `Widget.tk.deletefilehandler(file)`

Удаляет обработчик файла.

#### `tkinter.READABLE`

#### `tkinter.WRITABLE`

#### `tkinter.EXCEPTION`

Константы, используемые в аргументе *mask*.
