tkinter
— Python интерфейс для Tcl/Tk¶
Пакет tkinter
(«интерфейс Tk») — стандартный интерфейс Python для
набора инструментов Tk GUI. И Tk, и tkinter
доступны на большинстве
платформ Unix, а также в системах Windows. (Сам Tk не является частью Python;
он поддерживается в ActiveState.)
Запуск python -m tkinter
из командной строки должен открыть окно,
демонстрирующее простой интерфейс Tk, сообщающее, что tkinter
правильно
установлен в вашей системе, а также установленную версию Tcl/Tk, чтобы вы
могли прочитать документацию по Tcl/Tk к нужной версии.
См.также
Документация Tkinter:
- Python ресурсы Tkinter
- Руководство по Python Tkinter предоставляет большой объем информации об использовании Tk из Python и ссылки на другие источники информации о Tk.
- TK Docs
- Обширное руководство и более удобные страницы для некоторых виджетов.
- Справочник по Tkinter 8.5: графический интерфейс для Python
- Онлайн справочный материал.
- Tkinter документы от eff bota
- Онлайн-справочник по tkinter.
- Программирование Python
- Книга Марка Лутца отлично освещает tkinter.
- Современный Tkinter для занятых разработчиков Python
- Книга Марка Роземана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.
- Программирование на Python и Tkinter
- Книга Джона Грейсона (ISBN 1-884777-81-3).
Документация по Tcl/Tk:
- Тк команды
- Большинство команд доступны как классы
tkinter
илиtkinter.ttk
. Измените «8.6» в соответствии с вашей версией установки Tcl/Tk. - Tcl/Tk страницы руководства
- Свежие руководства по Tcl/Tk доступны на tcl/tk.
- Домашняя страница ActiveState Tcl
- Разработка Tk/Tcl в основном происходит в ActiveState.
- Tcl и инструментарий Tk
- Книга Джона Остерхаута, изобретателя Tcl.
- Практическое программирование на Tcl и Tk
- Энциклопедическая книга Брента Уэлча.
Модули 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()
, может создано окно верхнего уровня (и инициализирована подсистема 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¶
Этот раздел не является исчерпывающим руководством по Tk или Tkinter. Скорее, он предназначен для предоставления некоторой вводной информации о системе.
Благодарности:
- Tk был написан Джоном Остерхаутом в Беркли.
- Tkinter написали Стин Лумхольт и Гвидо ван Россум.
- Этот Спасательный круг был написан Мэттом Конвеем из Университета Вирджинии.
- Рендеринг HTML и некоторое свободное редактирование были произведены из версии FrameMaker Кеном Манхеймером.
- Фредрик Лунд разработал и изменил описания интерфейсов классов, чтобы они соответствовали Tk 4.2.
- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.
Как пользоваться этим разделом¶
Этот раздел состоит из двух частей: первая половина (примерно) охватывает справочный материал, а вторая половина может использоваться клавиатурой в качестве удобного справочника.
При попытке ответить на вопросы вида «как мне сделать что-то» часто лучше узнать,
как выполнить «что-то» в прямом Tk, а затем преобразовать его обратно в
соответствующий вызов tkinter
. Программисты Python часто могут угадать
правильную команду Python, просмотрев документацию Tk. Это означает, что для
использования Tkinter вам нужно немного узнать о Tk. Этот документ не
может выполнять эту роль, поэтому лучшее, что мы можем сделать — указать
вам на лучшую существующую документацию. Вот несколько подсказок:
- Авторы настоятельно рекомендуют получить копию man страниц Tk. В
частности, наиболее полезны man страницы в каталоге
manN
. Man страницыman3
рассказывают о C интерфейсе к библиотеке Tk и поэтому не особенно полезны для авторов сценариев. - Аддисон-Уэсли издаёт книгу Джона Остерхаута «Tcl and Tk Toolkit» (ISBN 0-201-63337-X), которая является хорошим знакомством с Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям относится к страницам руководства.
tkinter/__init__.py
— это последнее средство для большинства, но может быть хорошим местом, когда ничто другое не имеет смысла.
Простая программа Hello World¶
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¶
Иерархия классов выглядит сложной, но на практике программисты приложений почти всегда обращаются к классам в самом низу иерархии.
Примечания:
- Классы предназначены для организации определенных функций в одном пространстве имён. Они не предназначены для независимого создания экземпляров.
- Класс
Tk
предназначен для однократного создания экземпляра в приложении. Прикладным программистам не нужно создавать один экземпляр явно, система создаёт его всякий раз, когда инстанцируется любой из классов. - Класс
Widget
не предназначен для создания экземпляров, он предназначен только для создания подклассов для создания «настоящих» виджетов (в C ++ это называется «абстрактный класс»).
Чтобы использовать этот справочный материал, будут моменты, когда вам нужно
будет знать, как читать короткие отрывки Tk и как идентифицировать различные
части команды Tk. (См. раздел Отображение базового Tk в Tkinter для tkinter
эквивалентов того, что ниже.)
Скрипты Tk — программы Tcl. Как и все программы на Tcl, сценарии Tk представляют собой просто списки токенов, разделенных пробелами. Виджет Tk — просто его класс, помогающие его настроить опции, и действия, заставляющие его выполнять полезные вещи.
Чтобы сделать виджет в Tk, у команды есть всегда следующий вид:
classCommand newPathname options
- classCommand
- обозначает, какой виджет создать (кнопка, метка, меню …)
- newPathname
- новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы
обеспечить это, виджеты в Tk именуются pathnames, как файлы в файловой
системе. Виджет верхнего уровня, корневой, называется
.
(точка), а дочерние элементы разделены несколькими точками. Например,.myApp.controlPanel.okButton
может быть именем виджета. - options
- настроить внешний вид виджета и, в некоторых случаях, его поведение. Параметры представлены в виде списка флагов и значений. Флагам предшествует «-», как и флагам команд оболочки Unix, а значения помещаются в кавычки, если они состоят более чем из одного слова.
Например:
button .fred -fg red -text "hi there"
^ ^ \______________________/
| | |
класс новый опции
команды виджет (-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¶
Команды класса в Tk соответствуют конструкторам классов в Tkinter.
button .fred =====> fred = Button()
Мастер объекта подразумевается в новом имени, присвоенном ему во время создания. В Tkinter мастера указываются явно.
button .panel.fred =====> fred = Button(panel)
Параметры конфигурации в Tk представлены в виде списков тегов с дефисом, за которыми следуют значения. В Tkinter параметры указываются как ключевые аргументы в конструкторе экземпляра и ключевые аргументы для вызовов конфигурации или как индексы экземпляра в стиле словаря для установленных экземпляров. См. раздел Параметры настройки о возможностях настройки.
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
.
pack .fred -side left =====> fred.pack(side="left")
Как связаны Tk и Tkinter¶
Сверху вниз:
- Ваше приложение здесь (Python)
- Приложение Python выполняет вызов
tkinter
. - tkinter (пакет Python)
- Этот вызов (например, создание виджета-кнопки) реализован в
пакете
tkinter
, написанный на Python. Python функция проанализирует команды и аргументы и преобразует их в файл формы, которая заставляет их выглядеть так, как если бы они были взяты из сценария Tk, а не скрипта Python. - _tkinter (С)
- Эти команды и их аргументы будут переданы функции C в
_tkinter
— обратите внимание на подчеркивание — это модуль расширения. - Виджеты Tk (C и Tcl)
- Функция C может вызывать другие модули C, включая C
функции, составляющие библиотеке Tk. Tk реализован в C и некоторых Tcl.
Часть Tcl виджетов Tk используется для привязки к определенному поведению по умолчанию
виджеты и выполняется один раз в точке, где Python
tkinter
пакет был импортирован. (Пользователь никогда не видит этот этап). - Tk (C)
- Часть Tk виджетов Tk реализует окончательное отображение в …
- Xlib (C)
- библиотека Xlib для рисования графики на экране.
Удобный справочник¶
Параметры настройки¶
Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно установить тремя способами:
- Во время создания объекта с использованием ключевых аргументов
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-кортеж, переданный обратно, будет содержать имя синонима и «реальную» опцию
(например, ('bg', 'background')
).
Индекс | Значение | Пример |
---|---|---|
0 | название опции | 'relief' |
1 | имя опции для поиска в базе данных | 'relief' |
2 | класс параметров для поиска в базе данных | 'Relief' |
3 | значение по умолчанию | 'raised' |
4 | текущее значение | 'groove' |
Пример:
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
Конечно, напечатанный словарь будет включать все доступные параметры и их значения. Это сделано только в качестве примера.
Упаковщик¶
Упаковщик является одним из механизмов управления геометрией Tk. Менеджеры геометрии используются для указания относительного позиционирования виджетов внутри их контейнера — их общего главного (master). В отличие от более громоздкого россыпь (placer) (который используется реже и мы здесь не рассматриваем), пакер принимает качественные характеристики отношения: выше, слева от, заполнение и т. д. — и прорабатывает всё, чтобы определить точные координаты размещения для вас.
Размер любого главного виджета определяется размером «подчиненных виджетов» внутри. Упаковщик используется для управления местом появления подчиненных виджетов внутри главного, в которое они упакованы. Вы можете упаковать виджеты в фреймы, а фреймы в другие фреймы, чтобы получить желаемый вид макета. Кроме того, компоновка динамически регулируется для внесения дополнительных изменений в конфигурацию после её упаковки.
Обратите внимание, что виджеты не появляются, пока их геометрия не указана с
помощью менеджера геометрии. Ранняя распространенная ошибка — не учитывать
спецификацию геометрии, а затем удивляться, когда виджет создаётся, но ничего
не появляется. Виджет появится только после того, как к нему будет применен,
например, метод упаковщика pack()
.
Метод pack() может вызваться с парами ключевой параметр/значение, которые определяют, где должен отображаться виджет в своем контейнере и как он должен себя вести при изменении размера главного окна приложения. Вот несколько примеров:
fred.pack() # по умолчанию в side="top"
fred.pack(side="left")
fred.pack(expand=1)
Опции упаковщика¶
Для получения более подробной информации о упаковщике и возможных вариантах см. man страницы и страницу 183 книги Джона Остерхаута.
- anchor
- Тип якоря. Обозначает, куда упаковщик должен поместить каждое ведомое в своей посылке.
- expand
- Логическое,
0
или1
. - fill
- Допустимые значения:
'x'
,'y'
,'both'
,'none'
. - ipadx и ipady
- Расстояние — обозначение внутреннего отступа с каждой стороны подчинённого виджета.
- padx и pady
- Расстояние — обозначение внешнего отступа с каждой стороны подчинённого виджета.
- side
- Допустимые значения:
'left'
,'right'
,'top'
,'bottom'
.
Связь переменных виджета¶
Настройка текущего значения некоторых виджетов (например, виджетов ввода
текста) может напрямую связываться с переменными приложения с помощью
специальных параметров. Это варианты variable
, textvariable
,
onvalue
, offvalue
и value
. Данное соединение работает в обоих
направлениях: если переменная изменяется по какой-либо причине, виджет, к
которому она подключена, будет обновлён, чтобы отразить новое значение.
К сожалению, в текущей реализации tkinter
невозможно передать
произвольную переменную Python виджету с помощью параметра variable
или
textvariable
. Единственные типы переменных, для которых это работает, —
являющиеся подклассами класса Variable переменные, определённые в
tkinter
.
Уже определено множество полезных подклассов переменной: 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()
Оконный менеджер¶
В 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 Option¶
- 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"
.
Привязки и события¶
Метод bind из команды виджета позволяет вам отслеживать определенные события и запускать функцию обратного вызова при возникновении этого типа события. Форма метода bind::
def bind(self, sequence, func, add=''):
где:
- sequence
- строка, обозначающая целевой тип события. (См. страницу руководства по связыванию и стр. 201 книги Джона Остерхаута для деталей).
- func
- функция Python, которая принимает один аргумент и вызывается при возникновении события. Экземпляр события будет передан в качестве аргумента. (Функции, развернутые таким образом обычно известны как обратные вызовы.)
- add
- не является обязательным, либо
''
, либо'+'
. Означает, что передаётся пустая строка привязка предназначена для замены любых других привязок, связанных с событием. Передача'+'
означает, что функция должна добавляться в список функций, связанных с данным типом события.
Например:
def turn_red(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turn_red)
Обратите внимание, как осуществляется доступ к полю виджета события в обратном
вызове turn_red()
. Данное поле содержит перехватывающее событие X виджет.
В следующей таблице перечислены другие поля событий, к которым вы можете
получить доступ, и их обозначение в Tk, что может быть полезно при обращении к
man страницам Tk.
Tk | Tkinter поле события | Tk | Tkinter поле события |
---|---|---|---|
%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 |
Параметр index¶
Для ряда виджетов требуется передача «index» параметров. Они используются для указания на определенное место в виджете «Text», или на определенные символы в виджете «Entry», или на определенные пункты меню в виджете «Menu».
- Индексы виджетов Entry (индекс, индекс просмотра и т. д.)
- У виджетов Entry есть параметры, которые относятся к позициям символов в тексте
отображается. Вы можете использовать функции
tkinter
для доступа к этим специальным точкам в текстовых виджетах: - Индексы Text виджетов
- Обозначение индекса для Text виджетов очень богато и лучше всего описано в man Tk страницах.
- Индексы Menu (menu.invoke(), menu.entryconfig() и т. д.)
Некоторые параметры и методы для меню управляют определенными пунктами меню. В любое время, когда для опции или параметра требуется индекс меню, вы можете передать:
- целое число, которое относится к числовой позиции записи в виджете, отсчитываемой сверху, начиная с 0;
- относящаяся к позиции меню строка
"active"
, которая в данный момент находится под курсором; - относящаяся к последнему пункту меню строка
"last"
; - целое число, которому предшествует
@
, как в@6
, где целое число интерпретируется как координата y пикселя в системе координат меню; - строка
"none"
, которая указывает на отсутствие пункта меню вообще; чаще всего используется с menu.activate() для деактивации всех записей и, наконец, - текстовая строка, шаблон которой совпадает с меткой записи меню,
сканированной от верхней части меню до нижней. Обратите внимание, что этот
тип индекса рассматривается после всех остальных, что означает, что
совпадения для пунктов меню с метками
last
,active
илиnone
могут интерпретироваться как приведённые выше литералы.
Изображения¶
Изображения разных форматов можно создавать с помощью соответствующего
подкласса tkinter.Image
:
BitmapImage
для изображений в формате XBM.PhotoImage
для изображений в форматах PGM, PPM, GIF и PNG. Последний поддерживается начиная с Tk 8.6.
Изображение любого типа создаётся с помощью параметра file
или data
(также
доступны другие варианты).
Затем объект изображения можно использовать везде, где параметр image
поддерживается некоторым виджетом (например, метки, кнопки, меню). В этих
случаях Tk не будет сохранять ссылку на изображение. Когда последняя ссылка
Python на объект изображения удаляется, данные изображения также удаляются, и
Tk будет отображать пустое поле везде, где использовалось изображение.
См.также
Пакет Pillow добавляет поддержку таких форматов, как BMP, JPEG, TIFF и WebP, среди прочих.
Обработчики файлов¶
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)¶ Отменяет регистрацию обработчика файлов.