Документация Python неофициальный перевод
Содержание страницы

tkinter – интерфейс Python для Tcl/Tktkinter – Python interface to Tcl/Tk

Пакет tkinter («Tk interface») – это стандартный интерфейс Python к инструментарию графического интерфейса Tk. И Tk, и tkinter доступны на большинстве Unix-платформ, а также на системах Windows. (Tk не является частью Python; он поддерживается компанией ActiveState.)

См. также

Ресурсы Python Tkinter
В руководстве по теме Python Tkinter содержится много информации об использовании Tk из Python, а также ссылки на другие источники информации о Tk.
Введение в Tkinter
Справочные материалы Фредрика Лунда в интернете.
Справочник по Tkinter: графический интерфейс для Python
Онлайн-справочные материалы.
Tkinter для JPython
Интерфейс Jython для Tkinter.
Программирование на Python и Tkinter
Книга Джона Грейсона (ISBN 1-884777-81-3).

Модули TkinterTkinter Modules

В большинстве случаев достаточно tkinter, но доступен и ряд дополнительных модулей. Интерфейс Tk находится в двоичном модуле с именем _tkinter. Этот модуль содержит низкоуровневый интерфейс к Tk, и его не следует напрямую использовать программистам приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях может быть статически скомпонована с интерпретатором Python.

В дополнение к модулю интерфейса Tk, tkinter включает ряд модулей Python, одним из наиболее важных из которых является tkinter.constants. Импорт tkinter автоматически импортирует tkinter.constants, поэтому обычно для использования Tkinter достаточно простого оператора import:

import tkinter

Или, чаще:

from tkinter import *
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)
Класс Tk создаётся без аргументов. Это создаёт верхнеуровневый виджет Tk, который обычно является главным окном приложения. Каждый экземпляр имеет свой собственный связанный интерпретатор Tcl.
tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)
Функция Tcl() является фабричной функцией, которая создаёт объект, очень похожий на тот, что создаётся классом Tk, за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при работе с интерпретатором Tcl в среде, где не нужно создавать лишние верхнеуровневые окна, или где это невозможно (например, в системах Unix/Linux без X-сервера). Объект, созданный функцией Tcl(), может иметь окно Toplevel (и инициализированную подсистему Tk), созданное путём вызова его метода loadtk().

Другие модули, обеспечивающие поддержку Tk, включают:

tkinter.scrolledtext
Текстовый виджет со встроенной вертикальной полосой прокрутки.
tkinter.colorchooser
Диалоговое окно для выбора цвета пользователем.
tkinter.commondialog
Базовый класс для диалогов, определённых в других перечисленных здесь модулях.
tkinter.filedialog
Стандартные диалоги для указания файла для открытия или сохранения.
tkinter.font
Утилиты для работы со шрифтами.
tkinter.messagebox
Доступ к стандартным диалоговым окнам Tk.
tkinter.simpledialog
Базовые диалоги и вспомогательные функции.
tkinter.dnd
Поддержка перетаскивания (drag-and-drop) для tkinter. Является экспериментальной и должна стать устаревшей, когда будет заменена на Tk DND.
turtle
Черепашья графика в окне Tk.

Спасательный круг TkinterTkinter Life Preserver

Этот раздел не задумывался как исчерпывающее руководство по Tk или Tkinter. Скорее, он предназначен в качестве временной меры, дающей начальное представление о системе.

Благодарности:

  • Tkinter был написан Стином Лумхольтом и Гвидо ван Россумом.
  • Tk был написан Джоном Аустерхутом во время его работы в Беркли.
  • Этот документ «Life Preserver» был написан Мэттом Конуэем в Университете Вирджинии.
  • HTML-рендеринг и некоторая редакционная правка выполнены на основе версии FrameMaker Кена Манхаймера.
  • Фредрик Лундх дополнил и пересмотрел описания интерфейсов классов, чтобы привести их в соответствие с Tk 4.2.
  • Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.

Как использовать этот разделHow To Use This Section

Этот раздел состоит из двух частей: первая половина (примерно) охватывает теоретический материал, а вторую половину можно использовать как удобный справочник прямо за клавиатурой.

