Содержание страницы
tkinter – интерфейс Python к Tcl/Tk¶tkinter – Python interface to Tcl/Tk
Исходный код: Lib/tkinter/__init__.py
Пакет tkinter («интерфейс Tk») является стандартным интерфейсом Python к набору инструментов GUI Tk. И Tk, и tkinter доступны на большинстве платформ Unix, а также в системах Windows. (Сам Tk не является частью Python; он поддерживается компанией ActiveState.)
Запуск python -m tkinter из командной строки должен открыть окно, демонстрирующее простой интерфейс Tk, показывая, что tkinter корректно установлен в системе, а также отображая версию Tcl/Tk, чтобы можно было прочитать документацию Tcl/Tk, соответствующую этой версии.
См. также
Документация Tkinter:
- Ресурсы Python Tkinter
В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.
- TKDocs
Обширное учебное пособие и более понятные страницы виджетов для некоторых из них.
- Справочник по Tkinter 8.5: GUI для Python
Онлайн-справочные материалы.
- Документация Tkinter от effbot
Онлайн-справочник по tkinter, поддерживаемый сайтом effbot.org.
- Программирование на Python
Книга Марка Лутца, в которой прекрасно освещается Tkinter.
- Современный Tkinter для занятых разработчиков Python
Книга Марка Роземана о создании привлекательных и современных графических интерфейсов пользователя с помощью Python и Tkinter.
- Программирование на Python и Tkinter
Книга Джона Грейсона (ISBN 1-884777-81-3).
Документация Tcl/Tk:
- Команды Tk
Большинство команд доступны как классы
tkinterилиtkinter.ttk. Измените '8.6' в соответствии с версией вашей установки Tcl/Tk.- Новые man-страницы Tcl/Tk
Последние руководства Tcl/Tk на www.tcl.tk.
- Домашняя страница ActiveState Tcl
Разработка Tk/Tcl в основном ведется в ActiveState.
- Tcl and the Tk Toolkit
Книга Джона Оустерхута, создателя Tcl.
- Practical Programming in Tcl and Tk
Энциклопедическая книга Брента Уэлча.
Модули 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(), может создать окно верхнего уровня (и инициализировать подсистему Tk) с помощью вызова его методаloadtk().
Другие модули, обеспечивающие поддержку Tk, включают:
tkinter.scrolledtextТекстовый виджет со встроенной вертикальной полосой прокрутки.
tkinter.colorchooserДиалоговое окно для выбора цвета пользователем.
tkinter.commondialogБазовый класс для диалогов, определённых в других перечисленных здесь модулях.
tkinter.filedialogСтандартные диалоги для указания файла для открытия или сохранения.
tkinter.fontУтилиты для работы со шрифтами.
tkinter.messageboxДоступ к стандартным диалоговым окнам Tk.
tkinter.simpledialogБазовые диалоги и вспомогательные функции.
tkinter.dndПоддержка перетаскивания для
tkinter. Эта функция экспериментальная и будет объявлена устаревшей, когда ее заменит Tk DND.turtleЧерепашья графика в окне Tk.
Спасательный круг Tkinter¶Tkinter Life Preserver
Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.
Благодарности:
Tk был написан Джоном Аустерхутом во время его работы в Беркли.
Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.
Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.
HTML-представление и некоторая вольная редактура были сделаны на основе версии в FrameMaker Кеном Манхаймером.
Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.
Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.
Как использовать этот раздел¶How To Use This Section
Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.
При попытке ответить на вопросы типа «как мне сделать то-то», часто лучше всего выяснить, как сделать это «то-то» на чистом Tk, а затем преобразовать это в соответствующий вызов tkinter. Программисты на Python часто могут угадать правильную команду Python, взглянув на документацию Tk. Это означает, что для использования Tkinter придётся немного знать Tk. Данный документ не может выполнить эту роль, поэтому лучшее, что можно сделать – указать на лучшую существующую документацию. Вот несколько советов:
Авторы настоятельно рекомендуют приобрести копию страниц руководства Tk (man pages). В частности, наиболее полезны страницы руководства в каталоге
manN. Страницы руководстваman3описывают интерфейс C к библиотеке Tk и поэтому не особенно полезны для разработчиков скриптов.Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.
tkinter/__init__.pyявляется последним средством для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.
Простая программа Hello World¶A Simple Hello World Program
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(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=self.master.destroy)
self.quit.pack(side="bottom")
def say_hi(self):
print("hi there, everyone!")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
Краткий (очень) обзор 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 именуются с помощью путевых имён, как файлы в файловой системе. Виджет верхнего уровня, корень, называется
.(точка), а дочерние элементы разделяются дополнительными точками. Например,.myApp.controlPanel.okButtonможет быть именем виджета.- options
Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд 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 поля ввода текста, нуждаются в аргументах для указания диапазона удаляемого текста.
Отображение базового 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")
Краткий справочник¶Handy Reference
Установка опций¶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, а метки – нет.
Опции, поддерживаемые данным виджетом, перечислены на странице руководства этого виджета, или их можно получить во время выполнения, вызвав метод config() без аргументов, или вызвав метод keys() для этого виджета. Возвращаемое значение этих вызовов – словарь, ключом которого является имя опции в виде строки (например, 'relief'), а значениями – 5-кортежи.
Некоторые параметры, например bg, являются синонимами распространённых параметров с длинными именами (bg – сокращение для «background»). При передаче методу config() имени сокращённого параметра будет возвращён 2-кортеж, а не 5-кортеж. Возвращаемый 2-кортеж содержит имя синонима и «реальный» параметр (например, ('bg', 'background')).
Индекс |
Значение |
Пример |
|---|---|---|
0 |
имя параметра |
|
1 |
имя параметра для поиска в базе данных |
|
2 |
класс параметра для поиска в базе данных |
|
3 |
значение по умолчанию |
|
4 |
текущее значение |
|
Пример:
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.
Упаковщик¶The Packer
Упаковщик – один из механизмов управления геометрией Tk. Менеджеры геометрии используются для задания относительного расположения виджетов внутри их контейнера – их общего родителя. В отличие от более громоздкого разместителя (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – сверху, слева от, заполнение и т.д. – и сам вычисляет точные координаты размещения.
Размер любого родительского виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.
Обратите внимание, что виджеты не отображаются, пока их геометрия не задана с помощью менеджера геометрии. Это распространенная ошибка новичков – пропустить задание геометрии и потом удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применен, например, метод pack() упаковщика.
Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:
fred.pack() # по умолчанию side = "top"
fred.pack(side="left")
fred.pack(expand=1)
Опции упаковщика¶Packer Options
За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.
- привязка
Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.
- расширение
Логическое значение,
0или1.- заполнение
Допустимые значения:
'x','y','both','none'.- ipadx и ipady
Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.
- padx и pady
Расстояние – задает внешний отступ с каждой стороны дочернего виджета.
- сторона
Допустимые значения:
'left','right','top','bottom'.
Привязка переменных виджетов¶Coupling Widget Variables
Текущее значение некоторых виджетов (например, виджетов ввода текста) может быть напрямую связано с переменными приложения с помощью специальных опций. Эти опции: variable, textvariable, onvalue, offvalue и value. Такая связь работает в обе стороны: если переменная изменяется по какой-либо причине, связанный с ней виджет обновится, отображая новое значение.
К сожалению, в текущей реализации tkinter невозможно передать виджету произвольную переменную Python через опцию variable или textvariable. Единственные переменные, с которыми это работает, – это переменные, являющиеся подклассами класса Variable, определённого в tkinter.
Уже определено много полезных подклассов Variable:
StringVar, IntVar, DoubleVar и
BooleanVar. Чтобы прочитать текущее значение такой переменной, вызовите метод
get(), а чтобы изменить его – метод set(). При соблюдении этого протокола виджет всегда будет отслеживать значение переменной без дополнительного вмешательства.
Например:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.entrythingy = tk.Entry()
self.entrythingy.pack()
# Создайте переменную приложения.
self.contents = tk.StringVar()
# Установите её в некоторое значение.
self.contents.set("this is a variable")
# Укажите виджету ввода отслеживать эту переменную.
self.entrythingy["textvariable"] = self.contents
# Определите колбэк для события нажатия Return.
# Он выводит текущее значение переменной.
self.entrythingy.bind('<Key-Return>',
self.print_contents)
def print_contents(self, event):
print("Hi. The current entry content is:",
self.contents.get())
root = tk.Tk()
myapp = App(root)
myapp.mainloop()
Менеджер окон¶The Window Manager
В Tk есть служебная команда wm для взаимодействия с менеджером окон. Опции команды wm позволяют управлять такими вещами, как заголовки, расположение, значки и тому подобное. В tkinter эти команды реализованы как методы класса Wm. Виджеты верхнего уровня являются подклассами класса Wm, поэтому могут напрямую вызывать методы Wm.
Чтобы получить окно верхнего уровня, содержащее данный виджет, часто можно просто обратиться к родителю виджета. Однако если виджет упакован внутрь фрейма, родитель не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод _root(). Этот метод начинается с подчеркивания, что указывает на то, что функция является частью реализации, а не интерфейсом к функциональности Tk.
Вот несколько примеров типичного использования:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# создайте приложение
myapp = App()
#
# здесь вызовы методов класса оконного менеджера
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)
# запустите программу
myapp.mainloop()
Типы данных опций Tk¶Tk Option Data Types
- привязка
Допустимые значения – направления компаса:
"n","ne","e","se","s","sw","w","nw", а также"center".- битовая карта
Существует восемь встроенных именованных битовых карт:
'error','gray25','gray50','hourglass','info','questhead','question','warning'. Чтобы указать имя файла X bitmap, укажите полный путь к файлу, начинающийся с@, например"@/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()какого-либо виджета полосы прокрутки, но может быть любым методом виджета, принимающим один аргумент.- wrap:
Должно быть одним из:
"none","char"или"word".
Привязки и события¶Bindings and Events
Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:
def bind(self, sequence, func, add=''):
где:
- последовательность
это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).
- функция
– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются колбэками.)
- добавить
является необязательным, может быть
''или'+'. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача'+'означает, что эта функция добавляется в список функций, привязанных к данному типу события.
Например:
def turn_red(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turn_red)
Обратите внимание, как поле widget объекта события используется в
turn_red() колбэке. Это поле содержит виджет, который перехватил событие X.
В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как
они обозначаются в Tk; это может пригодиться при обращении к страницам руководства Tk.
Tk |
Поле события Tkinter |
Tk |
Поле события Tkinter |
|---|---|---|---|
%f |
фокус |
%A |
char |
%h |
рост |
%E |
send_event |
%k |
keycode |
%K |
keysym |
%s |
состояние |
%N |
keysym_num |
%t |
time |
%T |
тип |
%w |
ширина |
%W |
widget |
%x |
x |
%X |
x_root |
%y |
y |
%Y |
y_root |
Параметр index¶The index Parameter
Ряд виджетов требует передачи параметров «index». Они используются для указания на конкретное место в виджете Text, на определённые символы в виджете Entry или на конкретные пункты меню в виджете Menu.
- Индексы виджета Entry (index, view index и т.д.)
Виджеты Entry имеют опции, относящиеся к позициям символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции
tkinter:- Индексы виджета Text
Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.
- Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)
Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:
целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;
строку
"active", которая указывает на позицию меню, находящуюся в данный момент под курсором;строку
"last", которая указывает на последний пункт меню;Целое число, перед которым стоит
@, например@6, где целое число интерпретируется как координата y в пикселях в системе координат меню;строку
"none", которая указывает на отсутствие какого-либо пункта меню, чаще всего используется с menu.activate() для деактивации всех пунктов, и наконец,текстовую строку, которая сопоставляется с образцом с меткой пункта меню при сканировании сверху вниз. Обратите внимание, что этот тип индекса рассматривается после всех остальных, что означает, что совпадения для пунктов меню с метками
last,activeилиnoneмогут быть интерпретированы как указанные выше литералы.
Изображения¶Images
Изображения разных форматов можно создать через соответствующий подкласс tkinter.Image:
BitmapImageдля изображений в формате XBM.PhotoImageдля изображений в форматах PGM, PPM, GIF и PNG. Последний поддерживается начиная с Tk 8.6.
Оба типа изображений создаются с помощью опции file или data
(доступны и другие опции).
Затем объект изображения можно использовать везде, где какой-либо виджет (например, метки, кнопки, меню) поддерживает опцию image. В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка на объект изображения из Python, данные изображения также удаляются, и Tk отображает пустой прямоугольник везде, где использовалось изображение.
См. также
Пакет Pillow добавляет поддержку форматов BMP, JPEG, TIFF, WebP и других.
Обработчики файлов¶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)¶ Удаляет обработчик файла.