Содержание страницы
25.1. tkinter – интерфейс Python к Tcl/Tk¶tkinter – Python interface to Tcl/Tk
Пакет tkinter («интерфейс Tk») – это стандартный интерфейс Python к набору инструментов Tk GUI. И Tk, и tkinter доступны на большинстве Unix-платформ, а также в системах Windows. (Tk сам по себе не является частью Python; он поддерживается компанией ActiveState.) Проверить, что tkinter правильно установлен в вашей системе, можно, выполнив в командной строке python -m tkinter; должно открыться окно с демонстрацией простого интерфейса Tk.
См. также
- Ресурсы Python Tkinter
- В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.
- TKDocs
- Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.
- Справочник по Tkinter: графический интерфейс для Python
- Онлайн-справочные материалы.
- Документация Tkinter от effbot
- Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.
- Руководство по Tcl/Tk
- Официальное руководство для последней версии Tcl/Tk.
- Программирование на Python
- Книга Марка Лутца, в которой прекрасно освещается Tkinter.
- Современный Tkinter для занятых разработчиков Python
- Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.
- Программирование на Python и Tkinter
- Книга Джона Грейсона (ISBN 1-884777-81-3).
25.1.1. Модули Tkinter¶Tkinter Modules
В большинстве случаев tkinter – это всё, что действительно нужно, но также доступен ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем _tkinter. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться напрямую программистами приложений. Обычно это разделяемая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.
В дополнение к модулю интерфейса Tk, tkinter включает ряд модулей Python, одним из наиболее важных является tkinter.constants. Импорт tkinter автоматически импортирует tkinter.constants, поэтому обычно для использования Tkinter достаточно простого оператора import:
import tkinter
Или, чаще:
from tkinter import *
- class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)¶
Класс Tk создаётся без аргументов. Это создаёт верхнеуровневый виджет Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.
- tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)¶
Функция Tcl() является фабричной функцией, которая создаёт объект, очень похожий на тот, что создаётся классом Tk, за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при работе с интерпретатором Tcl в среде, где не нужно создавать лишние верхнеуровневые окна, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный функцией Tcl(), может иметь окно Toplevel (и инициализированную подсистему Tk), созданное путём вызова его метода loadtk().
Другие модули, обеспечивающие поддержку Tk, включают:
- tkinter.scrolledtext
- Текстовый виджет со встроенной вертикальной полосой прокрутки.
- tkinter.colorchooser
- Диалоговое окно для выбора цвета пользователем.
- tkinter.commondialog
- Базовый класс для диалогов, определённых в других перечисленных здесь модулях.
- tkinter.filedialog
- Стандартные диалоги для указания файла для открытия или сохранения.
- tkinter.font
- Утилиты для работы со шрифтами.
- tkinter.messagebox
- Доступ к стандартным диалоговым окнам Tk.
- tkinter.simpledialog
- Базовые диалоги и вспомогательные функции.
- tkinter.dnd
- Поддержка перетаскивания (drag-and-drop) для tkinter. Это экспериментальная функция, которая должна стать устаревшей, когда будет заменена на Tk DND.
- turtle
- Черепашья графика в окне Tk.
25.1.2. Спасательный круг Tkinter¶Tkinter Life Preserver
Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.
Благодарности:
- Tk был написан Джоном Аустерхутом во время его работы в Беркли.
- Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.
- Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.
- HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.
- Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.
- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.
25.1.2.1. Как использовать этот раздел¶How To Use This Section
Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.
При попытке ответить на вопросы вида «как сделать то-то», часто лучше всего выяснить, как сделать «то-то» в чистом Tk, а затем преобразовать это в соответствующий вызов tkinter. Программисты на Python часто могут догадаться о правильной команде Python, посмотрев документацию Tk. Это означает, что для использования Tkinter нужно немного знать о Tk. Этот документ не может выполнять эту роль, поэтому лучшее, что мы можем сделать, – указать вам на лучшую существующую документацию. Вот несколько подсказок:
- Авторы настоятельно рекомендуют приобрести копию man-страниц Tk. В частности, man-страницы в каталоге manN наиболее полезны. Man-страницы man3 описывают интерфейс C к библиотеке Tk и поэтому не особенно полезны для разработчиков сценариев.
- Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.
- tkinter/__init__.py – это крайнее средство для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.
См. также
- Страницы руководства Tcl/Tk 8.6
- Руководство по Tcl/Tk на сайте www.tcl.tk.
- Домашняя страница ActiveState Tcl
- Разработка Tk/Tcl в основном ведется в ActiveState.
- Tcl и инструментарий Tk
- Книга Джона Оустерхута, создателя Tcl.
- Практическое программирование на Tcl и Tk
- Энциклопедическая книга Брента Уэлча.
25.1.2.2. Простая программа Hello World¶A Simple Hello World Program
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.hi_there = tk.Button(self)
self.hi_there["text"] = "Hello World\n(click me)"
self.hi_there["command"] = self.say_hi
self.hi_there.pack(side="top")
self.QUIT = tk.Button(self, text="QUIT", fg="red",
command=root.destroy)
self.QUIT.pack(side="bottom")
def say_hi(self):
print("hi there, everyone!")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
25.1.3. Очень краткий обзор Tcl/Tk¶A (Very) Quick Look at Tcl/Tk
Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.
Примечания:
- Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.
- Класс Tk предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно, система создаёт один экземпляр всякий раз, когда создаётся любой из других классов.
- Класс Widget не предназначен для создания экземпляров, он предназначен только для создания подклассов, чтобы создавать «настоящие» виджеты (в C++ это называется «абстрактный класс»).
Чтобы использовать этот справочный материал, иногда потребуется уметь читать короткие отрывки из Tk и определять различные части команды Tk. (Смотрите раздел Отображение базового Tk в Tkinter для tkinter-эквивалентов приведённого ниже.)
Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его класс, параметры, помогающие его настроить, и действия, которые заставляют его выполнять полезные функции.
Чтобы создать виджет в Tk, команда всегда имеет следующий вид:
classCommand newPathname options
- classCommand
- обозначает, какой виджет создавать (кнопку, метку, меню...)
- newPathname
- это новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы помочь обеспечить это, виджеты в Tk именуются с помощью путевых имён, как файлы в файловой системе. Верхнеуровневый виджет, корень (root), называется . (точка) и дочерние элементы разделяются дополнительными точками. Например, .myApp.controlPanel.okButton может быть именем виджета.
- опции
- Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд Unix-оболочки, а значения заключаются в кавычки, если состоят из нескольких слов.
Например:
button .fred -fg red -text "hi there"
^ ^ \______________________/
| | |
class new options
command widget (-opt val -opt val ...)
После создания путевое имя виджета становится новой командой. Эта новая команда виджета является для программиста дескриптором, позволяющим заставить виджет выполнить некоторое действие. В C это выглядело бы как someAction(fred, someOptions), в C++ – как fred.someAction(someOptions), а в Tk говорят:
.fred someAction someOptions
Обратите внимание, что имя объекта, .fred, начинается с точки.
Как и следовало ожидать, допустимые значения для someAction зависят от класса виджета: .fred disable работает, если fred – кнопка (fred становится серым), но не работает, если fred – метка (отключение меток не поддерживается в Tk).
Допустимые значения someOptions зависят от действия. Некоторые действия, например disable, не требуют аргументов, другие же, как команда delete поля ввода текста, требуют аргументов для указания диапазона удаляемого текста.
25.1.4. Отображение базового Tk в Tkinter¶Mapping Basic Tk into Tkinter
Команды классов в Tk соответствуют конструкторам классов в Tkinter.
button .fred =====> fred = Button()
Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.
button .panel.fred =====> fred = Button(panel)
Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел Установка параметров о настройке параметров.
button .fred -fg red =====> fred = Button(panel, fg="red")
.fred configure -fg red =====> fred["fg"] = red
OR ==> fred.config(fg="red")
В Tk для выполнения действия над виджетом используется имя виджета как команда, за которым следует имя действия, возможно с аргументами (опциями). В Tkinter вызов методов экземпляра класса приводит к выполнению действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в tkinter/__init__.py.
.fred invoke =====> fred.invoke()
Чтобы передать виджет упаковщику (менеджеру геометрии), вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализованы как методы. Все виджеты в tkinter являются подклассами Packer и наследуют все методы упаковки. См. документацию модуля tkinter.tix для дополнительной информации о менеджере геометрии Form.
pack .fred -side left =====> fred.pack(side="left")
25.1.6. Удобный справочник¶Handy Reference
25.1.6.1. Установка параметров¶Setting Options
Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:
- При создании объекта – с помощью именованных аргументов
fred = Button(self, fg="red", bg="blue")
- После создания объекта – используя имя параметра как индекс словаря
fred["fg"] = "red" fred["bg"] = "blue"
- Использовать метод config() для обновления нескольких атрибутов после создания объекта
fred.config(fg="red", bg="blue")
Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.
Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице options(3).
В этом документе не делается различий между стандартными и специфическими для виджета опциями. Некоторые опции не применимы к некоторым типам виджетов. Реагирует ли данный виджет на конкретную опцию, зависит от класса виджета: кнопки имеют опцию command, метки – нет.
Опции, поддерживаемые данным виджетом, перечислены на его man-странице, или их можно запросить во время выполнения, вызвав метод config() без аргументов, или вызвав метод keys() этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, 'relief'), а значениями – 5-кортежи.
Некоторые опции, например bg, являются синонимами распространённых опций с длинными именами (bg – сокращение от «background»). Передача методу config() имени сокращённой опции вернёт 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж будет содержать имя синонима и «настоящую» опцию (например, ('bg', 'background')).
| Индекс | Значение | Пример |
|---|---|---|
| 0 | имя параметра | 'relief' |
| 1 | имя параметра для поиска в базе данных | 'relief' |
| 2 | класс параметра для поиска в базе данных | 'Relief' |
| 3 | значение по умолчанию | 'raised' |
| 4 | текущее значение | 'groove' |
Пример:
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.
25.1.6.2. Упаковщик¶The Packer
Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего родителя. В отличие от более громоздкого разместителя (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – выше, слева от, заполнение и т.д. – и самостоятельно вычисляет точные координаты размещения.
Размер любого родительского виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.
Обратите внимание, что виджеты не отображаются, пока для них не указана геометрия с помощью менеджера геометрии. Типичная ошибка новичков – пропустить указание геометрии, а затем удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применён, например, метод упаковщика pack().
Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:
fred.pack() # по умолчанию side = "top"
fred.pack(side="left")
fred.pack(expand=1)
25.1.6.3. Параметры упаковщика¶Packer Options
За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.
- привязка
- Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.
- расширение
- Логическое значение, 0 или 1.
- заполнение
- Допустимые значения: 'x', 'y', 'both', 'none'.
- ipadx и ipady
- Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.
- padx и pady
- Расстояние – задает внешний отступ с каждой стороны дочернего виджета.
- сторона
- Допустимые значения: 'left', 'right', 'top', 'bottom'.
25.1.6.4. Связывание переменных виджетов¶Coupling Widget Variables
Текущее значение некоторых виджетов (например, полей ввода текста) можно напрямую связать с переменными приложения с помощью специальных опций. Эти опции: variable, textvariable, onvalue, offvalue и value. Эта связь работает в обе стороны: если переменная по какой-либо причине изменяется, виджет, к которому она привязана, обновляется, отражая новое значение.
К сожалению, в текущей реализации tkinter невозможно передать произвольную переменную Python виджету через опцию variable или textvariable. Единственные типы переменных, для которых это работает, – это переменные, являющиеся подклассами класса Variable, определённого в tkinter.
Уже определено много полезных подклассов Variable: StringVar, IntVar, DoubleVar и BooleanVar. Чтобы прочитать текущее значение такой переменной, вызовите метод get(), а чтобы изменить его – вызовите метод set(). Если следовать этому протоколу, виджет будет всегда отслеживать значение переменной без дополнительных действий с вашей стороны.
Например:
class App(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.entrythingy = Entry()
self.entrythingy.pack()
# здесь находится переменная приложения
self.contents = StringVar()
# установить её в какое-либо значение
self.contents.set("this is a variable")
# указать виджету ввода следить за этой переменной
self.entrythingy["textvariable"] = self.contents
# и здесь мы получаем колбэк, когда пользователь нажимает Ввод.
# заставим программу вывести значение
# переменной приложения, когда пользователь нажимает Ввод
self.entrythingy.bind('<Key-Return>',
self.print_contents)
def print_contents(self, event):
print("hi. contents of entry is now ---->",
self.contents.get())
25.1.6.5. Менеджер окон¶The Window Manager
В Tk есть служебная команда wm для взаимодействия с оконным менеджером. Опции команды wm позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В tkinter эти команды реализованы как методы класса Wm. Виджеты верхнего уровня являются подклассами класса Wm и поэтому могут вызывать методы Wm напрямую.
Чтобы получить окно верхнего уровня, содержащее данный виджет, можно часто просто обратиться к мастеру (master) виджета. Конечно, если виджет был упакован внутри фрейма, мастер не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод _root(). Этот метод начинается с подчёркивания, чтобы обозначить, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.
Вот несколько примеров типичного использования:
from tkinter import *
class App(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
# создайте приложение
myapp = App()
#
# здесь вызовы методов класса оконного менеджера
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)
# запустите программу
myapp.mainloop()
25.1.6.6. Типы данных опций Tk¶Tk Option Data Types
- привязка
- Допустимые значения – стороны света: "n", "ne", "e", "se", "s", "sw", "w", "nw", а также "center".
- битовая карта
- Существует восемь встроенных именованных битовых карт: 'error', 'gray25', 'gray50', 'hourglass', 'info', 'questhead', 'question', 'warning'. Чтобы указать имя файла битовой карты X, укажите полный путь к файлу, перед которым ставится @, например "@/usr/contrib/bitmap/gumby.bit".
- булевый
- Можно передать целые числа 0 или 1, или строки "yes" или "no".
- колбэк
Это любая функция Python, которая не принимает аргументов. Например:
def print_it(): print("hi there") fred["command"] = print_it
- цвет
- Цвета могут задаваться как имена цветов X из файла rgb.txt, или как строки, представляющие значения RGB в 4-битном: "#RGB", 8-битном: "#RRGGBB", 12-битном: "#RRRGGGBBB" или 16-битном: "#RRRRGGGGBBBB" диапазонах, где R,G,B здесь представляют любую допустимую шестнадцатеричную цифру. См. страницу 160 книги Уэстерхута для подробностей.
- курсор
- Стандартные имена курсоров X из cursorfont.h можно использовать без префикса XC_. Например, чтобы получить курсор в виде руки (XC_hand2), используйте строку "hand2". Также можно указать собственные файлы битовой карты и маски. См. стр. 179 книги Остерхаута.
- расстояние
- Экранные расстояния можно задавать в пикселях или в абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, причём конечный символ обозначает единицу измерения: c для сантиметров, i для дюймов, m для миллиметров, p для типографских пунктов. Например, 3,5 дюйма выражается как "3.5i".
- шрифт
- Tk использует формат списка имён шрифтов, например {courier 10 bold}. Размеры шрифта с положительными числами задаются в пунктах; размеры с отрицательными числами задаются в пикселях.
- геометрия
- Это строка вида widthxheight, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например: fred["geometry"] = "200x100".
- выравнивание
- Допустимые значения – строки: "left", "center", "right" и "fill".
- регион
- Это строка с четырьмя элементами, разделёнными пробелами, каждый из которых является допустимым расстоянием (см. выше). Например: "2 3 4 5" и "3i 2i 4.5i 2i" и "3c 2c 4c 10.43c" – всё это допустимые области.
- рельеф
- Определяет стиль границы виджета. Допустимые значения: "raised", "sunken", "flat", "groove" и "ridge".
- команда прокрутки
- Почти всегда это метод set() какого-нибудь виджета полосы прокрутки, но может быть любым методом виджета, принимающим единственный аргумент.
- перенос:
- Должно быть одним из: "none", "char" или "word".
25.1.6.7. Привязки и события¶Bindings and Events
Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:
def bind(self, sequence, func, add=''):
где:
- последовательность
- это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).
- функция
- – это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются колбэками.)
- добавить
- является необязательным, может быть '' или '+'. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача '+' означает, что эта функция добавляется в список функций, привязанных к данному типу события.
Например:
def turnRed(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turnRed)
Обратите внимание, как в колбэке turnRed() происходит обращение к полю widget события. Это поле содержит виджет, который поймал X-событие. В следующей таблице перечислены другие поля события, к которым можно обращаться, и то, как они обозначаются в Tk, что может быть полезно при обращении к справочным страницам Tk (man pages).
| Tk | Поле события Tkinter | Tk | Поле события Tkinter |
|---|---|---|---|
| %f | фокус | %A | char |
| %h | рост | %E | send_event |
| %k | keycode | %K | keysym |
| %s | состояние | %N | keysym_num |
| %t | time | %T | тип |
| %w | ширина | %W | виджет |
| %x | x | %X | x_root |
| %y | y | %Y | y_root |
25.1.6.8. Параметр index¶The index Parameter
Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.
- Индексы виджета Entry (index, view index и т.д.)
- Виджеты ввода имеют опции, ссылающиеся на позиции символов в отображаемом тексте. Для доступа к этим особым точкам в текстовых виджетах можно использовать функции tkinter:
- Индексы виджета Text
- Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.
- Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)
Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:
- целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;
- строка "active", которая указывает на позицию меню, находящуюся в данный момент под курсором;
- строка "last", которая указывает на последний пункт меню;
- Целое число, перед которым стоит @, например @6, где целое число интерпретируется как координата y в пикселях в системе координат меню;
- строка "none", которая означает отсутствие пункта меню; чаще всего используется с menu.activate() для деактивации всех пунктов; и наконец,
- текстовая строка, которая сопоставляется по шаблону с меткой пункта меню, при этом поиск выполняется сверху вниз. Обратите внимание, что этот тип индекса обрабатывается после всех остальных, то есть совпадения для пунктов меню с метками last, active или none могут быть интерпретированы как указанные выше литералы.
25.1.6.9. Изображения¶Images
Растровые изображения (Bitmap/Pixelmap) можно создавать через подклассы tkinter.Image:
- BitmapImage можно использовать для растровых данных X11.
- PhotoImage можно использовать для цветных растровых изображений в форматах GIF и PPM/PGM.
Любой тип изображения создаётся с помощью опции file или data (другие опции также доступны).
Затем объект изображения можно использовать везде, где опция image поддерживается каким-либо виджетом (например, метками, кнопками, меню). В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка Python на объект изображения, данные изображения также удаляются, и Tk будет отображать пустой прямоугольник там, где использовалось изображение.
25.1.7. Обработчики файлов¶File Handlers
Tk позволяет регистрировать и удалять функцию обратного вызова, которая будет вызываться из главного цикла Tk, когда возможен ввод-вывод на файловом дескрипторе. Для каждого файлового дескриптора можно зарегистрировать только один обработчик. Пример кода:
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
Эта функция недоступна в Windows.
Поскольку неизвестно, сколько байт доступно для чтения, возможно, не стоит использовать методы BufferedIOBase или TextIOBase read() или readline(), так как они будут пытаться прочитать заранее заданное количество байт. Для сокетов методы recv() или recvfrom() будут работать нормально; для других файлов используйте небуферизованное чтение или os.read(file.fileno(), maxbytecount).
- Widget.tk.createfilehandler(file, mask, func)¶
Регистрирует функцию обратного вызова обработчика файла func. Аргумент file может быть либо объектом с методом fileno() (например, файл или сокет), либо целочисленным файловым дескриптором. Аргумент mask представляет собой комбинацию по ИЛИ из любых трёх констант, перечисленных ниже. Колбэк вызывается следующим образом:
callback(file, mask)
- Widget.tk.deletefilehandler(file)¶
Удаляет обработчик файла.