tkinter — Python-интерфейс к Tcl/Tk
Исходный код: Lib/tkinter/__init__.py
Пакет tkinter («Tk-интерфейс») — стандартный Python-интерфейс к набору инструментов Tk для графических пользовательских интерфейсов. Tk и tkinter доступны на большинстве Unix-платформ, а также на системах Windows. (Сам Tk не является частью Python; он поддерживается компанией ActiveState.) Вы можете проверить, что tkinter правильно установлен на вашей системе, выполнив python -m tkinter из командной строки; это должно открыть окно, демонстрирующее простой Tk-интерфейс.
См. также
- Python Tkinter Resources
- Руководство по теме Python Tkinter содержит много информации об использовании Tk из Python и ссылки на другие источники информации о Tk.
- TKDocs
- Подробный учебник плюс более удобные страницы виджетов для некоторых виджетов.
- Tkinter справочник: GUI для Python
- Справочная информация онлайн.
- Tkinter docs from effbot
- Справочник по tkinter, поддерживаемый effbot.org.
- Tcl/Tk справочник
- Официальный справочник для последней версии tcl/tk.
- Programming Python
- Книга Марка Лаутца, содержит отличное описание Tkinter.
- Modern Tkinter for Busy Python Developers
- Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.
- Python и Tkinter программирование
- Книга Джона Грейсона (ISBN 1-884777-81-3).
1. Модули Tkinter
Большую часть времени, tkinter всё, что вам действительно нужно, но доступно и ряд дополнительных модулей. Tk-интерфейс находится в двоичном модуле с именем _tkinter. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться непосредственно программистами приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.
В дополнение к модулю Tk-интерфейса, tkinter включает ряд Python-модулей, tkinter.constants является одним из самых важных. Импорт tkinter автоматически импортирует tkinter.constants, поэтому, как правило, для использования Tkinter вам нужно только простое оператор импорта:
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 - Поддержка перетаскивания для
tkinter. Это экспериментально и должно стать устаревшим, когда его заменят Tk DND. -
turtle - Графика черепахи в окне Tk.
2. Tkinter Life Preserver
Этот раздел не предназначен для исчерпывающего руководства по Tk или Tkinter. Скорее, он предназначен как временное решение, предоставляющее некоторое вводное ознакомление с системой.
Благодарности:
- Tk был написан Джоном Оустерхаутом в Беркли.
- Tkinter был написан Стееном Люмхольтом и Гидо ван Россумом.
- Этот Life Preserver был написан Мэттом Конвеем в Университете Вирджинии.
- Отображение HTML и некоторые изменения были произведены из версии FrameMaker Кэном Манхаймером.
- Фредрик Лундх расширил и переработал описания интерфейса классов, чтобы привести их в соответствие с Tk 4.2.
- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.
2.1. Как использовать этот раздел
Этот раздел состоит из двух частей: первая (приблизительно) охватывает базовые сведения, а вторая может быть использована в качестве удобного справочника.
При попытке ответить на вопросы типа «как сделать что-то», часто лучше узнать, как сделать это в чистом Tk, а затем преобразовать это в соответствующий вызов tkinter. Программисты Python часто могут угадать правильную команду Python, посмотрев документацию Tk. Это означает, что для использования Tkinter вам нужно будет немного знать о Tk. Этот документ не может выполнить эту роль, поэтому лучше всего направить вас к лучшей существующей документации. Вот несколько советов:
- Авторы настоятельно рекомендуют получить копию страниц справки Tk. В частности, страницы справки в каталоге
manNнаиболее полезны. Страницы справкиman3описывают C-интерфейс к библиотеке Tk и поэтому не особенно полезны для разработчиков скриптов. - Книга «Tcl and the Tk Toolkit» Джона Оустерхаута, опубликованная издательством Addison-Wesley (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 and the Tk Toolkit
- Книга Джона Оустерхаута, изобретателя Tcl.
- Practical Programming in Tcl and Tk
- Энциклопедическая книга Брента Велча.
2.2. Программа Hello World
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(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=root.destroy)
self.quit.pack(side="bottom")
def say_hi(self):
print("hi there, everyone!")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
3. Краткий обзор 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может быть именем виджета. - 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 текстового поля ввода, требуют аргументов для указания диапазона текста, который необходимо удалить.
4. Сопоставление базового Tk с 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")
5. Связь Tk и Tkinter
Сверху вниз:
- Ваше приложение здесь (Python)
- Приложение Python выполняет вызов
tkinter. - tkinter (Пакет Python)
- Этот вызов (например, для создания виджета кнопки) реализован в пакете
tkinter, который написан на Python. Эта функция Python будет анализировать команды и аргументы и преобразовывать их в форму, которая позволит им выглядеть так, как будто они исходят от скрипта Tk, а не скрипта Python. - _tkinter (C)
- Эти команды и их аргументы будут переданы функции C в модуле расширения
_tkinter— обратите внимание на символ подчёркивания —. - Виджеты Tk (C и Tcl)
- Эта функция C способна вызывать другие модули C, включая функции C, которые составляют библиотеку Tk. Tk реализован на C и частично на Tcl. Часть Tcl в виджетах Tk используется для привязки определённых стандартных действий к виджетам и выполняется один раз в момент импорта пакета Python
tkinter. (Пользователь этого этапа никогда не видит). - Tk (C)
- Часть Tk в виджетах Tk реализует окончательное сопоставление с …
- Xlib (C)
- библиотекой Xlib для рисования графики на экране.
6. Справочник
6.1. Настройка параметров
Параметры управляют такими вещами, как цвет и ширина рамки виджета. Параметры можно задать тремя способами:
- При создании объекта, используя ключевые аргументы
-
fred = Button(self, fg="red", bg="blue")
- После создания объекта, используя имя параметра как индекс словаря
-
fred["fg"] = "red" fred["bg"] = "blue"
- Использовать метод config() для обновления нескольких атрибутов после создания объекта
-
fred.config(fg="red", bg="blue")
Для получения полного объяснения заданного параметра и его поведения см. страницы 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')}
Конечно, напечатанный словарь будет содержать все доступные параметры и их значения. Это только пример.
6.2. Диспетчер пакетов
Диспетчер пакетов — один из механизмов управления геометрией Tk. Менеджеры геометрии используются для указания относительного расположения виджетов в контейнере — их общем владельце. В отличие от более громоздкого размещателя (который используется реже и здесь не рассматривается), диспетчер пакетов принимает указания качественных отношений — над, слева от, заполнять и т. д. — и вычисляет точные координаты расположения для вас.
Размер любого виджета-владельца определяется размером вложенных «виджетов-подчинённых». Диспетчер пакетов используется для управления тем, где виджеты-подчинённые отображаются внутри владельца, в который они упакованы. Вы можете упаковывать виджеты в рамки, а рамки — в другие рамки, чтобы получить желаемую структуру макета. Кроме того, расположение динамически корректируется для учёта пошаговых изменений конфигурации после упаковки.
Обратите внимание, что виджеты не отображаются, пока не будет задана их геометрия с помощью менеджера геометрии. Частая ошибка на ранних этапах — пропуск задания геометрии, а затем удивление, когда виджет создан, но ничего не отображается. Виджет отобразится только после того, как, например, к нему будет применён метод pack() диспетчера пакетов.
Метод pack() можно вызывать с парами «ключевой параметр/значение», которые управляют тем, где виджет будет отображаться в контейнере и как он будет себя вести при изменении размера главного окна приложения. Вот несколько примеров:
fred.pack() # defaults to side = "top" fred.pack(side="left") fred.pack(expand=1)
6.3. Параметры диспетчера пакетов
Для получения более подробной информации о диспетчере пакетов и параметрах, которые он может принимать, см. руководства man и страницу 183 книги Джона Аустерхаута.
- anchor
- Тип якорной точки. Указывает, где диспетчер пакетов размещает каждый подчинённый виджет в своём фрагменте.
- expand
- Булево значение,
0или1. - fill
- Допустимые значения:
'x','y','both','none'. - ipadx и ipady
- Расстояние — обозначающее внутренний отступ с каждой стороны виджета-подчинённого.
- padx и pady
- Расстояние — обозначающее внешний отступ с каждой стороны виджета-подчинённого.
- side
- Допустимые значения:
'left','right','top','bottom'.
6.4. Связывание переменных виджетов
Текущее значение некоторых виджетов (например, виджетов текстовых полей) можно напрямую связать с переменными приложения, используя специальные параметры. Эти параметры — 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):
super().__init__(master)
self.pack()
self.entrythingy = Entry()
self.entrythingy.pack()
# here is the application variable
self.contents = StringVar()
# set it to some value
self.contents.set("this is a variable")
# tell the entry widget to watch this variable
self.entrythingy["textvariable"] = self.contents
# and here we get a callback when the user hits return.
# we will have the program print out the value of the
# application variable when the user hits return
self.entrythingy.bind('<Key-Return>',
self.print_contents)
def print_contents(self, event):
print("hi. contents of entry is now ---->",
self.contents.get())
6.5. Менеджер окон
В Tk есть служебная команда wm, для взаимодействия с менеджером окон. Параметры команды wm позволяют управлять такими элементами, как заголовки, размещение, значки и т.п. В tkinter эти команды реализованы как методы класса Wm. Виджеты верхнего уровня наследуются от класса Wm и, таким образом, могут напрямую вызывать методы Wm.
Чтобы получить окно верхнего уровня, содержащее данный виджет, часто достаточно обратиться к master виджета. Конечно, если виджет был размещён внутри фрейма, master не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод _root(). Этот метод начинается с подчеркивания, чтобы указать, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.
Вот несколько примеров типичного использования:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# create the application
myapp = App()
#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)
# start the program
myapp.mainloop()
6.6. Типы данных опций Tk
- anchor
- Допустимые значения — точки компаса:
"n","ne","e","se","s","sw","w","nw", и также"center". - bitmap
- Существует восемь встроенных, именованных битмапов:
'error','gray25','gray50','hourglass','info','questhead','question','warning'Для указания имени файла X-битмапа, укажите полный путь к файлу, предварительно добавив префикс@, как в"@/usr/contrib/bitmap/gumby.bit". - boolean
- Вы можете передать целые числа 0 или 1, или строки
"yes"или"no". - callback
-
Это любая функция Python, которая не принимает аргументов. Например:
def print_it(): print("hi there") fred["command"] = print_it - color
- Цвета могут быть заданы как названия цветов X в файле rgb.txt или как строки, представляющие значения RGB в 4-битовом:
"#RGB", 8-битовом:"#RRGGBB", 12-битовом"#RRRGGGBBB", или 16-битовом"#RRRRGGGGBBBB"диапазонах, где R,G,B здесь представляют любые допустимые шестнадцатеричные цифры. Подробности см. на странице 160 книги Остерхаута. - cursor
- Можно использовать стандартные имена курсоров X из
cursorfont.hбез префиксаXC_. Например, чтобы получить курсор в виде руки (XC_hand2), используйте строку"hand2". Также можно указать собственный файл битмапа и маски. См. страницу 179 книги Остерхаута. - distance
- Расстояния на экране могут быть указаны в пикселях или в абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния — строками с заключительным символом, обозначающим единицы:
cдля сантиметров,iдля дюймов,mдля миллиметров,pдля типографских пунктов. Например, 3,5 дюйма выражаются как"3.5i". - font
- Tk использует формат имени шрифта в виде списка, например
{courier 10 bold}. Размеры шрифтов с положительными числами измеряются в пунктах; размеры с отрицательными числами — в пикселях. - geometry
- Это строка вида
widthxheight, где ширина и высота измеряются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например:fred["geometry"] = "200x100". - justify
- Допустимые значения — строки:
"left","center","right", и"fill". - region
- Это строка с четырьмя разделенными пробелами элементами, каждый из которых является допустимым расстоянием (см. выше). Например:
"2 3 4 5"и"3i 2i 4.5i 2i"и"3c 2c 4c 10.43c"— все являются допустимыми областями. - relief
- Определяет стиль границы виджета. Допустимые значения:
"raised","sunken","flat","groove", и"ridge". - scrollcommand
- Это почти всегда метод
set()некоторого виджета прокрутки, но может быть любым методом виджета, принимающим один аргумент. - wrap:
- Должно быть одним из:
"none","char", или"word".
6.7. Связывания и события
Метод bind из команды виджета позволяет отслеживать определенные события и вызывать функцию обратного вызова при возникновении такого типа события. Формат метода bind:
def bind(self, sequence, func, add=''):
где:
- sequence
- является строкой, обозначающей целевой тип события. (Подробности см. в руководстве по bind и на странице 201 книги Джона Остерхаута).
- func
- является функцией Python, принимающей один аргумент, которая вызывается при возникновении события. В качестве аргумента передаётся объект Event. (Функции, используемые таким образом, обычно называются обработчиками.)
- add
- является необязательным, может быть
''или'+'. Передача пустой строки означает, что это связывание заменяет любые другие связывания, связанные с этим событием. Передача'+'означает, что эта функция добавляется в список функций, связанных с этим типом события.
Например:
def turn_red(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turn_red)
Обратите внимание, как в обработчике turn_red() обращается к полю widget события. Это поле содержит виджет, который получил событие X. В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как они обозначаются в Tk, что может быть полезно при работе с руководствами Tk.
| Tk | Tkinter Event Field | Tk | Tkinter Event Field |
|---|---|---|---|
| %f | focus | %A | char |
| %h | height | %E | send_event |
| %k | keycode | %K | keysym |
| %s | state | %N | keysym_num |
| %t | time | %T | type |
| %w | width | %W | widget |
| %x | x | %X | x_root |
| %y | y | %Y | y_root |
6.8. Параметр index
Несколько виджетов требуют параметра «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могут интерпретироваться как вышеупомянутые литералы.
6.9. Изображения
Изображения битмап/пиксельный мап можно создавать с помощью подклассов tkinter.Image:
-
BitmapImageиспользуется для данных X11-битмапов. -
PhotoImageиспользуется для GIF и цветных битмапов PPM/PGM.
Изображение любого типа создается с помощью параметра file или data (доступны и другие параметры).
Объект изображения затем можно использовать там, где поддерживается параметр image некоторым виджетом (например, метками, кнопками, меню). В этих случаях Tk не будет хранить ссылку на изображение. При удалении последней ссылки Python на объект изображения данные изображения также удаляются, и Tk отобразит пустую область там, где было изображение.
7. Обработчики файлов
Tk позволяет регистрировать и отменять регистрацию функции обратного вызова, которая будет вызываться из Tk mainloop, когда доступен ввод-вывод для дескриптора файла. Только один обработчик может быть зарегистрирован на один дескриптор файла. Пример кода:
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) -
Отменяет регистрацию обработчика файла.
-
tkinter.READABLE -
tkinter.WRITABLE -
tkinter.EXCEPTION -
Константы, используемые в аргументе mask.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/tkinter.html