При попытке ответить на вопросы вроде «как сделать то-то», часто лучше сначала выяснить, как это сделать на чистом Tk, а затем преобразовать это в соответствующий вызов tkinter. Программисты на Python часто могут угадать правильную команду Python, посмотрев документацию Tk. Это означает, что для использования Tkinter необходимо немного знать Tk. Этот документ не может выполнить эту роль, поэтому лучшее, что можно сделать – указать на лучшую существующую документацию. Вот несколько советов:

  • Авторы настоятельно рекомендуют обзавестись копией страниц руководства Tk. В частности, наиболее полезны страницы из каталога mann. Страницы в каталоге man3 описывают C-интерфейс к библиотеке Tk и поэтому не особенно полезны для авторов скриптов.
  • Издательство Addison-Wesley выпустило книгу «Tcl and the Tk Toolkit» Джона Аустерхута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не является исчерпывающей и по многим деталям отсылает к страницам руководства.
  • tkinter/__init__.py – это крайнее средство для большинства, но может быть хорошим местом, куда обратиться, когда всё остальное не имеет смысла.

См. также

Домашняя страница ActiveState Tcl
Разработка Tk/Tcl в основном ведется в ActiveState.
Tcl и инструментарий Tk
Книга Джона Остерхута, создателя Tcl.
Практическое программирование на Tcl и Tk
Энциклопедическая книга Брента Уэлча.

Простая программа Hello WorldA Simple Hello World Program

from tkinter import *

class Application(Frame):
    def say_hi(self):
        print("hi there, everyone!")

    def createWidgets(self):
        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"]   = "red"
        self.QUIT["command"] =  self.quit

        self.QUIT.pack({"side": "left"})

        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi

        self.hi_there.pack({"side": "left"})

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

Краткий (очень) обзор Tcl/TkA (Very) Quick Look at Tcl/Tk

Иерархия классов выглядит сложной, но на практике разработчики приложений почти всегда обращаются к классам, находящимся в самом низу иерархии.

Примечания:

  • Эти классы предоставлены для организации определённых функций в одном пространстве имён. Они не предназначены для самостоятельного создания экземпляров.
  • Класс Tk предназначен для создания только одного экземпляра в приложении. Разработчикам приложений не нужно создавать его явно, система создаёт один экземпляр всякий раз, когда создаётся любой из других классов.
  • Класс Widget не предназначен для создания экземпляров, он предназначен только для создания подклассов, чтобы создавать «настоящие» виджеты (в C++ это называется «абстрактный класс»).

Чтобы использовать этот справочный материал, иногда потребуется уметь читать короткие фрагменты Tk и определять различные части команды Tk. (См. раздел Mapping Basic Tk into Tkinter, где приведены эквиваленты tkinter для описанного ниже.)

Скрипты Tk – это программы на Tcl. Как и все программы на Tcl, скрипты Tk представляют собой просто списки токенов, разделённых пробелами. Виджет Tk – это его класс, параметры, помогающие его настроить, и действия, которые заставляют его выполнять полезные функции.

Чтобы создать виджет в Tk, команда всегда имеет следующий вид:

classCommand newPathname options
classCommand
обозначает, какой виджет создавать (кнопку, метку, меню...)
newPathname
это новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы помочь обеспечить это, виджеты в Tk именуются с помощью путевых имён, как файлы в файловой системе. Верхнеуровневый виджет, корень (root), называется . (точка) и дочерние элементы разделяются дополнительными точками. Например, .myApp.controlPanel.okButton может быть именем виджета.
опции
Настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры передаются в виде списка флагов и значений. Флаги предваряются дефисом «-», как флаги команд 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 в TkinterMapping Basic Tk into Tkinter

Команды классов в Tk соответствуют конструкторам классов в Tkinter.

button .fred                =====>  fred = Button()

Родительский элемент объекта неявно задаётся в новом имени, присваиваемом ему при создании. В Tkinter родительские элементы указываются явно.

button .panel.fred          =====>  fred = Button(panel)

Параметры конфигурации в Tk передаются в виде списков тегов с дефисами, за которыми следуют значения. В Tkinter параметры задаются как именованные аргументы в конструкторе экземпляра, и именованные аргументы для вызовов configure или как индексы экземпляра в стиле словаря для уже созданных экземпляров. Смотрите раздел Установка параметров о настройке параметров.

