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

tkinter.md

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

1> **Источник:** https://python-all.ru/3.4/library/tkinter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 25.1. [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) – интерфейс Python к Tcl/Tk89Пакет [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) («интерфейс Tk») – это стандартный интерфейс Python к набору инструментов Tk GUI. И Tk, и [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) доступны на большинстве Unix-платформ, а также в системах Windows. (Tk сам по себе не является частью Python; он поддерживается компанией ActiveState.) Проверить, что [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) правильно установлен в вашей системе, можно, выполнив в командной строке `python -m tkinter`; должно открыться окно с демонстрацией простого интерфейса Tk.1011> **См. также**12>13> **[Ресурсы Python Tkinter](https://python-all.ru/3.4/library/tkinter.html)**14>15> В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.16>17> **[TKDocs](https://python-all.ru/3.4/library/tkinter.html)**18>19> Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.20>21> **[Справочник по Tkinter: графический интерфейс для Python](https://python-all.ru/3.4/library/tkinter.html)**22>23> Онлайн-справочные материалы.24>25> **[Документация Tkinter от effbot](https://python-all.ru/3.4/library/tkinter.html)**26>27> Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.28>29> **[Руководство по Tcl/Tk](https://python-all.ru/3.4/library/tkinter.html)**30>31> Официальное руководство для последней версии Tcl/Tk.32>33> **[Программирование на Python](https://python-all.ru/3.4/library/tkinter.html)**34>35> Книга Марка Лутца, в которой прекрасно освещается Tkinter.36>37> **[Современный Tkinter для занятых разработчиков Python](https://python-all.ru/3.4/library/tkinter.html)**38>39> Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.40>41> **[Программирование на Python и Tkinter](https://python-all.ru/3.4/library/tkinter.html)**42>43> Книга Джона Грейсона (ISBN 1-884777-81-3).4445## 25.1.1. Модули Tkinter4647В большинстве случаев [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) – это всё, что действительно нужно, но также доступен ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем `_tkinter`. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться напрямую программистами приложений. Обычно это разделяемая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.4849В дополнение к модулю интерфейса Tk, [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) включает ряд модулей Python, одним из наиболее важных является `tkinter.constants`. Импорт [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) автоматически импортирует `tkinter.constants`, поэтому обычно для использования Tkinter достаточно простого оператора import:5051```python52import tkinter53```5455Или, чаще:5657```python58from tkinter import *59```6061#### `class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)`6263Класс [`Tk`](https://python-all.ru/3.4/library/tkinter.html#tkinter.Tk) создаётся без аргументов. Это создаёт верхнеуровневый виджет Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.6465#### `tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)`6667Функция [`Tcl()`](https://python-all.ru/3.4/library/tkinter.html#tkinter.Tcl) является фабричной функцией, которая создаёт объект, очень похожий на тот, что создаётся классом [`Tk`](https://python-all.ru/3.4/library/tkinter.html#tkinter.Tk), за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при работе с интерпретатором Tcl в среде, где не нужно создавать лишние верхнеуровневые окна, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный функцией [`Tcl()`](https://python-all.ru/3.4/library/tkinter.html#tkinter.Tcl), может иметь окно Toplevel (и инициализированную подсистему Tk), созданное путём вызова его метода `loadtk()`.6869Другие модули, обеспечивающие поддержку Tk, включают:7071**[`tkinter.scrolledtext`](https://python-all.ru/3.4/library/tkinter.scrolledtext.html#module-tkinter.scrolledtext)**7273Текстовый виджет со встроенной вертикальной полосой прокрутки.7475**`tkinter.colorchooser`**7677Диалоговое окно для выбора цвета пользователем.7879**`tkinter.commondialog`**8081Базовый класс для диалогов, определённых в других перечисленных здесь модулях.8283**`tkinter.filedialog`**8485Стандартные диалоги для указания файла для открытия или сохранения.8687**`tkinter.font`**8889Утилиты для работы со шрифтами.9091**`tkinter.messagebox`**9293Доступ к стандартным диалоговым окнам Tk.9495**`tkinter.simpledialog`**9697Базовые диалоги и вспомогательные функции.9899**`tkinter.dnd`**100101Поддержка перетаскивания (drag-and-drop) для102103[`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter)104105. Это экспериментальная функция, которая должна стать устаревшей, когда будет заменена на Tk DND.106107**[`turtle`](https://python-all.ru/3.4/library/turtle.html#module-turtle)**108109Черепашья графика в окне Tk.110111## 25.1.2. Спасательный круг Tkinter112113Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.114115Благодарности:116117- Tk был написан Джоном Аустерхутом во время его работы в Беркли.118- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.119- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.120- HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.121- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.122- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.123124### 25.1.2.1. Как использовать этот раздел125126Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.127128При попытке ответить на вопросы вида «как сделать то-то», часто лучше всего выяснить, как сделать «то-то» в чистом Tk, а затем преобразовать это в соответствующий вызов [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter). Программисты на Python часто могут догадаться о правильной команде Python, посмотрев документацию Tk. Это означает, что для использования Tkinter нужно немного знать о Tk. Этот документ не может выполнять эту роль, поэтому лучшее, что мы можем сделать, – указать вам на лучшую существующую документацию. Вот несколько подсказок:129130- Авторы настоятельно рекомендуют приобрести копию man-страниц Tk. В частности, man-страницы в каталоге `manN` наиболее полезны. Man-страницы `man3` описывают интерфейс C к библиотеке Tk и поэтому не особенно полезны для разработчиков сценариев.131- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.132- `tkinter/__init__.py` – это крайнее средство для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.133134> **См. также**135>136> **[Страницы руководства Tcl/Tk 8.6](https://python-all.ru/3.4/library/tkinter.html)**137>138> Руководство по Tcl/Tk на сайте www.tcl.tk.139>140> **[Домашняя страница ActiveState Tcl](https://python-all.ru/3.4/library/tkinter.html)**141>142> Разработка Tk/Tcl в основном ведется в ActiveState.143>144> **[Tcl и инструментарий Tk](https://python-all.ru/3.4/library/tkinter.html)**145>146> Книга Джона Оустерхута, создателя Tcl.147>148> **[Практическое программирование на Tcl и Tk](https://python-all.ru/3.4/library/tkinter.html)**149>150> Энциклопедическая книга Брента Уэлча.151152### 25.1.2.2. Простая программа Hello World153154```python155import tkinter as tk156157class Application(tk.Frame):158    def __init__(self, master=None):159        tk.Frame.__init__(self, master)160        self.pack()161        self.createWidgets()162163    def createWidgets(self):164        self.hi_there = tk.Button(self)165        self.hi_there["text"] = "Hello World\n(click me)"166        self.hi_there["command"] = self.say_hi167        self.hi_there.pack(side="top")168169        self.QUIT = tk.Button(self, text="QUIT", fg="red",170                                            command=root.destroy)171        self.QUIT.pack(side="bottom")172173    def say_hi(self):174        print("hi there, everyone!")175176root = tk.Tk()177app = Application(master=root)178app.mainloop()179```180181## 25.1.3. Очень краткий обзор Tcl/Tk182183Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.184185Примечания:186187- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.188- Класс [`Tk`](https://python-all.ru/3.4/library/tkinter.html#tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно, система создаёт один экземпляр всякий раз, когда создаётся любой из других классов.189- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов, чтобы создавать «настоящие» виджеты (в C++ это называется «абстрактный класс»).190191Чтобы использовать этот справочный материал, иногда потребуется уметь читать короткие отрывки из Tk и определять различные части команды Tk. (Смотрите раздел [*Отображение базового Tk в Tkinter*](https://python-all.ru/3.4/library/tkinter.html#tkinter-basic-mapping) для [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter)-эквивалентов приведённого ниже.)192193Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.194195Чтобы создать виджет в Tk, команда всегда имеет следующий вид:196197```python198classCommand newPathname options199```200201***classCommand***202203обозначает, какой виджет создавать (кнопку, метку, меню...)204205***newPathname***206207это новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы помочь обеспечить это, виджеты в Tk именуются с помощью208209*путевых имён*210211, как файлы в файловой системе. Верхнеуровневый виджет,212213*корень (root)*214215, называется216217`.`218219(точка) и дочерние элементы разделяются дополнительными точками. Например,220221`.myApp.controlPanel.okButton`222223может быть именем виджета.224225***опции***226227Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.228229Например:230231```python232button   .fred   -fg red -text "hi there"233   ^       ^     \______________________/234   |       |                |235 class    new            options236command  widget  (-opt val -opt val ...)237```238239После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:240241```python242.fred someAction someOptions243```244245Обратите внимание, что имя объекта, `.fred`, начинается с точки.246247Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).248249Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие же, как команда `delete` поля ввода текста, требуют аргументов для указания диапазона удаляемого текста.250251## 25.1.4. Отображение базового Tk в Tkinter252253Команды классов в Tk соответствуют конструкторам классов в Tkinter.254255```python256button .fred                =====>  fred = Button()257```258259Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.260261```python262button .panel.fred          =====>  fred = Button(panel)263```264265Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [*Установка параметров*](https://python-all.ru/3.4/library/tkinter.html#tkinter-setting-options) о настройке параметров.266267```python268button .fred -fg red        =====>  fred = Button(panel, fg="red")269.fred configure -fg red     =====>  fred["fg"] = red270                            OR ==>  fred.config(fg="red")271```272273В Tk для выполнения действия над виджетом используется имя виджета как команда, за которым следует имя действия, возможно с аргументами (опциями). В Tkinter вызов методов экземпляра класса приводит к выполнению действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в `tkinter/__init__.py`.274275```python276.fred invoke                =====>  fred.invoke()277```278279Чтобы передать виджет упаковщику (менеджеру геометрии), вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализованы как методы. Все виджеты в [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) являются подклассами Packer и наследуют все методы упаковки. См. документацию модуля [`tkinter.tix`](https://python-all.ru/3.4/library/tkinter.tix.html#module-tkinter.tix) для дополнительной информации о менеджере геометрии Form.280281```python282pack .fred -side left       =====>  fred.pack(side="left")283```284285## 25.1.5. Как связаны Tk и Tkinter286287Сверху вниз:288289**Ваше приложение здесь (Python)**290291Приложение на Python выполняет вызов292293[`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter)294295.296297**tkinter (пакет Python)**298299Этот вызов (например, создание виджета-кнопки) реализован в пакете300301[`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter)302303, написанном на Python. Эта функция на Python разбирает команды и аргументы и преобразует их в форму, которая выглядит так, как если бы они пришли из скрипта Tk, а не из скрипта Python.304305**\_tkinter (C)**306307Эти команды и их аргументы передаются C-функции в модуле расширения308309`_tkinter`310311(обратите внимание на подчёркивание).312313**Tk Widgets (C и Tcl)**314315Эта C-функция может вызывать другие C-модули, включая C-функции, составляющие библиотеку Tk. Tk реализован на C и частично на Tcl. Tcl-часть виджетов Tk используется для привязки определённого поведения по умолчанию к виджетам и выполняется один раз при импорте пакета Python316317[`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter)318319. (Пользователь никогда не видит этот этап.)320321**Tk (C)**322323Часть Tk виджетов Tk реализует конечное отображение на ...324325**Xlib (C)**326327библиотека Xlib для рисования графики на экране.328329## 25.1.6. Удобный справочник330331### 25.1.6.1. Установка параметров332333Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:334335**При создании объекта – с помощью именованных аргументов**336337```python338fred = Button(self, fg="red", bg="blue")339```340341**После создания объекта – используя имя параметра как индекс словаря**342343```python344fred["fg"] = "red"345fred["bg"] = "blue"346```347348**Использовать метод config() для обновления нескольких атрибутов после создания объекта**349350```python351fred.config(fg="red", bg="blue")352```353354Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.355356Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице *options(3)*.357358В этом документе не делается различий между стандартными и специфическими для виджета опциями. Некоторые опции не применимы к некоторым типам виджетов. Реагирует ли данный виджет на конкретную опцию, зависит от класса виджета: кнопки имеют опцию `command`, метки – нет.359360Опции, поддерживаемые данным виджетом, перечислены на его man-странице, или их можно запросить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.361362Некоторые опции, например `bg`, являются синонимами распространённых опций с длинными именами (`bg` – сокращение от «background»). Передача методу `config()` имени сокращённой опции вернёт 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж будет содержать имя синонима и «настоящую» опцию (например, `('bg', 'background')`).363364| Индекс | Значение | Пример |365| --- | --- | --- |366| 0 | имя параметра | `'relief'` |367| 1 | имя параметра для поиска в базе данных | `'relief'` |368| 2 | класс параметра для поиска в базе данных | `'Relief'` |369| 3 | значение по умолчанию | `'raised'` |370| 4 | текущее значение | `'groove'` |371372Пример:373374```python375>>> print(fred.config())376{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}377```378379Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.380381### 25.1.6.2. Упаковщик382383Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *выше*, *слева от*, *заполнение* и т.д. – и самостоятельно вычисляет точные координаты размещения.384385Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.386387Обратите внимание, что виджеты не отображаются, пока для них не указана геометрия с помощью менеджера геометрии. Типичная ошибка новичков – пропустить указание геометрии, а затем удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применён, например, метод упаковщика `pack()`.388389Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:390391```python392fred.pack()                     # по умолчанию side = "top"393fred.pack(side="left")394fred.pack(expand=1)395```396397### 25.1.6.3. Параметры упаковщика398399За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.400401**привязка**402403Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.404405**расширение**406407Логическое значение,408409`0`410411или412413`1`414415.416417**заполнение**418419Допустимые значения:420421`'x'`422423,424425`'y'`426427,428429`'both'`430431,432433`'none'`434435.436437**ipadx и ipady**438439Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.440441**padx и pady**442443Расстояние – задает внешний отступ с каждой стороны дочернего виджета.444445**сторона**446447Допустимые значения:448449`'left'`450451,452453`'right'`454455,456457`'top'`458459,460461`'bottom'`462463.464465### 25.1.6.4. Связывание переменных виджетов466467Текущее значение некоторых виджетов (например, полей ввода текста) можно напрямую связать с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Эта связь работает в обе стороны: если переменная по какой-либо причине изменяется, виджет, к которому она привязана, обновляется, отражая новое значение.468469К сожалению, в текущей реализации [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) невозможно передать произвольную переменную Python виджету через опцию `variable` или `textvariable`. Единственные типы переменных, для которых это работает, – это переменные, являющиеся подклассами класса Variable, определённого в [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter).470471Уже определено много полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – вызовите метод `set()`. Если следовать этому протоколу, виджет будет всегда отслеживать значение переменной без дополнительных действий с вашей стороны.472473Например:474475```python476class App(Frame):477    def __init__(self, master=None):478        Frame.__init__(self, master)479        self.pack()480481        self.entrythingy = Entry()482        self.entrythingy.pack()483484        # здесь находится переменная приложения485        self.contents = StringVar()486        # установить её в какое-либо значение487        self.contents.set("this is a variable")488        # указать виджету ввода следить за этой переменной489        self.entrythingy["textvariable"] = self.contents490491        # и здесь мы получаем колбэк, когда пользователь нажимает Ввод.492        # заставим программу вывести значение493        # переменной приложения, когда пользователь нажимает Ввод494        self.entrythingy.bind('<Key-Return>',495                              self.print_contents)496497    def print_contents(self, event):498        print("hi. contents of entry is now ---->",499              self.contents.get())500```501502### 25.1.6.5. Менеджер окон503504В Tk есть служебная команда `wm` для взаимодействия с оконным менеджером. Опции команды `wm` позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В [`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter) эти команды реализованы как методы класса `Wm`. Виджеты верхнего уровня являются подклассами класса `Wm` и поэтому могут вызывать методы `Wm` напрямую.505506Чтобы получить окно верхнего уровня, содержащее данный виджет, можно часто просто обратиться к мастеру (master) виджета. Конечно, если виджет был упакован внутри фрейма, мастер не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчёркивания, чтобы обозначить, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.507508Вот несколько примеров типичного использования:509510```python511from tkinter import *512class App(Frame):513    def __init__(self, master=None):514        Frame.__init__(self, master)515        self.pack()516517# создайте приложение518myapp = App()519520#521# здесь вызовы методов класса оконного менеджера522#523myapp.master.title("My Do-Nothing Application")524myapp.master.maxsize(1000, 400)525526# запустите программу527myapp.mainloop()528```529530### 25.1.6.6. Типы данных опций Tk531532**привязка**533534Допустимые значения – стороны света:535536`"n"`537538,539540`"ne"`541542,543544`"e"`545546,547548`"se"`549550,551552`"s"`553554,555556`"sw"`557558,559560`"w"`561562,563564`"nw"`565566, а также567568`"center"`569570.571572**битовая карта**573574Существует восемь встроенных именованных битовых карт:575576`'error'`577578,579580`'gray25'`581582,583584`'gray50'`585586,587588`'hourglass'`589590,591592`'info'`593594,595596`'questhead'`597598,599600`'question'`601602,603604`'warning'`605606. Чтобы указать имя файла битовой карты X, укажите полный путь к файлу, перед которым ставится607608`@`609610, например611612`"@/usr/contrib/bitmap/gumby.bit"`613614.615616**булевый**617618Можно передать целые числа 0 или 1, или строки619620`"yes"`621622или623624`"no"`625626.627628**колбэк**629630Это любая функция Python, которая не принимает аргументов. Например:631632```python633def print_it():634    print("hi there")635fred["command"] = print_it636```637638**цвет**639640Цвета могут задаваться как имена цветов X из файла rgb.txt, или как строки, представляющие значения RGB в 4-битном:641642`"#RGB"`643644, 8-битном:645646`"#RRGGBB"`647648, 12-битном:649650`"#RRRGGGBBB"`651652или 16-битном:653654`"#RRRRGGGGBBBB"`655656диапазонах, где R,G,B здесь представляют любую допустимую шестнадцатеричную цифру. См. страницу 160 книги Уэстерхута для подробностей.657658**курсор**659660Стандартные имена курсоров X из661662`cursorfont.h`663664можно использовать без префикса665666`XC_`667668. Например, чтобы получить курсор в виде руки (669670`XC_hand2`671672), используйте строку673674`"hand2"`675676. Также можно указать собственные файлы битовой карты и маски. См. стр. 179 книги Остерхаута.677678**расстояние**679680Экранные расстояния можно задавать в пикселях или в абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, причём конечный символ обозначает единицу измерения:681682`c`683684для сантиметров,685686`i`687688для дюймов,689690`m`691692для миллиметров,693694`p`695696для типографских пунктов. Например, 3,5 дюйма выражается как697698`"3.5i"`699700.701702**шрифт**703704Tk использует формат списка имён шрифтов, например705706`{courier 10 bold}`707708. Размеры шрифта с положительными числами задаются в пунктах; размеры с отрицательными числами задаются в пикселях.709710**геометрия**711712Это строка вида713714`widthxheight`715716, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например:717718`fred["geometry"] = "200x100"`719720.721722**выравнивание**723724Допустимые значения – строки:725726`"left"`727728,729730`"center"`731732,733734`"right"`735736и737738`"fill"`739740.741742**регион**743744Это строка с четырьмя элементами, разделёнными пробелами, каждый из которых является допустимым расстоянием (см. выше). Например:745746`"2 3 4 5"`747748и749750`"3i 2i 4.5i 2i"`751752и753754`"3c 2c 4c 10.43c"`755756– всё это допустимые области.757758**рельеф**759760Определяет стиль границы виджета. Допустимые значения:761762`"raised"`763764,765766`"sunken"`767768,769770`"flat"`771772,773774`"groove"`775776и777778`"ridge"`779780.781782**команда прокрутки**783784Почти всегда это метод785786`set()`787788какого-нибудь виджета полосы прокрутки, но может быть любым методом виджета, принимающим единственный аргумент.789790**перенос:**791792Должно быть одним из:793794`"none"`795796,797798`"char"`799800или801802`"word"`803804.805806### 25.1.6.7. Привязки и события807808Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:809810```python811def bind(self, sequence, func, add=''):812```813814где:815816**последовательность**817818это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).819820**функция**821822– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются823824*колбэками*825826.)827828**добавить**829830является необязательным, может быть831832`''`833834или835836`'+'`837838. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача839840`'+'`841842означает, что эта функция добавляется в список функций, привязанных к данному типу события.843844Например:845846```python847def turnRed(self, event):848    event.widget["activeforeground"] = "red"849850self.button.bind("<Enter>", self.turnRed)851```852853Обратите внимание, как в колбэке `turnRed()` происходит обращение к полю widget события. Это поле содержит виджет, который поймал X-событие. В следующей таблице перечислены другие поля события, к которым можно обращаться, и то, как они обозначаются в Tk, что может быть полезно при обращении к справочным страницам Tk (man pages).854855| Tk | Поле события Tkinter | Tk | Поле события Tkinter |856| --- | --- | --- | --- |857| %f | фокус | %A | char |858| %h | рост | %E | send\_event |859| %k | keycode | %K | keysym |860| %s | состояние | %N | keysym\_num |861| %t | time | %T | тип |862| %w | ширина | %W | виджет |863| %x | x | %X | x\_root |864| %y | y | %Y | y\_root |865866### 25.1.6.8. Параметр index867868Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.869870**Индексы виджета Entry (index, view index и т.д.)**871872Виджеты ввода имеют опции, ссылающиеся на позиции символов в отображаемом тексте. Для доступа к этим особым точкам в текстовых виджетах можно использовать функции873874[`tkinter`](https://python-all.ru/3.4/library/tkinter.html#module-tkinter)875876:877878**Индексы виджета Text**879880Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.881882**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**883884Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:885886- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;887- строка `"active"`, которая указывает на позицию меню, находящуюся в данный момент под курсором;888- строка `"last"`, которая указывает на последний пункт меню;889- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;890- строка `"none"`, которая означает отсутствие пункта меню; чаще всего используется с menu.activate() для деактивации всех пунктов; и наконец,891- текстовая строка, которая сопоставляется по шаблону с меткой пункта меню, при этом поиск выполняется сверху вниз. Обратите внимание, что этот тип индекса обрабатывается после всех остальных, то есть совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.892893### 25.1.6.9. Изображения894895Растровые изображения (Bitmap/Pixelmap) можно создавать через подклассы `tkinter.Image`:896897- `BitmapImage` можно использовать для растровых данных X11.898- `PhotoImage` можно использовать для цветных растровых изображений в форматах GIF и PPM/PGM.899900Любой тип изображения создаётся с помощью опции `file` или `data` (другие опции также доступны).901902Затем объект изображения можно использовать везде, где опция `image` поддерживается каким-либо виджетом (например, метками, кнопками, меню). В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка Python на объект изображения, данные изображения также удаляются, и Tk будет отображать пустой прямоугольник там, где использовалось изображение.903904## 25.1.7. Обработчики файлов905906Tk позволяет регистрировать и удалять функцию обратного вызова, которая будет вызываться из главного цикла Tk, когда возможен ввод-вывод на файловом дескрипторе. Для каждого файлового дескриптора можно зарегистрировать только один обработчик. Пример кода:907908```python909import tkinter910widget = tkinter.Tk()911mask = tkinter.READABLE | tkinter.WRITABLE912widget.tk.createfilehandler(file, mask, callback)913...914widget.tk.deletefilehandler(file)915```916917Эта функция недоступна в Windows.918919Поскольку неизвестно, сколько байт доступно для чтения, возможно, не стоит использовать методы [`BufferedIOBase`](https://python-all.ru/3.4/library/io.html#io.BufferedIOBase) или [`TextIOBase`](https://python-all.ru/3.4/library/io.html#io.TextIOBase) [`read()`](https://python-all.ru/3.4/library/io.html#io.BufferedIOBase.read) или [`readline()`](https://python-all.ru/3.4/library/io.html#io.IOBase.readline), так как они будут пытаться прочитать заранее заданное количество байт. Для сокетов методы [`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) или [`recvfrom()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvfrom) будут работать нормально; для других файлов используйте небуферизованное чтение или `os.read(file.fileno(), maxbytecount)`.920921#### `Widget.tk.createfilehandler(file, mask, func)`922923Регистрирует функцию обратного вызова обработчика файла *func*. Аргумент *file* может быть либо объектом с методом [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno) (например, файл или сокет), либо целочисленным файловым дескриптором. Аргумент *mask* представляет собой комбинацию по ИЛИ из любых трёх констант, перечисленных ниже. Колбэк вызывается следующим образом:924925```python926callback(file, mask)927```928929#### `Widget.tk.deletefilehandler(file)`930931Удаляет обработчик файла.932933#### `tkinter.READABLE`934935#### `tkinter.WRITABLE`936937#### `tkinter.EXCEPTION`938939Константы, используемые в аргументе *mask*.940