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

tkinter.md

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

1> **Источник:** https://python-all.ru/3.0/library/tkinter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `tkinter` – интерфейс Python для Tcl/Tk89Пакет `tkinter` («Tk interface») – это стандартный интерфейс Python к инструментарию графического интерфейса Tk. И Tk, и `tkinter` доступны на большинстве Unix-платформ, а также на системах Windows. (Tk не является частью Python; он поддерживается компанией ActiveState.)1011> **См. также**12>13> **[Ресурсы Python Tkinter](https://python-all.ru/3.0/library/tkinter.html)**14>15> В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.16>17> **[Введение в Tkinter](https://python-all.ru/3.0/library/tkinter.html)**18>19> Справочные материалы Фредрика Лунда в интернете.20>21> **[Справочник по Tkinter: графический интерфейс для Python](https://python-all.ru/3.0/library/tkinter.html)**22>23> Онлайн-справочные материалы.24>25> **[Tkinter для JPython](https://python-all.ru/3.0/library/tkinter.html)**26>27> Интерфейс Jython для Tkinter.28>29> **[Программирование на Python и Tkinter](https://python-all.ru/3.0/library/tkinter.html)**30>31> Книга Джона Грейсона (ISBN 1-884777-81-3).3233## Модули Tkinter3435В большинстве случаев достаточно `tkinter`, но доступен и ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем `_tkinter`. Этот модуль содержит низкоуровневый интерфейс к Tk, и его не следует напрямую использовать программистам приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях может быть статически скомпонована с интерпретатором Python.3637В дополнение к модулю интерфейса Tk, `tkinter` включает ряд модулей Python, одним из наиболее важных из которых является `tkinter.constants`. Импорт `tkinter` автоматически импортирует `tkinter.constants`, поэтому обычно для использования Tkinter достаточно простого оператора import:3839```python40import tkinter41```4243Или, чаще:4445```python46from tkinter import *47```4849#### `[tkinter.Tk]class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)`5051Класс5253[`Tk`](https://python-all.ru/3.0/library/tkinter.html#tkinter.Tk)5455создаётся без аргументов. Это создаёт верхнеуровневый виджет Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.5657#### `[tkinter.Tcl]tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)`5859Функция6061[`Tcl()`](https://python-all.ru/3.0/library/tkinter.html#tkinter.Tcl)6263является фабричной функцией, которая создаёт объект, очень похожий на тот, что создаётся классом6465[`Tk`](https://python-all.ru/3.0/library/tkinter.html#tkinter.Tk)6667, за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при работе с интерпретатором Tcl в среде, где не нужно создавать лишние верхнеуровневые окна, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный функцией6869[`Tcl()`](https://python-all.ru/3.0/library/tkinter.html#tkinter.Tcl)7071, может иметь окно Toplevel (и инициализированную подсистему Tk), созданное путём вызова его метода7273`loadtk()`7475.7677Другие модули, обеспечивающие поддержку Tk, включают:7879**[`tkinter.scrolledtext`](https://python-all.ru/3.0/library/tkinter.scrolledtext.html#module-tkinter.scrolledtext)**8081Текстовый виджет со встроенной вертикальной полосой прокрутки.8283**`tkinter.colorchooser`**8485Диалоговое окно для выбора цвета пользователем.8687**`tkinter.commondialog`**8889Базовый класс для диалогов, определённых в других перечисленных здесь модулях.9091**`tkinter.filedialog`**9293Стандартные диалоги для указания файла для открытия или сохранения.9495**`tkinter.font`**9697Утилиты для работы со шрифтами.9899**`tkinter.messagebox`**100101Доступ к стандартным диалоговым окнам Tk.102103**`tkinter.simpledialog`**104105Базовые диалоги и вспомогательные функции.106107**`tkinter.dnd`**108109Поддержка перетаскивания (drag-and-drop) для110111`tkinter`112113. Является экспериментальной и должна стать устаревшей, когда будет заменена на Tk DND.114115**[`turtle`](https://python-all.ru/3.0/library/turtle.html#module-turtle)**116117Черепашья графика в окне Tk.118119## Спасательный круг Tkinter120121Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.122123Благодарности:124125- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.126- Tk был написан Джоном Аустерхутом во время его работы в Беркли.127- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.128- HTML-рендеринг и некоторая редакционная правка выполнены на основе версии FrameMaker Кена Манхаймера.129- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.130- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.131132### Как использовать этот раздел133134Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.135136При попытке ответить на вопросы вроде «как сделать то-то», часто лучше сначала выяснить, как это сделать на чистом Tk, а затем преобразовать это в соответствующий вызов `tkinter`. Программисты на Python часто могут угадать правильную команду Python, посмотрев документацию Tk. Это означает, что для использования Tkinter необходимо немного знать Tk. Этот документ не может выполнить эту роль, поэтому лучшее, что можно сделать – указать на лучшую существующую документацию. Вот несколько советов:137138- Авторы настоятельно рекомендуют обзавестись копией страниц руководства Tk. В частности, наиболее полезны страницы из каталога `mann`. Страницы в каталоге `man3` описывают C-интерфейс к библиотеке Tk и поэтому не особенно полезны для авторов скриптов.139- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.140- `tkinter/__init__.py` – это крайнее средство для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.141142> **См. также**143>144> **[Домашняя страница ActiveState Tcl](https://python-all.ru/3.0/library/tkinter.html)**145>146> Разработка Tk/Tcl в основном ведется в ActiveState.147>148> **[Tcl и инструментарий Tk](https://python-all.ru/3.0/library/tkinter.html)**149>150> Книга Джона Остерхута, создателя Tcl.151>152> **[Практическое программирование на Tcl и Tk](https://python-all.ru/3.0/library/tkinter.html)**153>154> Энциклопедическая книга Брента Уэлча.155156### Простая программа Hello World157158```python159from tkinter import *160161class Application(Frame):162    def say_hi(self):163        print("hi there, everyone!")164165    def createWidgets(self):166        self.QUIT = Button(self)167        self.QUIT["text"] = "QUIT"168        self.QUIT["fg"]   = "red"169        self.QUIT["command"] =  self.quit170171        self.QUIT.pack({"side": "left"})172173        self.hi_there = Button(self)174        self.hi_there["text"] = "Hello",175        self.hi_there["command"] = self.say_hi176177        self.hi_there.pack({"side": "left"})178179    def __init__(self, master=None):180        Frame.__init__(self, master)181        self.pack()182        self.createWidgets()183184root = Tk()185app = Application(master=root)186app.mainloop()187root.destroy()188```189190## Краткий (очень) обзор Tcl/Tk191192Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.193194Примечания:195196- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.197- Класс [`Tk`](https://python-all.ru/3.0/library/tkinter.html#tkinter.Tk) предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно, система создаёт один экземпляр всякий раз, когда создаётся любой из других классов.198- Класс `Widget` не предназначен для создания экземпляров, он предназначен только для создания подклассов, чтобы создавать «настоящие» виджеты (в C++ это называется «абстрактный класс»).199200Чтобы использовать этот справочный материал, иногда потребуется уметь читать короткие фрагменты Tk и определять различные части команды Tk. (См. раздел [*Mapping Basic Tk into Tkinter*](https://python-all.ru/3.0/library/tkinter.html#tkinter-basic-mapping), где приведены эквиваленты `tkinter` для описанного ниже.)201202Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его *класс*, *параметры*, помогающие его настроить, и *действия*, которые заставляют его выполнять полезные функции.203204Чтобы создать виджет в Tk, команда всегда имеет следующий вид:205206```python207classCommand newPathname options208```209210***classCommand***211212обозначает, какой виджет создавать (кнопку, метку, меню...)213214***newPathname***215216это новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы помочь обеспечить это, виджеты в Tk именуются с помощью217218*путевых имён*219220, как файлы в файловой системе. Верхнеуровневый виджет,221222*корень (root)*223224, называется225226`.`227228(точка) и дочерние элементы разделяются дополнительными точками. Например,229230`.myApp.controlPanel.okButton`231232может быть именем виджета.233234***опции***235236Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.237238Например:239240```python241button   .fred   -fg red -text "hi there"242   ^       ^     \_____________________/243   |       |                |244 class    new            options245command  widget  (-opt val -opt val ...)246```247248После создания путевое имя виджета становится новой командой. Эта новая *команда виджета* является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое *действие*. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:249250```python251.fred someAction someOptions252```253254Обратите внимание, что имя объекта, `.fred`, начинается с точки.255256Как и следовало ожидать, допустимые значения для *someAction* зависят от класса виджета: `.fred disable` работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).257258Допустимые значения *someOptions* зависят от действия. Некоторые действия, например `disable`, не требуют аргументов, другие же, как команда `delete` поля ввода текста, требуют аргументов для указания диапазона удаляемого текста.259260## Отображение базового Tk в Tkinter261262Команды классов в Tk соответствуют конструкторам классов в Tkinter.263264```python265button .fred                =====>  fred = Button()266```267268Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.269270```python271button .panel.fred          =====>  fred = Button(panel)272```273274Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел [*Установка параметров*](https://python-all.ru/3.0/library/tkinter.html#tkinter-setting-options) о настройке параметров.275276```python277button .fred -fg red        =====>  fred = Button(panel, fg = "red")278.fred configure -fg red     =====>  fred["fg"] = red279                            OR ==>  fred.config(fg = "red")280```281282В Tk для выполнения действия над виджетом используется имя виджета как команда, а за ним следует имя действия, возможно, с аргументами (опциями). В Tkinter вызов методов экземпляра класса служит для вызова действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в модуле Tkinter.py.283284```python285.fred invoke                =====>  fred.invoke()286```287288Чтобы передать виджет упаковщику (менеджеру геометрии), вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализованы как методы. Все виджеты в `tkinter` являются подклассами Packer и наследуют все методы упаковки. См. документацию модуля [`tkinter.tix`](https://python-all.ru/3.0/library/tkinter.tix.html#module-tkinter.tix) для дополнительной информации о менеджере геометрии Form.289290```python291pack .fred -side left       =====>  fred.pack(side = "left")292```293294## Как связаны Tk и Tkinter295296Сверху вниз:297298**Ваше приложение здесь (Python)**299300Python-приложение выполняет вызов301302`tkinter`303304.305306**tkinter (пакет Python)**307308Этот вызов (например, создание виджета кнопки) реализован в пакете309310*tkinter*311312, написанном на Python. Эта функция Python разбирает команды и аргументы и преобразует их в форму, которая выглядит так, как если бы они пришли из Tk-скрипта, а не из Python-скрипта.313314**tkinter (C)**315316Эти команды и их аргументы передаются C-функции в модуле расширения317318*tkinter*319320– обратите внимание на строчные буквы.321322**Tk Widgets (C и Tcl)**323324Эта C-функция способна вызывать другие C-модули, включая C-функции, из которых состоит библиотека Tk. Tk реализован на C и частично на Tcl. Часть Tcl виджетов Tk используется для привязки определенного поведения по умолчанию к виджетам и выполняется однократно при импорте пакета Python325326`tkinter`327328. (Пользователь никогда не видит этот этап.)329330**Tk (C)**331332Часть Tk виджетов Tk реализует конечное отображение на ...333334**Xlib (C)**335336библиотека Xlib для рисования графики на экране.337338## Краткий справочник339340### Установка опций341342Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:343344**При создании объекта – с помощью именованных аргументов**345346```python347fred = Button(self, fg = "red", bg = "blue")348```349350**После создания объекта – используя имя параметра как индекс словаря**351352```python353fred["fg"] = "red"354fred["bg"] = "blue"355```356357**Использовать метод config() для обновления нескольких атрибутов после создания объекта**358359```python360fred.config(fg = "red", bg = "blue")361```362363Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.364365Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице *options(3)*.366367В этом документе не делается различий между стандартными и специфическими для виджета опциями. Некоторые опции не применимы к некоторым типам виджетов. Реагирует ли данный виджет на конкретную опцию, зависит от класса виджета: кнопки имеют опцию `command`, метки – нет.368369Опции, поддерживаемые данным виджетом, перечислены на его man-странице, или их можно запросить во время выполнения, вызвав метод `config()` без аргументов, или вызвав метод `keys()` этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, `'relief'`), а значениями – 5-кортежи.370371Некоторые опции, например `bg`, являются синонимами распространённых опций с длинными именами (`bg` – сокращение от «background»). Передача методу `config()` имени сокращённой опции вернёт 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж будет содержать имя синонима и «настоящую» опцию (например, `('bg', 'background')`).372373| Индекс | Значение | Пример |374| --- | --- | --- |375| 0 | имя параметра | `'relief'` |376| 1 | имя параметра для поиска в базе данных | `'relief'` |377| 2 | класс параметра для поиска в базе данных | `'Relief'` |378| 3 | значение по умолчанию | `'raised'` |379| 4 | текущее значение | `'groove'` |380381Пример:382383```python384>>> print(fred.config())385{'relief' : ('relief', 'relief', 'Relief', 'raised', 'groove')}386```387388Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.389390### Упаковщик391392Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего *родителя*. В отличие от более громоздкого *разместителя* (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – *выше*, *слева от*, *заполнение* и т.д. – и самостоятельно вычисляет точные координаты размещения.393394Размер любого *родительского* виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.395396Обратите внимание, что виджеты не отображаются, пока для них не указана геометрия с помощью менеджера геометрии. Типичная ошибка новичков – пропустить указание геометрии, а затем удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применён, например, метод упаковщика `pack()`.397398Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:399400```python401fred.pack()                     # по умолчанию side = "top"402fred.pack(side = "left")403fred.pack(expand = 1)404```405406### Опции упаковщика407408За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.409410**привязка**411412Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.413414**расширение**415416Логическое значение,417418`0`419420или421422`1`423424.425426**заполнение**427428Допустимые значения:429430`'x'`431432,433434`'y'`435436,437438`'both'`439440,441442`'none'`443444.445446**ipadx и ipady**447448Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.449450**padx и pady**451452Расстояние – задает внешний отступ с каждой стороны дочернего виджета.453454**сторона**455456Допустимые значения:457458`'left'`459460,461462`'right'`463464,465466`'top'`467468,469470`'bottom'`471472.473474### Привязка переменных виджетов475476Текущее значение некоторых виджетов (например, полей ввода текста) можно напрямую связать с переменными приложения с помощью специальных опций. Эти опции: `variable`, `textvariable`, `onvalue`, `offvalue` и `value`. Эта связь работает в обе стороны: если переменная по какой-либо причине изменяется, виджет, к которому она привязана, обновляется, отражая новое значение.477478К сожалению, в текущей реализации `tkinter` невозможно передать произвольную переменную Python виджету через опцию `variable` или `textvariable`. Единственные переменные, для которых это работает, – это переменные, унаследованные от класса Variable, определённого в `tkinter`.479480Уже определено множество полезных подклассов Variable: `StringVar`, `IntVar`, `DoubleVar` и `BooleanVar`. Чтобы прочитать текущее значение такой переменной, вызовите метод `get()`, а чтобы изменить его – метод [`set()`](https://python-all.ru/3.0/library/stdtypes.html#set). Если следовать этому протоколу, виджет всегда будет отслеживать значение переменной без дальнейшего вмешательства.481482Например:483484```python485class App(Frame):486    def __init__(self, master=None):487        Frame.__init__(self, master)488        self.pack()489490        self.entrythingy = Entry()491        self.entrythingy.pack()492493        # here is the application variable494        self.contents = StringVar()495        # set it to some value496        self.contents.set("this is a variable")497        # tell the entry widget to watch this variable498        self.entrythingy["textvariable"] = self.contents499500        # and here we get a callback when the user hits return.501        # we will have the program print out the value of the502        # application variable when the user hits return503        self.entrythingy.bind('<Key-Return>',504                              self.print_contents)505506    def print_contents(self, event):507        print("hi. contents of entry is now ---->",508              self.contents.get())509```510511### Менеджер окон512513В Tk есть служебная команда `wm` для взаимодействия с менеджером окон. Опции команды `wm` позволяют управлять такими вещами, как заголовки, размещение, значки и т.п. В `tkinter` эти команды реализованы как методы класса `Wm`. Виджеты Toplevel являются подклассами класса `Wm`, поэтому могут напрямую вызывать методы `Wm`.514515Чтобы получить окно верхнего уровня, содержащее данный виджет, можно часто просто обратиться к мастеру (master) виджета. Конечно, если виджет был упакован внутри фрейма, мастер не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод `_root()`. Этот метод начинается с подчёркивания, чтобы обозначить, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.516517Вот несколько примеров типичного использования:518519```python520from tkinter import *521class App(Frame):522    def __init__(self, master=None):523        Frame.__init__(self, master)524        self.pack()525526# create the application527myapp = App()528529#530# here are method calls to the window manager class531#532myapp.master.title("My Do-Nothing Application")533myapp.master.maxsize(1000, 400)534535# start the program536myapp.mainloop()537```538539### Типы данных опций Tk540541**привязка**542543Допустимые значения – стороны света:544545`"n"`546547,548549`"ne"`550551,552553`"e"`554555,556557`"se"`558559,560561`"s"`562563,564565`"sw"`566567,568569`"w"`570571,572573`"nw"`574575, а также576577`"center"`578579.580581**битовая карта**582583Существует восемь встроенных именованных битовых карт:584585`'error'`586587,588589`'gray25'`590591,592593`'gray50'`594595,596597`'hourglass'`598599,600601`'info'`602603,604605`'questhead'`606607,608609`'question'`610611,612613`'warning'`614615. Чтобы указать имя файла битовой карты X, укажите полный путь к файлу, перед которым ставится616617`@`618619, например620621`"@/usr/contrib/bitmap/gumby.bit"`622623.624625**булевый**626627Можно передавать целые числа 0 или 1 или строки628629`"yes"`630631или632633`"no"`634635.636637**колбэк**638639Это любая функция Python, которая не принимает аргументов. Например:640641```python642def print_it():643        print("hi there")644fred["command"] = print_it645```646647**цвет**648649Цвета могут задаваться как имена цветов X из файла rgb.txt, или как строки, представляющие значения RGB в 4-битном:650651`"#RGB"`652653, 8-битном:654655`"#RRGGBB"`656657, 12-битном:658659`"#RRRGGGBBB"`660661или 16-битном:662663`"#RRRRGGGGBBBB"`664665диапазонах, где R,G,B здесь представляют любую допустимую шестнадцатеричную цифру. См. страницу 160 книги Уэстерхута для подробностей.666667**курсор**668669Стандартные имена курсоров X из670671`cursorfont.h`672673можно использовать без префикса674675`XC_`676677. Например, чтобы получить курсор в виде руки (678679`XC_hand2`680681), используйте строку682683`"hand2"`684685. Также можно указать собственные файлы битовой карты и маски. См. стр. 179 книги Остерхаута.686687**расстояние**688689Экранные расстояния можно задавать в пикселях или в абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, причём конечный символ обозначает единицу измерения:690691`c`692693для сантиметров,694695`i`696697для дюймов,698699`m`700701для миллиметров,702703`p`704705для типографских пунктов. Например, 3,5 дюйма выражается как706707`"3.5i"`708709.710711**шрифт**712713Tk использует формат списка имён шрифтов, например714715`{courier 10 bold}`716717. Размеры шрифта с положительными числами задаются в пунктах; размеры с отрицательными числами задаются в пикселях.718719**геометрия**720721Это строка вида722723`widthxheight`724725, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например:726727`fred["geometry"] = "200x100"`728729.730731**выравнивание**732733Допустимые значения – строки:734735`"left"`736737,738739`"center"`740741,742743`"right"`744745и746747`"fill"`748749.750751**регион**752753Это строка с четырьмя элементами, разделёнными пробелами, каждый из которых является допустимым расстоянием (см. выше). Например:754755`"2 3 4 5"`756757и758759`"3i 2i 4.5i 2i"`760761и762763`"3c 2c 4c 10.43c"`764765– всё это допустимые области.766767**рельеф**768769Определяет стиль границы виджета. Допустимые значения:770771`"raised"`772773,774775`"sunken"`776777,778779`"flat"`780781,782783`"groove"`784785и786787`"ridge"`788789.790791**команда прокрутки**792793Почти всегда это метод794795[`set()`](https://python-all.ru/3.0/library/stdtypes.html#set)796797какого-нибудь виджета полосы прокрутки, но это может быть любой метод виджета, принимающий один аргумент. Для примера обратитесь к файлу798799`Demo/tkinter/matt/canvas-with-scrollbars.py`800801в дистрибутиве исходного кода Python.802803**перенос:**804805Должно быть одним из:806807`"none"`808809,810811`"char"`812813или814815`"word"`816817.818819### Привязки и события820821Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:822823```python824def bind(self, sequence, func, add=''):825```826827где:828829**последовательность**830831это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).832833**функция**834835– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются836837*колбэками*838839.)840841**добавить**842843является необязательным, может быть844845`''`846847или848849`'+'`850851. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача852853`'+'`854855означает, что эта функция добавляется в список функций, привязанных к данному типу события.856857Например:858859```python860def turnRed(self, event):861    event.widget["activeforeground"] = "red"862863self.button.bind("<Enter>", self.turnRed)864```865866Обратите внимание, как в колбэке `turnRed()` происходит обращение к полю widget события. Это поле содержит виджет, который поймал X-событие. В следующей таблице перечислены другие поля события, к которым можно обращаться, и то, как они обозначаются в Tk, что может быть полезно при обращении к справочным страницам Tk (man pages).867868```python869Tk      Tkinter Event Field             Tk      Tkinter Event Field870--      -------------------             --      -------------------871%f      focus                           %A      char872%h      height                          %E      send_event873%k      keycode                         %K      keysym874%s      state                           %N      keysym_num875%t      time                            %T      type876%w      width                           %W      widget877%x      x                               %X      x_root878%y      y                               %Y      y_root879```880881### Параметр index882883Многие виджеты требуют передачи параметров «index». Они используются для указания на определённое место в виджете Text, или на определённые символы в виджете Entry, или на определённые пункты меню в виджете Menu.884885**Индексы виджета Entry (index, view index и т.д.)**886887Виджеты Entry имеют опции, ссылающиеся на позиции символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции `tkinter`:888889**AtEnd()**890891относится к последней позиции в тексте892893**AtInsert()**894895относится к точке, где находится текстовый курсор896897**AtSelFirst()**898899указывает начальную точку выделенного текста900901**AtSelLast()**902903обозначает последнюю точку выделенного текста и, наконец,904905**At(x\[, y\])**906907относится к символу по координатам пикселей908909*x*910911,912913*y*914915(при этом916917*y*918919не используется в случае виджета ввода текста, который содержит одну строку текста).920921**Индексы виджета Text**922923Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.924925**Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)**926927Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:928929- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;930- строка `'active'`, которая указывает на позицию меню, находящуюся в данный момент под курсором;931- строка `"last"`, которая указывает на последний пункт меню;932- Целое число, перед которым стоит `@`, например `@6`, где целое число интерпретируется как координата y в пикселях в системе координат меню;933- строка `"none"`, которая означает отсутствие пункта меню; чаще всего используется с menu.activate() для деактивации всех пунктов; и наконец,934- текстовая строка, которая сопоставляется по шаблону с меткой пункта меню, при этом поиск выполняется сверху вниз. Обратите внимание, что этот тип индекса обрабатывается после всех остальных, то есть совпадения для пунктов меню с метками `last`, `active` или `none` могут быть интерпретированы как указанные выше литералы.935936### Изображения937938Растровые изображения (Bitmap/Pixelmap) можно создавать через подклассы `tkinter.Image`:939940- `BitmapImage` можно использовать для растровых данных X11.941- `PhotoImage` можно использовать для цветных растровых изображений в форматах GIF и PPM/PGM.942943Любой тип изображения создаётся с помощью опции `file` или `data` (другие опции также доступны).944945Затем объект изображения можно использовать везде, где опция `image` поддерживается каким-либо виджетом (например, метками, кнопками, меню). В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка Python на объект изображения, данные изображения также удаляются, и Tk будет отображать пустой прямоугольник там, где использовалось изображение.946