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

tkinter.md

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

1> **Источник:** https://python-all.ru/2.7/library/tkinter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 24.1. [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) – интерфейс Python к Tcl/Tk89Модуль [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) («интерфейс Tk») – это стандартный интерфейс Python к инструментарию Tk GUI. И Tk, и [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) доступны на большинстве Unix-платформ, а также в Windows. (Tk сам по себе не является частью Python; он поддерживается ActiveState.)1011Запуск `python -m Tkinter` из командной строки должен открыть окно, демонстрирующее простой интерфейс Tk, показывая, что [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) корректно установлен в системе, а также отображая версию Tcl/Tk, чтобы можно было прочитать документацию Tcl/Tk, соответствующую этой версии.1213> **Примечание**14>15> В Python 3 [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) переименован в `tkinter`. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходного кода к Python 3.1617> **См. также**18>19> Документация Tkinter:20>21> **[Ресурсы Python Tkinter](https://python-all.ru/2.7/library/tkinter.html)**22>23> В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.24>25> **[TKDocs](https://python-all.ru/2.7/library/tkinter.html)**26>27> Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.28>29> **[Справочник по Tkinter 8.5: GUI для Python](https://python-all.ru/2.7/library/tkinter.html)**30>31> Онлайн-справочные материалы.32>33> **[Документация Tkinter от effbot](https://python-all.ru/2.7/library/tkinter.html)**34>35> Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.36>37> **[Программирование на Python](https://python-all.ru/2.7/library/tkinter.html)**38>39> Книга Марка Лутца, в которой прекрасно освещается Tkinter.40>41> **[Современный Tkinter для занятых разработчиков Python](https://python-all.ru/2.7/library/tkinter.html)**42>43> Книга Марка Роземана о создании привлекательных и современных графических интерфейсов пользователя с помощью Python и Tkinter.44>45> **[Программирование на Python и Tkinter](https://python-all.ru/2.7/library/tkinter.html)**46>47> Книга Джона Грейсона (ISBN 1-884777-81-3).48>49> Документация Tcl/Tk:50>51> **[Команды Tk](https://python-all.ru/2.7/library/tkinter.html)**52>53> Большинство команд доступны как классы [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) или `Tkinter.ttk`. Измените '8.6' в соответствии с версией вашей установки Tcl/Tk.54>55> **[Новые man-страницы Tcl/Tk](https://python-all.ru/2.7/library/tkinter.html)**56>57> Последние руководства Tcl/Tk на www.tcl.tk.58>59> **[Домашняя страница ActiveState Tcl](https://python-all.ru/2.7/library/tkinter.html)**60>61> Разработка Tk/Tcl в основном ведется в ActiveState.62>63> **[Tcl и инструментарий Tk](https://python-all.ru/2.7/library/tkinter.html)**64>65> Книга Джона Оустерхута, создателя Tcl.66>67> **[Практическое программирование на Tcl и Tk](https://python-all.ru/2.7/library/tkinter.html)**68>69> Энциклопедическая книга Брента Уэлча.7071## 24.1.1. Модули Tkinter7273В большинстве случаев достаточно модуля [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter), но также доступен ряд дополнительных модулей. Интерфейс Tk находится в бинарном модуле `_tkinter`. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться напрямую прикладными программистами. Обычно это общая библиотека (DLL), но в некоторых случаях может быть статически слинкована с интерпретатором Python.7475Помимо модуля интерфейса Tk, [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) включает несколько модулей Python. Два самых важных – сам модуль [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) и модуль `Tkconstants`. Первый автоматически импортирует второй, поэтому для использования Tkinter достаточно импортировать один модуль:7677```python78import Tkinter79```8081Или, чаще:8283```python84from Tkinter import *85```8687#### `class Tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)`8889Класс [`Tk`](https://python-all.ru/2.7/library/tkinter.html#Tkinter.Tk) создается без аргументов. Это создает виджет верхнего уровня Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.9091Изменено в версии 2.4: Добавлен параметр *useTk*.9293#### `Tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)`9495Функция [`Tcl()`](https://python-all.ru/2.7/library/tkinter.html#Tkinter.Tcl) является фабричной функцией, которая создаёт объект, очень похожий на создаваемый классом [`Tk`](https://python-all.ru/2.7/library/tkinter.html#Tkinter.Tk), за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при управлении интерпретатором Tcl в среде, где не требуется создавать лишние окна верхнего уровня, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный объектом [`Tcl()`](https://python-all.ru/2.7/library/tkinter.html#Tkinter.Tcl), может создать окно верхнего уровня (и инициализировать подсистему Tk) с помощью вызова его метода `loadtk()`.9697Новое в версии 2.4.9899Другие модули, обеспечивающие поддержку Tk, включают:100101**[`ScrolledText`](https://python-all.ru/2.7/library/scrolledtext.html#module-ScrolledText)**102103Текстовый виджет со встроенной вертикальной полосой прокрутки.104105**`tkColorChooser`**106107Диалоговое окно для выбора цвета пользователем.108109**`tkCommonDialog`**110111Базовый класс для диалогов, определённых в других перечисленных здесь модулях.112113**`tkFileDialog`**114115Стандартные диалоги для указания файла для открытия или сохранения.116117**`tkFont`**118119Утилиты для работы со шрифтами.120121**`tkMessageBox`**122123Доступ к стандартным диалоговым окнам Tk.124125**`tkSimpleDialog`**126127Базовые диалоги и вспомогательные функции.128129**`Tkdnd`**130131Поддержка перетаскивания для [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter). Экспериментально и должно стать устаревшим после замены на Tk DND.132133**[`turtle`](https://python-all.ru/2.7/library/turtle.html#module-turtle)**134135Черепашья графика в окне Tk.136137В Python 3 они также были переименованы и стали подмодулями нового пакета `tkinter`.138139## 24.1.2. Спасательный круг Tkinter140141Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.142143Благодарности:144145- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.146- Tk был написан Джоном Аустерхутом во время его работы в Беркли.147- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.148- HTML-рендеринг и некоторая редакционная правка выполнены на основе версии FrameMaker Кена Манхаймера.149- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.150- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.151152### 24.1.2.1. Как использовать этот раздел153154Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.155156При попытке ответить на вопросы типа «как мне сделать то-то», часто лучше всего выяснить, как сделать это «то-то» на чистом Tk, а затем преобразовать это в соответствующий вызов [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter). Программисты на Python часто могут угадать правильную команду Python, взглянув на документацию Tk. Это означает, что для использования Tkinter придётся немного знать Tk. Данный документ не может выполнить эту роль, поэтому лучшее, что можно сделать – указать на лучшую существующую документацию. Вот несколько советов:157158- Авторы настоятельно рекомендуют заполучить копию man-страниц Tk. Наиболее полезны man-страницы из каталога `mann`. Страницы `man3` описывают интерфейс C к библиотеке Tk и поэтому не очень полезны для авторов скриптов.159- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.160- `Tkinter.py` – это крайняя мера для большинства, но может быть хорошим источником, когда ничего больше не помогает.161162### 24.1.2.2. Простая программа «Hello World»163164```python165from Tkinter import *166167class Application(Frame):168    def say_hi(self):169        print "hi there, everyone!"170171    def createWidgets(self):172        self.QUIT = Button(self)173        self.QUIT["text"] = "QUIT"174        self.QUIT["fg"]   = "red"175        self.QUIT["command"] =  self.quit176177        self.QUIT.pack({"side": "left"})178179        self.hi_there = Button(self)180        self.hi_there["text"] = "Hello",181        self.hi_there["command"] = self.say_hi182183        self.hi_there.pack({"side": "left"})184185    def __init__(self, master=None):186        Frame.__init__(self, master)187        self.pack()188        self.createWidgets()189190root = Tk()191app = Application(master=root)192app.mainloop()193root.destroy()194```195196## 24.1.3. Очень краткий обзор Tcl/Tk197198Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.199200Примечания:201202- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.203- Класс [`Tk`](https://python-all.ru/2.7/library/tkinter.html#Tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно – система создаёт его всякий раз, когда создаётся экземпляр любого из других классов.204- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов с целью создания «настоящих» виджетов (в C++ это называется «абстрактный класс»).205206Чтобы воспользоваться этим справочным материалом, иногда потребуется уметь читать короткие фрагменты Tk и распознавать различные части команды Tk. (Смотрите раздел [Отображение базового Tk в Tkinter](https://python-all.ru/2.7/library/tkinter.html#tkinter-basic-mapping) для [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) эквивалентов того, что описано ниже.)207208Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.209210Чтобы создать виджет в Tk, команда всегда имеет следующий вид:211212```python213classCommand newPathname options214```215216***classCommand***217218Обозначает тип создаваемого виджета (кнопка, метка, меню…).219220***newPathname***221222– это новое имя для данного виджета. Все имена в Tk должны быть уникальными. Чтобы обеспечить это, виджеты в Tk именуются с помощью *путевых имён*, как файлы в файловой системе. Виджет верхнего уровня, *корень*, называется `.` (точка), а дочерние элементы разделяются дополнительными точками. Например, `.myApp.controlPanel.okButton` может быть именем виджета.223224***опции***225226Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.227228Например:229230```python231button   .fred   -fg red -text "hi there"232   ^       ^     \_____________________/233   |       |                |234 class    new            options235command  widget  (-opt val -opt val ...)236```237238После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:239240```python241.fred someAction someOptions242```243244Обратите внимание, что имя объекта `.fred` начинается с точки.245246Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).247248Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие, например команда `delete` поля ввода текста, нуждаются в аргументах для указания диапазона удаляемого текста.249250## 24.1.4. Отображение базового Tk в Tkinter251252Команды классов в Tk соответствуют конструкторам классов в Tkinter.253254```python255button .fred                =====>  fred = Button()256```257258Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.259260```python261button .panel.fred          =====>  fred = Button(panel)262```263264Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [Установка параметров](https://python-all.ru/2.7/library/tkinter.html#tkinter-setting-options) о настройке параметров.265266```python267button .fred -fg red        =====>  fred = Button(panel, fg = "red")268.fred configure -fg red     =====>  fred["fg"] = red269                            OR ==>  fred.config(fg = "red")270```271272В Tk для выполнения действия над виджетом используется имя виджета как команда, а за ним следует имя действия, возможно, с аргументами (опциями). В Tkinter вызов методов экземпляра класса служит для вызова действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в модуле Tkinter.py.273274```python275.fred invoke                =====>  fred.invoke()276```277278Чтобы передать виджет менеджеру геометрии (packer), вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализованы как методы. Все виджеты в [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) являются подклассами Packer и поэтому наследуют все методы упаковки. Дополнительную информацию о менеджере геометрии Form см. в документации модуля [`Tix`](https://python-all.ru/2.7/library/tix.html#module-Tix).279280```python281pack .fred -side left       =====>  fred.pack(side = "left")282```283284## 24.1.5. Как связаны Tk и Tkinter285286Сверху вниз:287288**Ваше приложение здесь (Python)**289290Приложение на Python делает вызов [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter).291292**Tkinter (модуль Python)**293294Этот вызов (например, создание виджета-кнопки) реализован в модуле *Tkinter*, написанном на Python. Эта функция Python разбирает команды и аргументы и преобразует их в форму, выглядящую так, как будто они пришли из Tcl-скрипта, а не из Python.295296**tkinter (C)**297298Эти команды и их аргументы передаются C-функции в модуле расширения *tkinter* – обратите внимание на строчные буквы.299300**Tk Widgets (C и Tcl)**301302Эта C-функция способна вызывать другие C-модули, включая C-функции, составляющие библиотеку Tk. Tk реализован на C и частично на Tcl. Часть Tcl виджетов Tk используется для привязки определённых поведений по умолчанию к виджетам и выполняется один раз в момент импорта модуля Python [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter). (Пользователь никогда не видит этот этап.)303304**Tk (C)**305306Часть Tk в Tk Widgets реализует окончательное отображение на …307308**Xlib (C)**309310библиотека Xlib для рисования графики на экране.311312## 24.1.6. Удобный справочник313314### 24.1.6.1. Настройка параметров315316Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:317318**При создании объекта – с помощью именованных аргументов**319320```python321fred = Button(self, fg = "red", bg = "blue")322```323324**После создания объекта – используя имя параметра как индекс словаря**325326```python327fred["fg"] = "red"328fred["bg"] = "blue"329```330331**Использовать метод config() для обновления нескольких атрибутов после создания объекта**332333```python334fred.config(fg = "red", bg = "blue")335```336337Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.338339Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице *options(3)*.340341В этом документе не делается различий между стандартными и специфичными для виджета параметрами. Некоторые параметры не применимы к некоторым типам виджетов. Реагирует ли данный виджет на определённый параметр, зависит от класса виджета: кнопки имеют параметр `command`, а метки – нет.342343Опции, поддерживаемые данным виджетом, перечислены на странице руководства этого виджета, или их можно получить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` для этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.344345Некоторые параметры, например `bg`, являются синонимами распространённых параметров с длинными именами (`bg` – сокращение для «background»). При передаче методу `config()` имени сокращённого параметра будет возвращён 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж содержит имя синонима и «реальный» параметр (например, `('bg', 'background')`).346347| Индекс | Значение | Пример |348| --- | --- | --- |349| 0 | имя параметра | `'relief'` |350| 1 | имя параметра для поиска в базе данных | `'relief'` |351| 2 | класс параметра для поиска в базе данных | `'Relief'` |352| 3 | значение по умолчанию | `'raised'` |353| 4 | текущее значение | `'groove'` |354355Пример:356357```python358>>> print fred.config()359{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}360```361362Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.363364### 24.1.6.2. Упаковщик (Packer)365366Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *выше*, *слева от*, *заполнение* и т.д. – и самостоятельно вычисляет точные координаты размещения.367368Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.369370Обратите внимание, что виджеты не отображаются, пока их геометрия не задана с помощью менеджера геометрии. Это распространенная ошибка новичков – пропустить задание геометрии и потом удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применен, например, метод `pack()` упаковщика.371372Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:373374```python375fred.pack()                     # по умолчанию side = "top"376fred.pack(side = "left")377fred.pack(expand = 1)378```379380### 24.1.6.3. Параметры упаковщика381382За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.383384**привязка**385386Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.387388**расширение**389390Логическое значение, `0` или `1`.391392**заполнение**393394Допустимые значения: `'x'`, `'y'`, `'both'`, `'none'`.395396**ipadx и ipady**397398Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.399400**padx и pady**401402Расстояние – задает внешний отступ с каждой стороны дочернего виджета.403404**сторона**405406Допустимые значения: `'left'`, `'right'`, `'top'`, `'bottom'`.407408### 24.1.6.4. Привязка переменных виджетов409410Текущее значение некоторых виджетов (например, виджетов ввода текста) может быть напрямую связано с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Такая связь работает в обе стороны: если переменная изменяется по какой-либо причине, связанный с ней виджет обновится, отображая новое значение.411412К сожалению, в текущей реализации [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) невозможно передать произвольную переменную Python виджету через опцию `variable` или `textvariable`. Единственные переменные, с которыми это работает, – подклассы класса Variable, определённого в модуле [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter).413414Уже определено много полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – метод `set()`. При соблюдении этого протокола виджет всегда будет отслеживать значение переменной без дополнительного вмешательства.415416Например:417418```python419class App(Frame):420    def __init__(self, master=None):421        Frame.__init__(self, master)422        self.pack()423424        self.entrythingy = Entry()425        self.entrythingy.pack()426427        # здесь находится переменная приложения428        self.contents = StringVar()429        # установить её в какое-либо значение430        self.contents.set("this is a variable")431        # указать виджету ввода следить за этой переменной432        self.entrythingy["textvariable"] = self.contents433434        # и здесь мы получаем колбэк, когда пользователь нажимает Ввод.435        # заставим программу вывести значение436        # переменной приложения, когда пользователь нажимает Ввод437        self.entrythingy.bind('<Key-Return>',438                              self.print_contents)439440    def print_contents(self, event):441        print "hi. contents of entry is now ---->", \442              self.contents.get()443```444445### 24.1.6.5. Менеджер окон446447В Tk есть служебная команда `wm` для взаимодействия с менеджером окон. Опции команды `wm` позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter) эти команды реализованы как методы класса `Wm`. Виджеты верхнего уровня являются подклассами класса `Wm`, поэтому могут напрямую вызывать методы `Wm`.448449Чтобы получить окно верхнего уровня, содержащее данный виджет, часто можно просто обратиться к родителю виджета. Однако если виджет упакован внутрь фрейма, родитель не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчеркивания, что указывает на то, что функция является частью реализации, а не интерфейсом к функциональности Tk.450451Вот несколько примеров типичного использования:452453```python454from Tkinter import *455class App(Frame):456    def __init__(self, master=None):457        Frame.__init__(self, master)458        self.pack()459460# создайте приложение461myapp = App()462463#464# здесь вызовы методов класса оконного менеджера465#466myapp.master.title("My Do-Nothing Application")467myapp.master.maxsize(1000, 400)468469# запустите программу470myapp.mainloop()471```472473### 24.1.6.6. Типы данных параметров Tk474475**привязка**476477Допустимые значения – направления компаса: `"n"`, `"ne"`, `"e"`, `"se"`, `"s"`, `"sw"`, `"w"`, `"nw"`, а также `"center"`.478479**битовая карта**480481Существует восемь встроенных именованных битовых карт: `'error'`, `'gray25'`, `'gray50'`, `'hourglass'`, `'info'`, `'questhead'`, `'question'`, `'warning'`. Чтобы указать имя файла X bitmap, укажите полный путь к файлу, начинающийся с `@`, например `"@/usr/contrib/bitmap/gumby.bit"`.482483**булевый**484485Можно передать целые числа 0 или 1 или строки `"yes"` или `"no"`.486487**колбэк**488489Это любая функция Python, которая не принимает аргументов. Например:490491```python492def print_it():493        print "hi there"494fred["command"] = print_it495```496497**цвет**498499Цвета могут быть заданы как имена X-цветов из файла rgb.txt, либо как строки, представляющие значения RGB в диапазонах: 4 бита: `"#RGB"`, 8 бит: `"#RRGGBB"`, 12 бит: `"#RRRGGGBBB"`, или 16 бит: `"#RRRRGGGGBBBB"`, где R,G,B здесь обозначают любые допустимые шестнадцатеричные цифры. Подробнее см. на странице 160 книги Оустерхаута.500501**курсор**502503Можно использовать стандартные имена курсоров X из `cursorfont.h`, без префикса `XC_`. Например, чтобы получить курсор-руку (`XC_hand2`), используйте строку `"hand2"`. Можно также указать собственный файл битовой карты и маски. См. страницу 179 книги Оустерхаута.504505**расстояние**506507Экранные расстояния можно указывать в пикселях или абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, где последний символ обозначает единицы: `c` для сантиметров, `i` для дюймов, `m` для миллиметров, `p` для типографских пунктов. Например, 3,5 дюйма записывается как `"3.5i"`.508509**шрифт**510511Tk использует формат имени шрифта в виде списка, например `{courier 10 bold}`. Размеры шрифта с положительными числами измеряются в пунктах; с отрицательными – в пикселях.512513**геометрия**514515Это строка вида `widthxheight`, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например: `fred["geometry"] = "200x100"`.516517**выравнивание**518519Допустимые значения – строки: `"left"`, `"center"`, `"right"` и `"fill"`.520521**регион**522523Это строка из четырёх разделённых пробелами элементов, каждый из которых является допустимым расстоянием (см. выше). Например: `"2 3 4 5"`, `"3i 2i 4.5i 2i"` и `"3c 2c 4c 10.43c"` – все являются допустимыми областями.524525**рельеф**526527Определяет стиль рамки виджета. Допустимые значения: `"raised"`, `"sunken"`, `"flat"`, `"groove"` и `"ridge"`.528529**команда прокрутки**530531Почти всегда это метод `set()` какого-нибудь виджета полосы прокрутки, но это может быть любой метод виджета, принимающий один аргумент. Пример см. в файле `Demo/tkinter/matt/canvas-with-scrollbars.py` из дистрибутива исходного кода Python.532533**перенос:**534535Должно быть одним из: `"none"`, `"char"` или `"word"`.536537### 24.1.6.7. Привязки и события538539Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:540541```python542def bind(self, sequence, func, add=''):543```544545где:546547**последовательность**548549это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).550551**функция**552553– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются *колбэками*.)554555**добавить**556557является необязательным, может быть `''` или `'+'`. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача `'+'` означает, что эта функция добавляется в список функций, привязанных к данному типу события.558559Например:560561```python562def turnRed(self, event):563    event.widget["activeforeground"] = "red"564565self.button.bind("<Enter>", self.turnRed)566```567568Обратите внимание, как поле widget объекта события используется в `turnRed()` колбэке. Это поле содержит виджет, который перехватил событие X. В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как они обозначаются в Tk; это может пригодиться при обращении к страницам руководства Tk.569570```python571Tk      Tkinter Event Field             Tk      Tkinter Event Field572--      -------------------             --      -------------------573%f      focus                           %A      char574%h      height                          %E      send_event575%k      keycode                         %K      keysym576%s      state                           %N      keysym_num577%t      time                            %T      type578%w      width                           %W      widget579%x      x                               %X      x_root580%y      y                               %Y      y_root581```582583### 24.1.6.8. Параметр index584585Многие виджеты требуют передачи параметров «index». Они используются для указания на определённое место в виджете Text, или на определённые символы в виджете Entry, или на определённые пункты меню в виджете Menu.586587**Индексы виджета Entry (index, view index и т.д.)**588589Виджеты Entry имеют опции, относящиеся к позициям символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции [`Tkinter`](https://python-all.ru/2.7/library/tkinter.html#module-Tkinter):590591**AtEnd()**592593относится к последней позиции в тексте594595**AtInsert()**596597относится к точке, где находится текстовый курсор598599**AtSelFirst()**600601указывает начальную точку выделенного текста602603**AtSelLast()**604605обозначает последнюю точку выделенного текста и, наконец,606607**At(x\[, y\])**608609относится к символу по координатам пикселей *x*, *y* (при этом *y* не используется в случае виджета ввода текста, который содержит одну строку текста).610611**Индексы виджета Text**612613Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.614615**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**616617Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:618619- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;620- строку `'active'`, которая указывает на позицию меню, находящуюся в данный момент под курсором;621- строку `"last"`, которая указывает на последний пункт меню;622- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;623- строку `"none"`, которая указывает на отсутствие какого-либо пункта меню, чаще всего используется с menu.activate() для деактивации всех пунктов, и наконец,624- текстовую строку, которая сопоставляется с образцом с меткой пункта меню при сканировании сверху вниз. Обратите внимание, что этот тип индекса рассматривается после всех остальных, что означает, что совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.625626### 24.1.6.9. Изображения627628Изображения разных форматов можно создать через соответствующий подкласс `Tkinter.Image`:629630- `BitmapImage` для изображений в формате XBM.631- `PhotoImage` для изображений в форматах PGM, PPM, GIF и PNG. Последний поддерживается начиная с Tk 8.6.632633Оба типа изображений создаются с помощью опции `file` или `data` (доступны и другие опции).634635Затем объект изображения можно использовать везде, где какой-либо виджет (например, метки, кнопки, меню) поддерживает опцию `image`. В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка на объект изображения из Python, данные изображения также удаляются, и Tk отображает пустой прямоугольник везде, где использовалось изображение.636637> **См. также**638>639> Пакет [Pillow](https://python-all.ru/2.7/library/tkinter.html) добавляет поддержку форматов BMP, JPEG, TIFF, WebP и других.640641## 24.1.7. Обработчики файлов642643Tk позволяет регистрировать и удалять функцию обратного вызова, которая будет вызываться из главного цикла Tk, когда возможен ввод-вывод на файловом дескрипторе. Для каждого файлового дескриптора можно зарегистрировать только один обработчик. Пример кода:644645```python646import Tkinter647widget = Tkinter.Tk()648mask = Tkinter.READABLE | Tkinter.WRITABLE649widget.tk.createfilehandler(file, mask, callback)650...651widget.tk.deletefilehandler(file)652```653654Эта функция недоступна в Windows.655656Поскольку неизвестно, сколько байт доступно для чтения, не рекомендуется использовать методы [`BufferedIOBase`](https://python-all.ru/2.7/library/io.html#io.BufferedIOBase) или [`TextIOBase`](https://python-all.ru/2.7/library/io.html#io.TextIOBase) [`read()`](https://python-all.ru/2.7/library/io.html#io.BufferedIOBase.read) или [`readline()`](https://python-all.ru/2.7/library/io.html#io.IOBase.readline), так как они будут читать строго заданное количество байт. Для сокетов подойдут методы [`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) или [`recvfrom()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recvfrom); для других файлов используйте необработанное чтение или `os.read(file.fileno(), maxbytecount)`.657658#### `Widget.tk.createfilehandler(file, mask, func)`659660Регистрирует функцию обратного вызова обработчика файла *func*. Аргумент *file* может быть объектом с методом [`fileno()`](https://python-all.ru/2.7/library/io.html#io.IOBase.fileno) (например, файлом или сокетом), либо целочисленным файловым дескриптором. Аргумент *mask* представляет собой комбинацию (побитовое ИЛИ) любых из трёх констант ниже. Колбэк вызывается следующим образом:661662```python663callback(file, mask)664```665666#### `Widget.tk.deletefilehandler(file)`667668Удаляет обработчик файла.669670#### `Tkinter.READABLE`671672#### `Tkinter.WRITABLE`673674#### `Tkinter.EXCEPTION`675676Константы, используемые в аргументе *mask*.677