button .fred -fg red        =====>  fred = Button(panel, fg = "red")
.fred configure -fg red     =====>  fred["fg"] = red
                            OR ==>  fred.config(fg = "red")

В Tk для выполнения действия над виджетом используется имя виджета как команда, а за ним следует имя действия, возможно, с аргументами (опциями). В Tkinter вызов методов экземпляра класса служит для вызова действий над виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в модуле Tkinter.py.

.fred invoke                =====>  fred.invoke()

Чтобы передать виджет упаковщику (менеджеру геометрии), вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, а различные формы команды pack реализованы как методы. Все виджеты в tkinter являются подклассами Packer и наследуют все методы упаковки. См. документацию модуля tkinter.tix для дополнительной информации о менеджере геометрии Form.

pack .fred -side left       =====>  fred.pack(side = "left")

Краткий справочникHandy Reference

Установка опцийSetting Options

Параметры управляют такими вещами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:

При создании объекта – с помощью именованных аргументов
fred = Button(self, fg = "red", bg = "blue")
После создания объекта – используя имя параметра как индекс словаря
fred["fg"] = "red"
fred["bg"] = "blue"
Использовать метод config() для обновления нескольких атрибутов после создания объекта
fred.config(fg = "red", bg = "blue")

Полное объяснение конкретного параметра и его поведения можно найти на man-страницах Tk для соответствующего виджета.

Обратите внимание: на man-страницах перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ ВИДЖЕТА» для каждого виджета. Первые – это параметры, общие для многих виджетов, вторые – параметры, свойственные конкретному виджету. Стандартные параметры описаны на man-странице options(3).

В этом документе не делается различий между стандартными и специфическими для виджета опциями. Некоторые опции не применимы к некоторым типам виджетов. Реагирует ли данный виджет на конкретную опцию, зависит от класса виджета: кнопки имеют опцию command, метки – нет.

Опции, поддерживаемые данным виджетом, перечислены на его 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')}

Разумеется, выведенный словарь будет содержать все доступные опции и их значения. Это приведено только в качестве примера.

УпаковщикThe Packer

Упаковщик – один из механизмов управления геометрией в Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера – их общего родителя. В отличие от более громоздкого разместителя (который используется реже и здесь не рассматривается), упаковщик принимает качественные спецификации взаимосвязей – выше, слева от, заполнение и т.д. – и самостоятельно вычисляет точные координаты размещения.

Размер любого родительского виджета определяется размером находящихся внутри «дочерних виджетов». Упаковщик используется для управления тем, где дочерние виджеты появляются внутри родителя, в который они упакованы. Виджеты можно упаковывать во фреймы, а фреймы – в другие фреймы, чтобы добиться желаемого расположения. Кроме того, после упаковки расположение динамически настраивается для учета инкрементальных изменений конфигурации.

Обратите внимание, что виджеты не отображаются, пока для них не указана геометрия с помощью менеджера геометрии. Типичная ошибка новичков – пропустить указание геометрии, а затем удивляться, что виджет создан, но ничего не отображается. Виджет появится только после того, как к нему будет применён, например, метод упаковщика pack().

Метод pack() можно вызывать с парами «ключевая опция/значение», которые управляют тем, где виджет будет располагаться внутри контейнера и как он будет вести себя при изменении размера главного окна приложения. Вот несколько примеров:

fred.pack()                     # по умолчанию side = "top"
fred.pack(side = "left")
fred.pack(expand = 1)

Опции упаковщикаPacker Options

За более подробной информацией об упаковщике и его опциях обращайтесь к man-страницам и странице 183 книги Джона Оустерхаута.

привязка
Тип привязки. Указывает, где упаковщик должен размещать каждый дочерний виджет в его отведенной области.
расширение
Логическое значение, 0 или 1.
заполнение
Допустимые значения: 'x', 'y', 'both', 'none'.
ipadx и ipady
Расстояние – задает внутренний отступ с каждой стороны дочернего виджета.
padx и pady
Расстояние – задает внешний отступ с каждой стороны дочернего виджета.
сторона
Допустимые значения: 'left', 'right', 'top', 'bottom'.

