Spec-Zone.ru › Python 3.9

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

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

Пакет tkinter («Tk-интерфейс») — стандартный Python-интерфейс к графической библиотеке Tcl/Tk. Tk и tkinter доступны на большинстве платформ Unix, включая macOS, а также на системах Windows.

Запуск python -m tkinter из командной строки должен открыть окно, демонстрирующее простой Tk-интерфейс, позволяя убедиться, что tkinter корректно установлен на вашей системе, а также показывать версию установленного Tcl/Tk, чтобы вы могли прочитать документацию Tcl/Tk, соответствующую этой версии.

См. также

  • TkDocs

    Обширное руководство по созданию пользовательских интерфейсов с помощью Tkinter. Объясняет ключевые концепции и иллюстрирует рекомендуемые подходы с использованием современного API.

  • Tkinter 8.5 справочник: графический интерфейс для Python

    Справочная документация по Tkinter 8.5, описывающая доступные классы, методы и параметры.

Ресурсы Tcl/Tk:

  • Команды Tk

    Полноценная справка по каждой из команд Tcl/Tk, используемых Tkinter.

  • Главная страница Tcl/Tk

    Дополнительная документация и ссылки на разработку ядра Tcl/Tk.

Книги:

  • Современный Tkinter для занятых разработчиков Python

    Марк Роземан. (ISBN 978-1999149567)

  • Программирование на Python с Tkinter

    Алан Мур. (ISBN 978-1788835886)

  • Программирование на Python

    Марк Лутц; содержит отличное освещение Tkinter. (ISBN 978-0596158101)

  • Tcl и Tk Toolkit (2-е издание)

    Джон Аустерхаут, изобретатель Tcl/Tk, и Кен Джонс; не охватывает Tkinter. (ISBN 978-0321336330)

END_OF_DOCUMENT_MARKER

Модули Tkinter

Поддержка Tkinter распределена по нескольким модулям. Большинству приложений потребуется основной модуль tkinter, а также модуль tkinter.ttk, который предоставляет современный набор тематических виджетов и API:

from tkinter import *
from tkinter import ttk
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

Создаёт виджет Tk верхнего уровня, обычно являющийся главным окном приложения, и инициализирует интерпретатор Tcl для этого виджета. Каждый экземпляр имеет собственный связанный интерпретатор Tcl.

Класс Tk обычно создаётся с использованием всех значений по умолчанию. Однако в настоящее время распознаются следующие ключевые аргументы:

screenName

При указании (как строка) устанавливает переменную окружения DISPLAY. (Только X11)

baseName

Имя файла профиля. По умолчанию baseName выводится из имени программы (sys.argv[0]).

className

Имя класса виджета. Используется как имя файла профиля, а также как имя, с которым вызывается Tcl (argv0 в interp).

useTk

Если True, инициализирует подсистему Tk. Функция tkinter.Tcl() устанавливает это значение в False.

sync

Если True, выполняет все команды сервера X синхронно, чтобы ошибки сообщались немедленно. Может использоваться для отладки. (Только X11)

use

Указывает id окна, в котором нужно встроить приложение, вместо создания его как отдельного окна верхнего уровня. id должен быть указан так же, как и значение для опции -use для виджетов верхнего уровня (то есть, он имеет форму, возвращаемую winfo_id()).

Обратите внимание, что на некоторых платформах это будет работать корректно только если id ссылается на фрейм Tk или окно верхнего уровня, у которого включена опция -container.

Tk считывает и интерпретирует файлы профилей, названные .className.tcl и .baseName.tcl, в интерпретатор Tcl и вызывает exec() на содержимом .className.py и .baseName.py. Путь для файлов профилей – переменная окружения HOME или, если она не определена, os.curdir.

tk

Объект приложения Tk, созданный путём создания экземпляра Tk. Это обеспечивает доступ к интерпретатору Tcl. Каждый виджет, прикреплённый к тому же экземпляру Tk, имеет то же значение для атрибута tk.

master

Объект виджета, содержащего этот виджет. Для Tk, master равен None, потому что это главное окно. Термины master и parent похожи и иногда используются взаимозаменяемо в качестве имён аргументов; однако, вызов winfo_parent() возвращает строку имени виджета, в то время как master возвращает объект. parent/child отражает древовидные отношения, а master/slave отражает структуру контейнера.

children

Непосредственные потомки этого виджета как dict с именами виджетов-потомков в качестве ключей и объектами экземпляров потомков в качестве значений.

tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)

