Spec-Zone.ru › Python 3.7

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 от effbot

Справочная информация онлайн, поддерживаемая 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 and the Tk Toolkit

Книга Джона Остерхаута, изобретателя Tcl.

Practical Programming in Tcl and 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 был написан Джоном Остерхаутом в Беркли.
  • Tkinter был написан Стёном Люмхолтом и Гвидо ван Россумом.
  • Этот справочник был написан Мэттом Конвеем в Университете Вирджинии.
  • Отрисовка HTML и некоторые либеральные правки были созданы из версии FrameMaker Кеном Мэнхаймером.
  • Фредрик Лундх расширил и переработал описания интерфейса класса, чтобы сделать их актуальными для Tk 4.2.
  • Майк Кларксон конвертировал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.

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

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

При попытке ответить на вопросы типа «как сделать бла-бла», часто лучше всего выяснить, как сделать «бла-бла» в чистом 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 — это крайняя мера для большинства, но может быть хорошим местом для поиска, когда ничего другого не имеет смысла.

Простая программа «Привет, мир»

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 того, что показано ниже.)

END_OF_DOCUMENT_MARKER

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

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

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

Установка параметров

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

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

Например:

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

Менеджер окон

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

Чтобы получить окно верхнего уровня, содержащее данный виджет, вы часто можете просто обратиться к master виджета. Конечно, если виджет был размещён внутри фрейма, master не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, вы можете вызвать метод _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 bitmap-файла, укажите полный путь к файлу, предваряемый @, как в "@/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". Также можно указать собственный файл bitmap и mask. См. страницу 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

— строка, обозначающая целевой тип события. (См. страницу man для 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 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

Параметр 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, и других.

Обработчики файлов Tkinter

Tk позволяет регистрировать и отменять регистрацию функции обратного вызова, которая будет вызываться из Tk mainloop, когда для дескриптора файла доступен ввод-вывод. Только один обработчик может быть зарегистрирован на один дескриптор файла. Пример кода:

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(); для других файлов используйте чтение в сыром виде или %%%CODE_BLOCK_195%%.

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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/tkinter.html

Spec-Zone.ru

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