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
Руководство темы Python Tkinter предоставляет большую информацию об использовании Tk от Python и ссылок с другими источниками информации о Tk.
TKDocs
Обширное учебное пособие и более удобные страницы виджетов для некоторых виджетов.
Ссылка на Tkinter 8.5: графический интерфейс для Python
Он-лайн справочный материал.
Tkinter документы от effbot
Интерактивная ссылка на tkinter, поддерживаемая effbot.org.
Программирование Python
Книга марка лутца, имеет отличное освещение ткинтера.
Современный Tkinter для занятых разработчиков Python
Книга марка роузмана о построении привлекательных и современных графических пользовательских интерфейсов с Python и Tkinter.
Программирование на Python и Tkinter
Книга Джона Грейсона (ISBN 1-884777-81-3).

Tcl/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() объектом, может иметь окно Toplevel, созданное (и инициализированную подсистему 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 был написан Джоном Оустерхаутом (John Ousterhout) во время пребывания в Беркли.
  • Tkinter был написан Стином Люмхолтом (Steen Lumholt) и Гидо ван Россумом (Guido van Rossum).
  • Этот Спасательный круг был написан Мэттом Конуэем (Matt Conway) в университете Вирджинии.
  • Рендеринг HTML и некоторые либеральные изменения были произведены из версии FrameMaker Кеном Манхаймером (Ken Manheimer).
  • Фредрик Лундх (Fredrik Lundh) разработал и пересмотрел описания интерфейсов классов, чтобы получить их в актуальном виде с Tk 4.2.
  • Майк Кларксон (Mike Clarkson) преобразовал документацию в LaTeX и составил главу «Пользовательский интерфейс» справочного руководства.

Как использовать этот раздел

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

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

  • Авторы настоятельно предлагают получить копию страниц Tk man. В частности, наиболее полезны мужские страницы в каталоге manN. Страницы man3 man описывают интерфейс C с библиотекой Tk и поэтому не особенно полезны для составителей сценариев.
  • Addison-Wesley публикует книгу под названием «Tcl and the 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 - это только его class, options, которые помогают его настроить, и actions, которые заставляют его делать полезные вещи.

Чтобы создать виджет в Tk, команда всегда имеет форму:

classCommand newPathname options
classCommand
обозначает, какой вид виджета создать (кнопка, метка, меню…)
newPathname
новое имя этого виджета. Все имена в Tk должны быть уникальными. Чтобы обеспечить это, виджеты в Tk именуются с помощью pathnames, как и файлы в файловой системе. Виджет верхнего уровня, root, называется . (точка), а потомки разделяются несколькими точками. Например, .myApp.controlPanel.okButton может быть именем виджета.
options
настроить внешний вид виджета, а в некоторых случаях и его поведение. Варианты поставляются в виде списка флагов и значения. Флагам предшествует „-„, как и командным флагам оболочки Unix, и значения помещаются в кавычки, если они больше одного слова.

Например:

button   .fred   -fg red -text "hi there"
   ^       ^     \______________________/
   |       |                |
 class    new            options
command  widget  (-opt val -opt val ...)

После создания путь к виджету становится новой командой. Этот новый widget command является дескриптором программиста для получения нового виджета для выполнения некоторых action. В 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()

Для предоставления виджета пакеру (менеджеру геометрии) вызывается пакет с необязательными аргументами. В 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)
Эти команды и их аргументы будут переданы функции 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 для рассматриваемого виджета.

Обратите внимание, что на справочных страницах перечислены «STANDARD OPTIONS» и «WIDGET SPECIFIC OPTIONS» для каждого виджета. Первый является списком параметров, которые являются общими для многих виджетов, второй является опциями, которые являются идиосинкратичными для этого конкретного виджета. Стандартные параметры задокументированы на странице options(3).

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

Параметры, поддерживаемые данным виджетом, перечислены на справочной странице этого виджета или могут быть запрошены во время выполнения путем вызова метода 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')}

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

Пакер

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

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

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

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

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

Опции пакера

Для получения более подробной информации о упаковщике и опциях, которые он может использовать, см. справочные страницы и страницу 183 книги Джона Оустерхаута (John Ousterhout’s).

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(). Если вы следуете этому протоколу, виджет всегда будет отслеживать значение переменной, без дальнейшего вмешательства с вашей стороны.

Например:

class App(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

        self.entrythingy = Entry()
        self.entrythingy.pack()

        # вот переменная приложения
        self.contents = StringVar()
        # установить его на некоторое значение
        self.contents.set("this is a variable")
        # сказать виджету записи смотреть эту переменную
        self.entrythingy["textvariable"] = self.contents

        # и здесь мы получаем колбэк, когда пользователь попадает в возвращает. программа
        # распечатает значение переменной приложения при попадании пользователя в
        # возвращение
        self.entrythingy.bind('<Key-Return>',
                              self.print_contents)

    def print_contents(self, event):
        print("hi. contents of entry is now ---->",
              self.contents.get())

Диспетчер окон

В Tk имеется служебная команда wm для взаимодействия с оконным менеджером. Параметры команды wm позволяют управлять такими элементами, как заголовки, размещение, растровые изображения значков и т.п. В tkinter эти команды были реализованы как методы в классе Wm. Виджеты Toplevel относятся к подклассу класса 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

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() какого-либо виджета scrollbar, но может быть любым методом виджета, который принимает один аргумент.
wrap:
Должно быть одним из: "none", "char" или "word".

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

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

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

где:

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

Например:

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

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

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

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». Они используемый указывать на определенное место в виджете «Текст», на определенные символы в виджете «Ввод» или на определенные пункты меню в виджете «Меню».

Индексы виджетов ввода (индекс, индекс вида и т.д.)
Виджеты ввода имеют параметры, относящиеся к символ позициям в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции tkinter:
Индексы текстовых виджетов
Представление индекса для текстовых виджетов очень богато и лучше всего описано на страницах Tk man.
Индексы меню (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, когда 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.