Spec-Zone.ru › Python 3.5

tkinter — Python-интерфейс к Tcl/Tk

Исходный код: Lib/tkinter/__init__.py

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

См. также

Python Tkinter Resources
Руководство по теме Python Tkinter содержит много информации об использовании Tk из Python и ссылки на другие источники информации о Tk.
TKDocs
Подробный учебник плюс более удобные страницы виджетов для некоторых виджетов.
Tkinter справочник: GUI для Python
Справочная информация онлайн.
Tkinter docs from effbot
Справочник по tkinter, поддерживаемый effbot.org.
Tcl/Tk справочник
Официальный справочник для последней версии tcl/tk.
Programming Python
Книга Марка Лаутца, содержит отличное описание Tkinter.
Modern Tkinter for Busy Python Developers
Книга Марка Розермана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.
Python и Tkinter программирование
Книга Джона Грейсона (ISBN 1-884777-81-3).

1. Модули 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.

2. Tkinter Life Preserver

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

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

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

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

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

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

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

См. также

Tcl/Tk 8.6 страницы справки
Справочная информация по Tcl/Tk на www.tcl.tk.
ActiveState Tcl Главная страница
Разработка Tk/Tcl в основном происходит на ActiveState.
Tcl and the Tk Toolkit
Книга Джона Оустерхаута, изобретателя Tcl.
Practical Programming in Tcl and Tk
Энциклопедическая книга Брента Велча.

2.2. Программа Hello World

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(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=root.destroy)
        self.quit.pack(side="bottom")

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

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

3. Краткий обзор 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 текстового поля ввода, требуют аргументов для указания диапазона текста, который необходимо удалить.

4. Сопоставление базового 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")

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

6. Справочник

6.1. Настройка параметров

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

При создании объекта, используя ключевые аргументы
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-кортеж, а не 5-кортеж. 2-кортеж, возвращённый обратно, будет содержать имя синонима и «реальный» параметр (например, ('bg', 'background')).

Индекс Значение Пример
0 имя параметра 'relief'
1 имя параметра для поиска в базе данных 'relief'
2 класс параметра для поиска в базе данных 'Relief'
3 значение по умолчанию 'raised'
4 текущее значение 'groove'

Пример:

>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}

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

6.2. Диспетчер пакетов

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

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

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

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

fred.pack()                     # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)

6.3. Параметры диспетчера пакетов

Для получения более подробной информации о диспетчере пакетов и параметрах, которые он может принимать, см. руководства man и страницу 183 книги Джона Аустерхаута.

anchor
Тип якорной точки. Указывает, где диспетчер пакетов размещает каждый подчинённый виджет в своём фрагменте.
expand
Булево значение, 0 или 1.
fill
Допустимые значения: 'x', 'y', 'both', 'none'.
ipadx и ipady
Расстояние — обозначающее внутренний отступ с каждой стороны виджета-подчинённого.
padx и pady
Расстояние — обозначающее внешний отступ с каждой стороны виджета-подчинённого.
side
Допустимые значения: 'left', 'right', 'top', 'bottom'.

6.4. Связывание переменных виджетов

Текущее значение некоторых виджетов (например, виджетов текстовых полей) можно напрямую связать с переменными приложения, используя специальные параметры. Эти параметры — 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())

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

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

6.6. Типы данных опций 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".

6.7. Связывания и события

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

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

где:

sequence
является строкой, обозначающей целевой тип события. (Подробности см. в руководстве по bind и на странице 201 книги Джона Остерхаута).
func
является функцией Python, принимающей один аргумент, которая вызывается при возникновении события. В качестве аргумента передаётся объект Event. (Функции, используемые таким образом, обычно называются обработчиками.)
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

6.8. Параметр 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 могут интерпретироваться как вышеупомянутые литералы.

6.9. Изображения

Изображения битмап/пиксельный мап можно создавать с помощью подклассов tkinter.Image:

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

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

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

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

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(); для других файлов используйте операции чтения или 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/tkinter.html

Spec-Zone.ru

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