Привязка переменных виджетовCoupling Widget Variables

Текущее значение некоторых виджетов (например, полей ввода текста) можно напрямую связать с переменными приложения с помощью специальных опций. Эти опции: variable, textvariable, onvalue, offvalue и value. Эта связь работает в обе стороны: если переменная по какой-либо причине изменяется, виджет, к которому она привязана, обновляется, отражая новое значение.

К сожалению, в текущей реализации tkinter невозможно передать произвольную переменную Python виджету через опцию variable или textvariable. Единственные переменные, для которых это работает, – это переменные, унаследованные от класса Variable, определённого в tkinter.

Уже определено множество полезных подклассов Variable: StringVar, IntVar, DoubleVar и BooleanVar. Чтобы прочитать текущее значение такой переменной, вызовите метод get(), а чтобы изменить его – метод set(). Если следовать этому протоколу, виджет всегда будет отслеживать значение переменной без дальнейшего вмешательства.

Например:

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, 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())

Менеджер оконThe Window Manager

В Tk есть служебная команда wm для взаимодействия с менеджером окон. Опции команды wm позволяют управлять такими вещами, как заголовки, размещение, значки и т.п. В tkinter эти команды реализованы как методы класса Wm. Виджеты Toplevel являются подклассами класса Wm, поэтому могут напрямую вызывать методы Wm.

Чтобы получить окно верхнего уровня, содержащее данный виджет, можно часто просто обратиться к мастеру (master) виджета. Конечно, если виджет был упакован внутри фрейма, мастер не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод _root(). Этот метод начинается с подчёркивания, чтобы обозначить, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.

Вот несколько примеров типичного использования:

from tkinter import *
class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, 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()

Типы данных опций TkTk Option Data Types

привязка
Допустимые значения – стороны света: "n", "ne", "e", "se", "s", "sw", "w", "nw", а также "center".
битовая карта
Существует восемь встроенных именованных битовых карт: 'error', 'gray25', 'gray50', 'hourglass', 'info', 'questhead', 'question', 'warning'. Чтобы указать имя файла битовой карты X, укажите полный путь к файлу, перед которым ставится @, например "@/usr/contrib/bitmap/gumby.bit".
булевый
Можно передавать целые числа 0 или 1 или строки "yes" или "no" .
колбэк

Это любая функция Python, которая не принимает аргументов. Например:

def print_it():
        print("hi there")
fred["command"] = print_it
цвет
Цвета могут задаваться как имена цветов X из файла rgb.txt, или как строки, представляющие значения RGB в 4-битном: "#RGB", 8-битном: "#RRGGBB", 12-битном: "#RRRGGGBBB" или 16-битном: "#RRRRGGGGBBBB" диапазонах, где R,G,B здесь представляют любую допустимую шестнадцатеричную цифру. См. страницу 160 книги Уэстерхута для подробностей.
курсор
Стандартные имена курсоров X из cursorfont.h можно использовать без префикса XC_. Например, чтобы получить курсор в виде руки (XC_hand2), используйте строку "hand2". Также можно указать собственные файлы битовой карты и маски. См. стр. 179 книги Остерхаута.
расстояние
Экранные расстояния можно задавать в пикселях или в абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния – строками, причём конечный символ обозначает единицу измерения: c для сантиметров, i для дюймов, m для миллиметров, p для типографских пунктов. Например, 3,5 дюйма выражается как "3.5i".
шрифт
Tk использует формат списка имён шрифтов, например {courier 10 bold}. Размеры шрифта с положительными числами задаются в пунктах; размеры с отрицательными числами задаются в пикселях.
геометрия
Это строка вида widthxheight, где ширина и высота задаются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например: fred["geometry"] = "200x100".
выравнивание
Допустимые значения – строки: "left", "center", "right" и "fill".
регион
Это строка с четырьмя элементами, разделёнными пробелами, каждый из которых является допустимым расстоянием (см. выше). Например: "2 3 4 5" и "3i 2i 4.5i 2i" и "3c 2c 4c 10.43c" – всё это допустимые области.
рельеф
Определяет стиль границы виджета. Допустимые значения: "raised", "sunken", "flat", "groove" и "ridge".
команда прокрутки
Почти всегда это метод set() какого-нибудь виджета полосы прокрутки, но это может быть любой метод виджета, принимающий один аргумент. Для примера обратитесь к файлу Demo/tkinter/matt/canvas-with-scrollbars.py в дистрибутиве исходного кода Python.
перенос:
Должно быть одним из: "none", "char" или "word".

