Spec-Zone.ru › Python 3.8

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")

Как 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 для рисования графики на экране.

END_OF_DOCUMENT_MARKER

Полезная справка

Параметры настройки

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

При создании объекта, используя ключевые аргументы
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

имя параметра

'relief'

1

имя параметра для поиска в базе данных

'relief'

2

класс параметра для поиска в базе данных

'Relief'

3

значение по умолчанию

'raised'

4

текущее значение

'groove'

Пример:

>>> 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API