Функция Tcl() — это функция-фабрика, которая создаёт объект, очень похожий на тот, что создаётся классом Tk, за исключением того, что он не инициализирует подсистему Tk. Это наиболее полезно при управлении интерпретатором Tcl в среде, где не нужно создавать лишних окон верхнего уровня, или где это невозможно (например, на системах Unix/Linux без сервера X). Объект, созданный объектом Tcl(), может иметь созданное окно Toplevel (и инициализированную подсистему Tk) путём вызова метода loadtk().

Модули, которые обеспечивают поддержку Tk, включают:

tkinter

Основной модуль Tkinter.

tkinter.colorchooser

Диалоговое окно для выбора цвета пользователем.

tkinter.commondialog

Базовый класс для диалоговых окон, определённых в других перечисленных здесь модулях.

tkinter.filedialog

Общие диалоговые окна для разрешения пользователю указать файл для открытия или сохранения.

tkinter.font

Утилиты для работы с шрифтами.

tkinter.messagebox

Доступ к стандартным диалоговым окнам Tk.

tkinter.scrolledtext

Виджет Text со встроенной вертикальной полосой прокрутки.

tkinter.simpledialog

Базовые диалоговые окна и утилитарные функции.

tkinter.ttk

Набор тематических виджетов, представленных в Tk 8.5, предоставляющий современные альтернативы многим классическим виджетам в основном модуле tkinter.

Дополнительные модули:

_tkinter

Бинарный модуль, содержащий интерфейс низкого уровня к Tcl/Tk. Он автоматически импортируется основным модулем tkinter и никогда не должен использоваться программистами приложений напрямую. Обычно это динамическая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.

idlelib

Интегрированная среда разработки и обучения Python (IDLE). Основана на tkinter.

tkinter.constants

Символьные константы, которые могут быть использованы вместо строк при передаче различных параметров в вызовы Tkinter. Автоматически импортируется основным модулем tkinter.

tkinter.dnd

(экспериментально) Поддержка перетаскивания для tkinter. Станет устаревшим, когда будет заменён на Tk DND.

tkinter.tix

(устарело) Более старое стороннее пакет Tcl/Tk, добавляющее несколько новых виджетов. Лучшие альтернативы для большинства можно найти в tkinter.ttk.

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 и поэтому не очень полезны для авторов сценариев.
  • Книга «Tcl и Tk Toolkit» Джона Аустерхаута, опубликованная Addison-Wesley (ISBN 0-201-63337-X), является хорошим введением в Tcl и Tk для новичков. Книга не исчерпывающая, и во многих деталях она ссылается на страницы справки.
  • tkinter/__init__.py является последним средством для большинства, но может быть хорошим местом для обращения, когда ничего другого не имеет смысла.

Простая программа Hello World

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

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

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

Быстрый обзор Tcl/Tk

Иерархия классов выглядит сложной, но на практике программисты приложений почти всегда ссылаются на классы в самом низу иерархии.

Примечания:

  • Эти классы предоставляются для организации определенных функций в одном пространстве имен. Они не предназначены для независимой инициализации.
  • Класс Tk предназначен для инициализации только один раз в приложении. Программистам приложений не нужно явно инициализировать его; система создает его всякий раз, когда инициализируется любой из других классов.
  • Класс Widget не предназначен для инициализации, он предназначен только для наследования, чтобы создавать «реальные» виджеты (в C++ это называется «абстрактным классом»).

Для использования данного справочного материала в некоторых случаях вам потребуется знать, как читать короткие фрагменты кода Tk и как определять различные части команды Tk. (См. раздел Сопоставление основных команд Tk в Tkinter для tkinter эквивалентов того, что показано ниже.)

Сценарии Tk — это программы Tcl. Как и все программы Tcl, сценарии Tk представляют собой списки токенов, разделенных пробелами. Виджет Tk — это просто его *класс*, *опции*, которые помогают его настроить, и *действия*, которые заставляют его выполнять полезные действия.

Для создания виджета в Tk команда всегда имеет вид:

classCommand newPathname options
classCommand

указывает, какой вид виджета создать (кнопка, метка, меню и т.д.).

newPathname

это новое имя для этого виджета. Все имена в Tk должны быть уникальными. Чтобы помочь в этом, виджеты в Tk имеют имена с *путями*, как и файлы в файловой системе. Виджет верхнего уровня, *корень*, называется . (точка), а подчинённые виджеты разделяются точками. Например, .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 — это метка (отключение меток в 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()

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

Обратите внимание, что в справочных страницах указаны «ОБЩИЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ ВИДЖЕТА». Первые представляют собой список параметров, общих для многих виджетов, а вторые — параметры, специфичные для данного виджета. Общие параметры документированы на странице man 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 растрового изображения, укажите полный путь к файлу, предваряя его @, как в "yes".

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

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.9/library/tkinter.html

Spec-Zone.ru

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