Привязки и событияBindings and Events

Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова при наступлении события такого типа. Формат метода bind:

def bind(self, sequence, func, add=''):

где:

последовательность
это строка, обозначающая целевой тип события. (См. man-страницу bind и страницу 201 книги Джона Оустерхаута для получения подробностей).
функция
– это функция Python, принимающая один аргумент, которая вызывается при наступлении события. В качестве аргумента будет передан экземпляр Event. (Функции, используемые таким образом, обычно называются колбэками.)
добавить
является необязательным, может быть '' или '+'. Передача пустой строки означает, что эта привязка заменяет любые другие привязки, связанные с этим событием. Передача '+' означает, что эта функция добавляется в список функций, привязанных к данному типу события.

Например:

def turnRed(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turnRed)

Обратите внимание, как в колбэке turnRed() происходит обращение к полю widget события. Это поле содержит виджет, который поймал X-событие. В следующей таблице перечислены другие поля события, к которым можно обращаться, и то, как они обозначаются в Tk, что может быть полезно при обращении к справочным страницам Tk (man pages).

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

Параметр indexThe index Parameter

Многие виджеты требуют передачи параметров «index». Они используются для указания на определённое место в виджете Text, или на определённые символы в виджете Entry, или на определённые пункты меню в виджете Menu.

Индексы виджета Entry (index, view index и т.д.)

Виджеты Entry имеют опции, ссылающиеся на позиции символов в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции tkinter:

AtEnd()
относится к последней позиции в тексте
AtInsert()
относится к точке, где находится текстовый курсор
AtSelFirst()
указывает начальную точку выделенного текста
AtSelLast()
обозначает последнюю точку выделенного текста и, наконец,
At(x[, y])
относится к символу по координатам пикселей x, y (при этом y не используется в случае виджета ввода текста, который содержит одну строку текста).
Индексы виджета Text
Обозначение индексов для виджетов Text очень богатое и лучше всего описано на страницах руководства Tk.
Индексы меню (menu.invoke(), menu.entryconfig() и т.д.)

Некоторые опции и методы для меню работают с конкретными пунктами меню. Всякий раз, когда для опции или параметра требуется индекс меню, можно передать:

  • целое число, которое указывает на числовую позицию пункта в виджете, считая сверху, начиная с 0;
  • строка 'active', которая указывает на позицию меню, находящуюся в данный момент под курсором;
  • строка "last", которая указывает на последний пункт меню;
  • Целое число, перед которым стоит @, например @6, где целое число интерпретируется как координата y в пикселях в системе координат меню;
  • строка "none", которая означает отсутствие пункта меню; чаще всего используется с menu.activate() для деактивации всех пунктов; и наконец,
  • текстовая строка, которая сопоставляется по шаблону с меткой пункта меню, при этом поиск выполняется сверху вниз. Обратите внимание, что этот тип индекса обрабатывается после всех остальных, то есть совпадения для пунктов меню с метками last, active или none могут быть интерпретированы как указанные выше литералы.

ИзображенияImages

Растровые изображения (Bitmap/Pixelmap) можно создавать через подклассы tkinter.Image:

  • BitmapImage можно использовать для растровых данных X11.
  • PhotoImage можно использовать для цветных растровых изображений в форматах GIF и PPM/PGM.

Любой тип изображения создаётся с помощью опции file или data (другие опции также доступны).

Затем объект изображения можно использовать везде, где опция image поддерживается каким-либо виджетом (например, метками, кнопками, меню). В таких случаях Tk не хранит ссылку на изображение. Когда удаляется последняя ссылка Python на объект изображения, данные изображения также удаляются, и Tk будет отображать пустой прямоугольник там, где использовалось изображение.