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

---

# 24.1. [`tkinter`](https://python-all.ru/3.2/library/tkinter.html#module-tkinter) – интерфейс Python к Tcl/Tk

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

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

## 24.1.1. Модули Tkinter

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

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

```python
import tkinter
```

Или, чаще:

```python
from tkinter import *
```

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

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

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

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

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

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

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

**`tkinter.colorchooser`**

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

**`tkinter.commondialog`**

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

**`tkinter.filedialog`**

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

**`tkinter.font`**

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

**`tkinter.messagebox`**

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

**`tkinter.simpledialog`**

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

**`tkinter.dnd`**

Поддержка перетаскивания (drag-and-drop) для

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

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

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

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

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

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

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

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

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

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

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

- Авторы настоятельно рекомендуют приобрести копию man-страниц Tk. В частности, man-страницы в каталоге `manN` наиболее полезны. Man-страницы `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.2/library/tkinter.html)**
>
> Руководство по Tcl/Tk на сайте www.tcl.tk.
>
> **[Домашняя страница ActiveState Tcl](https://python-all.ru/3.2/library/tkinter.html)**
>
> Разработка Tk/Tcl в основном ведется в ActiveState.
>
> **[Tcl и инструментарий Tk](https://python-all.ru/3.2/library/tkinter.html)**
>
> Книга Джона Остерхута, создателя Tcl.
>
> **[Практическое программирование на Tcl и Tk](https://python-all.ru/3.2/library/tkinter.html)**
>
> Энциклопедическая книга Брента Уэлча.

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

```python
from tkinter import *

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

    def createWidgets(self):
        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"] = "red"
        self.QUIT["command"] = self.quit

        self.QUIT.pack({"side": "left"})

        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi

        self.hi_there.pack({"side": "left"})

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

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

## 24.1.3. Очень краткий взгляд на Tcl/Tk

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

Примечания:

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

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

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

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

```python
classCommand newPathname options
```

***classCommand***

обозначает, какой виджет создавать (кнопку, метку, меню...)

***newPathname***

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

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

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

*корень (root)*

, называется

`.`

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

`.myApp.controlPanel.okButton`

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

***опции***

Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд 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` поля ввода текста, требуют аргументов для указания диапазона удаляемого текста.

## 24.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.2/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.2/library/tkinter.html#module-tkinter) являются подклассами Packer и наследуют все методы упаковки. См. документацию модуля [`tkinter.tix`](https://python-all.ru/3.2/library/tkinter.tix.html#module-tkinter.tix) для дополнительной информации о менеджере геометрии Form.

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

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

Сверху вниз:

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

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

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

.

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

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

[`tkinter`](https://python-all.ru/3.2/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.2/library/tkinter.html#module-tkinter)

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

**Tk (C)**

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

**Xlib (C)**

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

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

### 24.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`, метки – нет.

Опции, поддерживаемые данным виджетом, перечислены на его man-странице, или их можно запросить во время выполнения, вызвав метод `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')}
```

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

### 24.1.6.2. Packer

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

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

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

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

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

### 24.1.6.3. Параметры Packer

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

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

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

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

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

`0`

или

`1`

.

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

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

`'x'`

,

`'y'`

,

`'both'`

,

`'none'`

.

**ipadx и ipady**

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

**padx и pady**

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

**сторона**

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

`'left'`

,

`'right'`

,

`'top'`

,

`'bottom'`

.

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

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

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

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

Например:

```python
class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, 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())
```

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

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

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

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

```python
from tkinter import *
class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

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

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

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

### 24.1.6.6. Типы данных параметров Tk

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

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

`"n"`

,

`"ne"`

,

`"e"`

,

`"se"`

,

`"s"`

,

`"sw"`

,

`"w"`

,

`"nw"`

, а также

`"center"`

.

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

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

`'error'`

,

`'gray25'`

,

`'gray50'`

,

`'hourglass'`

,

`'info'`

,

`'questhead'`

,

`'question'`

,

`'warning'`

. Чтобы указать имя файла битовой карты X, укажите полный путь к файлу, перед которым ставится

`@`

, например

`"@/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()`

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

**перенос:**

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

`"none"`

,

`"char"`

или

`"word"`

.

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

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

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

где:

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

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

**функция**

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

*колбэками*

.)

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

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

`''`

или

`'+'`

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

`'+'`

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

Например:

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

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

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

| 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 |

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

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

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

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

**AtEnd()**

относится к последней позиции в тексте

**AtInsert()**

относится к точке, где находится текстовый курсор

**AtSelFirst()**

указывает начальную точку выделенного текста

**AtSelLast()**

обозначает последнюю точку выделенного текста и, наконец,

**At(x\[, y\])**

относится к символу по координатам пикселей

*x*

,

*y*

(при этом

*y*

не используется в случае виджета ввода текста, который содержит одну строку текста).

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

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

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

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

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

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

Растровые изображения (Bitmap/Pixelmap) можно создавать через подклассы `tkinter.Image`:

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

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

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