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)

Отменяет регистрацию обработчика файлов.

tkinter.READABLE
tkinter.WRITABLE
tkinter.EXCEPTION

Константы, используемые в аргументах mask.