tkinter — Python-интерфейс к Tcl/Tk
Исходный код: Lib/tkinter/__init__.py
Пакет tkinter («Tk-интерфейс») — стандартный Python-интерфейс к набору инструментов Tk GUI. Tk и tkinter доступны на большинстве платформ Unix, а также на системах Windows. (Сам Tk не входит в Python; он поддерживается ActiveState.)
Запуск python -m tkinter из командной строки должен открыть окно, демонстрирующее простой Tk-интерфейс, показывая, что tkinter корректно установлен на вашей системе, а также показывая, какая версия Tcl/Tk установлена, так что вы можете прочитать документацию Tcl/Tk, специфичную для этой версии.
См. также
Документация по Tkinter:
- Python Tkinter Resources
-
Руководство по теме Python Tkinter содержит много информации об использовании Tk из Python и ссылки на другие источники информации о Tk.
- TKDocs
-
Подробный учебник плюс более понятные страницы виджетов для некоторых виджетов.
- Tkinter 8.5 справочник: графический интерфейс пользователя для Python
-
Справочные материалы онлайн.
- Tkinter docs от effbot
-
Онлайн справка по tkinter, поддерживаемая effbot.org.
- Programming Python
-
Книга Марка Лаутца, содержит отличное описание Tkinter.
- Modern Tkinter for Busy Python Developers
-
Книга Марка Роземана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.
- Python and Tkinter Programming
-
Книга Джона Грейсона (ISBN 1-884777-81-3).
Документация по Tcl/Tk:
- Команды Tk
-
Большинство команд доступны в виде
tkinterилиtkinter.ttkклассов. Замените ‘8.6’ на версию вашей установки Tcl/Tk. - Последние страницы справки Tcl/Tk
-
Последние руководства по Tcl/Tk на www.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 -
Виджет Text с встроенной вертикальной полосой прокрутки.
-
tkinter.colorchooser -
Диалог для выбора цвета пользователем.
-
tkinter.commondialog -
Базовый класс для диалогов, определённых в других модулях, перечисленных здесь.
-
tkinter.filedialog -
Общие диалоги для того, чтобы пользователь мог указать файл для открытия или сохранения.
-
tkinter.font -
Утилиты для работы с шрифтами.
-
tkinter.messagebox -
Доступ к стандартным диалоговым окнам Tk.
-
tkinter.simpledialog -
Базовые диалоговые окна и вспомогательные функции.
-
tkinter.dnd -
Поддержка перетаскивания для
tkinter. Это экспериментально и должно быть устаревшим, когда оно будет заменено DND Tk. -
turtle -
Графика Черепахи в окне Tk.
Tkinter Life Preserver
Этот раздел не предназначен для исчерпывающего учебника по Tk или Tkinter. Вместо этого он призван быть временным решением, обеспечивая некоторое вводное ориентационное представление о системе.
Благодарности:
- Tk был написан Джоном Аустерхаутом в Беркли.
- Tkinter был написан Стеном Люмхолтом и Гвидо ван Россумом.
- Эта «Подручная помощь» была написана Мэттом Конвеем в Университете Вирджинии.
- Представление HTML и некоторые изменения были получены из версии FrameMaker Кеном Манхайтером.
- Фредрик Лунд внёс уточнения и переработал описания интерфейса классов, чтобы они соответствовали Tk 4.2.
- Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» в справочном руководстве.
Как использовать этот раздел
Этот раздел состоит из двух частей: первая (приблизительно) охватывает исходные материалы, а вторая может быть использована как полезная справка.
При попытке ответить на вопросы типа «как сделать blah», часто лучше выяснить, как сделать «blah» непосредственно в Tk, а затем преобразовать это в соответствующий вызов tkinter. Программисты Python часто могут угадать правильную команду Python, глядя на документацию Tk. Это означает, что для использования Tkinter вам нужно немного знать о Tk. Этот документ не может выполнить эту роль, поэтому мы можем лишь направить вас к лучшим существующим документам. Вот несколько советов:
- Авторы настоятельно рекомендуют получить копию страниц справки Tk. В частности, страницы справки в каталоге
manNнаиболее полезны. Страницы справкиman3описывают C-интерфейс библиотеки Tk и поэтому не особенно полезны для сценаристов. - Книгу Аддисон-Уэсли «Tcl и набор инструментов Tk» Джона Аустерхаута (ISBN 0-201-63337-X) можно считать хорошим введением в Tcl и Tk для новичка. Книга не исчерпывающая и во многих деталях ссылается на страницы справки.
-
tkinter/__init__.py— последнее средство для большинства, но может быть хорошим местом, когда ничего другое не имеет смысла.
Простая программа «Привет, мир»
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 имеют имена с путями, как файлы в файловой системе. Корневой виджет, 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 текстового поля ввода, требуют аргументов для указания диапазона текста для удаления.
Сопоставление основных команд 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()
Чтобы передать виджет менеджеру размещения (geometry manager), вызывайте 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 для соответствующего виджета.
Обратите внимание, что страницы руководства перечисляют «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА», для каждого виджета. Первые — это список параметров, общих для многих виджетов, вторые — параметры, специфичные для данного виджета. Стандартные параметры описаны на странице руководства 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 растрового изображения укажите полный путь к файлу, предваряемый@, как в"@/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
-
— строка, обозначающая целевой тип события. (Подробности см. в справке 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, когда доступен I/O на дескрипторе файла. Только один обработчик может быть зарегистрирован на один дескриптор файла. Пример кода:
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.8/library/tkinter.html