tkinter — Python-интерфейс к Tcl/Tk
Исходный код: Lib/tkinter/__init__.py
Пакет tkinter («Tk-интерфейс») — стандартный Python-интерфейс к графической библиотеке Tcl/Tk. Tk и tkinter доступны на большинстве платформ Unix, включая macOS, а также на системах Windows.
Запуск python -m tkinter из командной строки должен открыть окно, демонстрирующее простой Tk-интерфейс, позволяя убедиться, что tkinter корректно установлен на вашей системе, а также показывать версию установленного Tcl/Tk, чтобы вы могли прочитать документацию Tcl/Tk, соответствующую этой версии.
См. также
-
- TkDocs
-
Обширное руководство по созданию пользовательских интерфейсов с помощью Tkinter. Объясняет ключевые концепции и иллюстрирует рекомендуемые подходы с использованием современного API.
-
- Tkinter 8.5 справочник: графический интерфейс для Python
-
Справочная документация по Tkinter 8.5, описывающая доступные классы, методы и параметры.
Ресурсы Tcl/Tk:
-
- Команды Tk
-
Полноценная справка по каждой из команд Tcl/Tk, используемых Tkinter.
-
- Главная страница Tcl/Tk
-
Дополнительная документация и ссылки на разработку ядра Tcl/Tk.
Книги:
-
- Современный Tkinter для занятых разработчиков Python
-
Марк Роземан. (ISBN 978-1999149567)
-
- Программирование на Python с Tkinter
-
Алан Мур. (ISBN 978-1788835886)
-
- Программирование на Python
-
Марк Лутц; содержит отличное освещение Tkinter. (ISBN 978-0596158101)
-
- Tcl и Tk Toolkit (2-е издание)
-
Джон Аустерхаут, изобретатель Tcl/Tk, и Кен Джонс; не охватывает Tkinter. (ISBN 978-0321336330)
Модули Tkinter
Поддержка Tkinter распределена по нескольким модулям. Большинству приложений потребуется основной модуль tkinter, а также модуль tkinter.ttk, который предоставляет современный набор тематических виджетов и API:
from tkinter import * from tkinter import ttk
-
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None) -
Создаёт виджет Tk верхнего уровня, обычно являющийся главным окном приложения, и инициализирует интерпретатор Tcl для этого виджета. Каждый экземпляр имеет собственный связанный интерпретатор Tcl.
Класс
Tkобычно создаётся с использованием всех значений по умолчанию. Однако в настоящее время распознаются следующие ключевые аргументы:- screenName
-
При указании (как строка) устанавливает переменную окружения
DISPLAY. (Только X11) - baseName
-
Имя файла профиля. По умолчанию baseName выводится из имени программы (
sys.argv[0]). - className
-
Имя класса виджета. Используется как имя файла профиля, а также как имя, с которым вызывается Tcl (argv0 в interp).
- useTk
-
Если
True, инициализирует подсистему Tk. Функцияtkinter.Tcl()устанавливает это значение вFalse. - sync
-
Если
True, выполняет все команды сервера X синхронно, чтобы ошибки сообщались немедленно. Может использоваться для отладки. (Только X11) - use
-
Указывает id окна, в котором нужно встроить приложение, вместо создания его как отдельного окна верхнего уровня. id должен быть указан так же, как и значение для опции -use для виджетов верхнего уровня (то есть, он имеет форму, возвращаемую
winfo_id()).Обратите внимание, что на некоторых платформах это будет работать корректно только если id ссылается на фрейм Tk или окно верхнего уровня, у которого включена опция -container.
Tkсчитывает и интерпретирует файлы профилей, названные.className.tclи.baseName.tcl, в интерпретатор Tcl и вызываетexec()на содержимом.className.pyи.baseName.py. Путь для файлов профилей – переменная окруженияHOMEили, если она не определена,os.curdir.-
tk -
Объект приложения Tk, созданный путём создания экземпляра
Tk. Это обеспечивает доступ к интерпретатору Tcl. Каждый виджет, прикреплённый к тому же экземпляруTk, имеет то же значение для атрибутаtk.
-
master -
Объект виджета, содержащего этот виджет. Для
Tk, master равенNone, потому что это главное окно. Термины master и parent похожи и иногда используются взаимозаменяемо в качестве имён аргументов; однако, вызовwinfo_parent()возвращает строку имени виджета, в то время какmasterвозвращает объект. parent/child отражает древовидные отношения, а master/slave отражает структуру контейнера.
-
children -
Непосредственные потомки этого виджета как
dictс именами виджетов-потомков в качестве ключей и объектами экземпляров потомков в качестве значений.
-
tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False) -
Функция
Tcl()— это функция-фабрика, которая создаёт объект, очень похожий на тот, что создаётся классомTk, за исключением того, что он не инициализирует подсистему Tk. Это наиболее полезно при управлении интерпретатором Tcl в среде, где не нужно создавать лишних окон верхнего уровня, или где это невозможно (например, на системах Unix/Linux без сервера X). Объект, созданный объектомTcl(), может иметь созданное окно Toplevel (и инициализированную подсистему Tk) путём вызова методаloadtk().
Модули, которые обеспечивают поддержку Tk, включают:
-
tkinter -
Основной модуль Tkinter.
-
tkinter.colorchooser -
Диалоговое окно для выбора цвета пользователем.
-
tkinter.commondialog -
Базовый класс для диалоговых окон, определённых в других перечисленных здесь модулях.
-
tkinter.filedialog -
Общие диалоговые окна для разрешения пользователю указать файл для открытия или сохранения.
-
tkinter.font -
Утилиты для работы с шрифтами.
-
tkinter.messagebox -
Доступ к стандартным диалоговым окнам Tk.
-
tkinter.scrolledtext -
Виджет Text со встроенной вертикальной полосой прокрутки.
-
tkinter.simpledialog -
Базовые диалоговые окна и утилитарные функции.
-
tkinter.ttk -
Набор тематических виджетов, представленных в Tk 8.5, предоставляющий современные альтернативы многим классическим виджетам в основном модуле
tkinter.
Дополнительные модули:
-
_tkinter -
Бинарный модуль, содержащий интерфейс низкого уровня к Tcl/Tk. Он автоматически импортируется основным модулем
tkinterи никогда не должен использоваться программистами приложений напрямую. Обычно это динамическая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python. -
idlelib -
Интегрированная среда разработки и обучения Python (IDLE). Основана на
tkinter. -
tkinter.constants -
Символьные константы, которые могут быть использованы вместо строк при передаче различных параметров в вызовы Tkinter. Автоматически импортируется основным модулем
tkinter. -
tkinter.dnd -
(экспериментально) Поддержка перетаскивания для
tkinter. Станет устаревшим, когда будет заменён на Tk DND. -
tkinter.tix -
(устарело) Более старое стороннее пакет Tcl/Tk, добавляющее несколько новых виджетов. Лучшие альтернативы для большинства можно найти в
tkinter.ttk. -
turtle -
Графика черепахи в окне Tk.
Tkinter Спасательный круг
Данный раздел не предназначен для того, чтобы быть исчерпывающим руководством по Tk или Tkinter. Скорее, он призван быть временной мерой, предоставляя некоторое введение в систему.
Благодарности:
- Tk был написан Джоном Аустерхаутом в Беркли.
- Tkinter был написан Стеном Лумхольтом и Гвидо ван Россумом.
- Этот Спасательный круг был написан Мэттом Конвеем в Университете Вирджинии.
- Рендеринг HTML и некоторые существенные правки были произведены из версии FrameMaker Кэном Манхаймером.
- Фредрик Лундх расширил и переработал описания интерфейса классов, чтобы привести их в соответствие с Tk 4.2.
- Майк Кларксон конвертировал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.
Как использовать этот раздел
Этот раздел разработан в двух частях: первая (приблизительно) охватывает справочный материал, а вторая может быть использована как удобная справка.
При попытке ответить на вопросы типа «как сделать что-то», часто лучше выяснить, как сделать это в чистом Tk, а затем преобразовать это обратно в соответствующий tkinter вызов. Программисты Python часто могут догадаться о правильной команде Python, посмотрев документацию Tk. Это означает, что для использования Tkinter вам нужно будет немного знать о Tk. Этот документ не может выполнить эту роль, поэтому мы можем только указать вам на лучшие существующие документации. Вот несколько подсказок:
- Авторы настоятельно рекомендуют получить копию страниц справки Tk. В частности, страницы справки в каталоге
manNнаиболее полезны. Страницы справкиman3описывают интерфейс C с библиотекой Tk и поэтому не очень полезны для авторов сценариев. - Книга «Tcl и Tk Toolkit» Джона Аустерхаута, опубликованная Addison-Wesley (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 имеют имена с *путями*, как и файлы в файловой системе. Виджет верхнего уровня, *корень*, называется
.(точка), а подчинённые виджеты разделяются точками. Например,.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 — это метка (отключение меток в Tk не поддерживается).
Допустимые значения *someOptions* зависят от действия. Некоторые действия, такие как disable, не требуют аргументов, другие, например, команда delete текстового поля ввода, потребуют аргументы для указания диапазона текста для удаления.
Сопоставление основных команд 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()
Чтобы передать виджет в менеджер геометрии packer, вызывайте pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализуются как методы. Все виджеты в tkinter наследуются от Packer и поэтому наследуют все методы размещения. См. документацию модуля tkinter.tix для дополнительной информации о менеджере геометрии Form.
pack .fred -side left =====> fred.pack(side="left")
Справочное руководство
Параметры настройки
Параметры управляют такими аспектами, как цвет и ширина рамки виджета. Параметры можно задать тремя способами:
- При создании объекта, используя ключевые аргументы
-
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, метки — нет.
Параметры, поддерживаемые данным виджетом, перечислены в справочных страницах этого виджета, или могут быть запрошены во время выполнения вызовом метода 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')}
Конечно, распечатанный словарь будет включать все доступные параметры и их значения. Это только пример.
Упаковщик
Упаковщик — это один из механизмов управления геометрией Tk. Менеджеры геометрии используются для указания относительного расположения виджетов в их контейнере — их общем мастере. В отличие от более громоздкого размещателя (который используется реже и не рассматривается здесь), упаковщик принимает указания на качественные отношения — над, слева от, заполнять и т.д. — и сам вычисляет точные координаты расположения.
Размер любого виджета-мастера определяется размером «дочерних виджетов» внутри него. Упаковщик используется для управления тем, где появляются дочерние виджеты внутри родительского виджета, в который они упаковываются. Вы можете упаковывать виджеты в фреймы, а фреймы в другие фреймы, чтобы добиться желаемой компоновки. Кроме того, расположение динамически корректируется для учета изменений конфигурации после упаковки.
Обратите внимание, что виджеты не появляются, пока их геометрия не будет задана с помощью менеджера геометрии. Это распространённая ошибка на ранних этапах работы — пропустить указание геометрии и затем удивляться, что виджет создан, но ничего не отображается. Виджет отобразится только после того, как к нему, например, будет применён метод pack() упаковщика.
Метод pack() можно вызывать с парами «ключевой параметр/значение», которые управляют тем, где виджет должен появиться внутри контейнера и как он должен вести себя при изменении размера основного окна приложения. Вот несколько примеров:
fred.pack() # defaults to side = "top" fred.pack(side="left") fred.pack(expand=1)
Параметры упаковщика
Для получения более подробной информации об упаковщике и параметрах, которые он может принимать, см. справочные страницы и страницу 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.
Уже определены многие полезные подклассы 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()
# Create the application variable.
self.contents = tk.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
# Define a callback for when the user hits return.
# It prints the current value of the variable.
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. Виджеты Toplevel являются подклассами класса Wm, и поэтому могут непосредственно вызывать методы Wm.
Чтобы получить окно toplevel, содержащее данный виджет, часто можно просто обратиться к мастеру виджета. Конечно, если виджет упакован внутри фрейма, мастер не будет представлять собой окно toplevel. Чтобы получить окно toplevel, содержащее произвольный виджет, можно вызвать метод _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()
Типы данных опций Tk
- anchor
-
Допустимые значения — точки компаса:
"n","ne","e","se","s","sw","w","nw", а также"center". - bitmap
-
Существует восемь встроенных, именованных растровых изображений:
'error','gray25','gray50','hourglass','info','questhead','question','warning'. Чтобы указать имя файла X растрового изображения, укажите полный путь к файлу, предваряя его@, как в"yes". - 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
-
это строка, обозначающая целевой тип события. (Подробности см. в руководстве bind и на странице 201 книги Джона Остерхауса).
- func
-
это функция Python, принимающая один аргумент, которая должна быть вызвана при возникновении события. В качестве аргумента будет передано событие. (Функции, используемые таким образом, обычно называются обработчиками.)
- 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 | 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 (index, view index и т. д.)
-
Виджеты Entry имеют параметры, которые ссылаются на позиции символов в отображаемом тексте. Вы можете использовать эти
tkinterфункции для доступа к этим особым точкам в виджетах текста: - Индексы виджетов Text
-
Индексация виджетов Text очень богата и лучше всего описывается в руководстве Tk.
- Индексы меню (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 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/tkinter.html