tkinter — Интерфейс Python для Tcl/Tk

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


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

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

Tkinter поддерживает ряд версий Tcl/Tk, созданных как с поддержкой потоков, так и без нее. Официальный двоичный релиз Python включает в себя Tcl/Tk 8.6 с потоками. Смотрите исходный код модуля _tkinter для получения дополнительной информации о поддерживаемых версиях.

Tkinter не является тонкой оболочкой, но добавляет изрядное количество собственной логики, чтобы сделать работу более понятной на языке python. В этой документации основное внимание будет уделено этим дополнениям и изменениям, а для получения подробной информации, которая не изменилась, обратитесь к официальной документации по Tcl/Tk.

Примечание

В Tcl/Tk 8.5 (2007) представлен современный набор тематических компонентов пользовательского интерфейса, а также новый API для их использования. По-прежнему доступны как старые, так и новые API. Большая часть документации, которую вы найдете в Интернете, по-прежнему использует старый API и может быть крайне устаревшей.

См.также

  • TkDocs

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

  • Tkinter 8.5 reference: a GUI for Python

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

Ресурсы Tcl/Tk:

  • Tk commands

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

  • Tcl/Tk Home Page

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

Книги:

Архитектура

Tcl/Tk не является единой библиотекой, а скорее состоит из нескольких отдельных модулей, каждый из которых обладает отдельной функциональностью и собственной официальной документацией. Бинарные версии Python также содержат дополнительный модуль.

Tcl (англ.)

Tcl - это динамический интерпретируемый язык программирования, такой же, как Python. Хотя он может использоваться сам по себе как язык программирования общего назначения, чаще всего он встраивается в приложения на C в качестве скриптового движка или интерфейса к инструментарию Tk toolkit. Библиотека Tcl имеет интерфейс C для создания и управления одним или несколькими экземплярами интерпретатора Tcl, запуска команд и сценариев Tcl в этих экземплярах и добавления пользовательских команд, реализованных либо на Tcl, либо на C. У каждого интерпретатора есть очередь событий, и есть средства для отправки в нее событий и их обработки. В отличие от Python, модель выполнения Tcl основана на совместной многозадачности, и Tkinter устраняет это различие (подробнее см. Threading model).

Tk

Tk - это Tcl package, реализованный на C, который добавляет пользовательские команды для создания виджетов GUI и управления ими. Каждый объект Tk содержит свой собственный экземпляр интерпретатора Tcl с загруженным в него Tk. Виджеты Tk легко настраиваются, хотя и имеют устаревший внешний вид. Tk использует очередь событий Tcl для создания и обработки событий в графическом интерфейсе.

Ттк

Тематические Tk (Ttk) - это новое семейство виджетов Tk, которые обеспечивают гораздо лучший внешний вид на различных платформах, чем многие классические Tk-виджеты. Ttk распространяется как часть Tk, начиная с версии Tk 8.5. Привязки к Python предоставляются в отдельном модуле, tkinter.ttk.

Внутри Tk и Ttk используют возможности базовой операционной системы, т.е. Lib в Unix/X11, Cocoa в macOS, GDI в Windows.

Когда ваше приложение на Python использует класс в Tkinter, например, для создания виджета, модуль tkinter сначала собирает командную строку Tcl/Tk. Он передает эту командную строку Tcl во внутренний двоичный модуль _tkinter, который затем вызывает интерпретатор Tcl для ее оценки. Затем интерпретатор Tcl обратится к пакетам Tk и/или Ttk, которые, в свою очередь, будут обращаться к Xlib, Cocoa или GDI.

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

Название экрана

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

Базовое имя

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

Название класса

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

Использовать

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

синхронизация

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

использование

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

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

children

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

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

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

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

tkinter

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

tkinter.colorchooser

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

tkinter.commondialog

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

tkinter.filedialog

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

tkinter.font

Утилиты, помогающие работать со шрифтами.

tkinter.messagebox

Доступ к стандартным диалоговым окнам технического задания.

tkinter.scrolledtext

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

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. Для этого обратитесь к одному из внешних ресурсов, упомянутых ранее. Вместо этого в этом разделе дается очень краткое представление о том, как выглядит приложение Tkinter, определяются базовые концепции Tk и объясняется структура оболочки Tkinter.

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

Программа «Привет, Мир»

Мы начнем с описания приложения «Hello World» в Tkinter. Это не самое маленькое приложение, которое мы могли бы написать, но его достаточно, чтобы проиллюстрировать некоторые ключевые понятия, которые вам необходимо знать.

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()

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

В следующей строке создается виджет frame, который в данном случае будет содержать надпись и кнопку, которые мы создадим далее. Рамка помещается внутри корневого окна.

В следующей строке создается виджет label, содержащий статическую текстовую строку. Метод grid() используется для указания относительного расположения (позиции) метки внутри содержащего ее виджета frame, аналогично тому, как работают таблицы в HTML.

Затем создается виджет кнопки, который размещается справа от надписи. При нажатии на него вызывается метод destroy() корневого окна.

Наконец, метод mainloop() выводит все данные на дисплей и реагирует на ввод данных пользователем до тех пор, пока программа не завершит работу.

Важные концепции в области Тз

Даже эта простая программа иллюстрирует следующие ключевые концепции Тз:

виджеты

Пользовательский интерфейс Tkinter состоит из отдельных виджетов. Каждый виджет представлен в виде объекта Python, созданного из таких классов, как ttk.Frame, ttk.Label, и ttk.Button.

иерархия виджетов

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

параметры конфигурации

У виджетов есть параметры конфигурации, которые изменяют их внешний вид и поведение, например, текст, отображаемый в метке или кнопке. Разные классы виджетов будут иметь разные наборы параметров.

управление геометрией

Виджеты не добавляются автоматически в пользовательский интерфейс при их создании. A geometry manager, как и grid, определяет, в каком месте пользовательского интерфейса они расположены.

цикл обработки событий

Tkinter реагирует на вводимые пользователем данные, изменения в вашей программе и даже обновляет отображение только при активном запуске цикла обработки событий. Если в вашей программе цикл обработки событий не запущен, ваш пользовательский интерфейс обновляться не будет.

Понимание того, как Tkinter обертывает Tcl/Tk

Когда ваше приложение использует классы и методы Tkinter, внутренне Tkinter собирает строки, представляющие команды Tcl/Tk, и выполняет эти команды в интерпретаторе Tcl, подключенном к экземпляру вашего приложения Tk.

Независимо от того, пытаетесь ли вы ориентироваться в справочной документации, найти правильный метод или опцию, адаптировать какой-либо существующий код или отладить свое приложение Tkinter, иногда бывает полезно понять, как выглядят базовые команды Tcl/Tk.

Чтобы проиллюстрировать, вот эквивалент Tcl/Tk основной части скрипта Tkinter, приведенный выше.

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0

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

  • Команды, используемые для создания виджетов (например, ttk::frame), соответствуют классам виджетов в Tkinter.

  • Параметры виджета Tcl (например, -text) соответствуют аргументам ключевого слова в Tkinter.

  • Для ссылок на виджеты в Tcl используется путь (например, .frm.btn), в то время как Tkinter использует не имена, а ссылки на объекты.

  • Место виджета в иерархии виджетов определяется его (иерархическим) именем пути, в котором в качестве разделителя путей используется . (точка). Имя пути для корневого окна - это просто . (точка). В Tkinter иерархия определяется не именем пути, а указанием родительского виджета при создании каждого дочернего виджета.

  • Операции, которые реализованы в виде отдельных команд в Tcl (например, grid или destroy), представлены в виде методов в объектах виджета Tkinter. Как вы вскоре увидите, в других случаях Tcl использует то, что выглядит как вызовы методов для объектов widget, что более точно отражает то, что используется в Tkinter.

Как мне…? Какой параметр позволяет…?

Если вы не уверены, как что-то сделать в Tkinter, и не можете сразу найти это в руководстве или справочной документации, которую используете, есть несколько стратегий, которые могут оказаться полезными.

Во-первых, помните, что детали работы отдельных виджетов могут отличаться в разных версиях Tkinter и Tcl/Tk. Если вы ищете документацию, убедитесь, что она соответствует версиям Python и Tcl/Tk, установленным в вашей системе.

При поиске того, как использовать API, полезно знать точное название класса, опции или метода, которые вы используете. Самоанализ, будь то в интерактивной оболочке Python или с помощью print(), может помочь вам определить, что вам нужно.

Чтобы узнать, какие параметры конфигурации доступны для любого виджета, вызовите его метод configure(), который возвращает словарь, содержащий разнообразную информацию о каждом объекте, включая его значения по умолчанию и текущие значения. Используйте keys(), чтобы получить только названия каждого параметра.

btn = ttk.Button(frm, ...)
print(btn.configure().keys())

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

print(set(btn.configure().keys()) - set(frm.configure().keys()))

Аналогично, вы можете найти доступные методы для объекта widget, используя стандартную функцию dir(). Если вы попробуете ее, то увидите, что существует более 200 распространенных методов widget, поэтому, опять же, полезно определить те, которые относятся к классу widget.

print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))

Модель нарезания резьбы

Python и Tcl/Tk имеют очень разные модели потоковой передачи, которые tkinter пытаются объединить. Если вы используете потоки, вам, возможно, следует знать об этом.

С интерпретатором Python может быть связано много потоков. В Tcl можно создать несколько потоков, но с каждым потоком связан отдельный экземпляр интерпретатора Tcl. Потоки также могут создавать более одного экземпляра интерпретатора, хотя каждый экземпляр интерпретатора может использоваться только тем потоком, который его создал.

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

Приложения Tcl/Tk обычно управляются событиями, что означает, что после инициализации интерпретатор запускает цикл обработки событий (т.е. Tk.mainloop()) и реагирует на события. Поскольку он однопоточный, обработчики событий должны реагировать быстро, иначе они заблокируют обработку других событий. Чтобы избежать этого, любые длительные вычисления не должны выполняться в обработчике событий, а должны быть либо разбиты на более мелкие части с помощью таймеров, либо выполняться в другом потоке. Это отличается от многих наборов инструментов с графическим интерфейсом, где графический интерфейс выполняется в полностью отдельном потоке от всего кода приложения, включая обработчики событий.

Если интерпретатор Tcl не запускает цикл обработки событий и не обрабатывает события, любые вызовы tkinter, выполненные из потоков, отличных от того, в котором запущен интерпретатор Tcl, завершатся ошибкой.

Существует ряд особых случаев:

  • Библиотеки Tcl/Tk могут быть созданы таким образом, чтобы они не зависели от потоков. В этом случае tkinter вызывает библиотеку из исходного потока Python, даже если он отличается от потока, создавшего интерпретатор Tcl. Глобальная блокировка гарантирует, что одновременно выполняется только один вызов.

  • В то время как tkinter позволяет вам создавать более одного экземпляра объекта Tk (с его собственным интерпретатором), все интерпретаторы, которые являются частью одного потока, используют общую очередь событий, которая быстро портится. На практике не создавайте более одного экземпляра Tk одновременно. В противном случае лучше всего создавать их в отдельных потоках и убедиться, что вы выполняете потоковую сборку Tcl/Tk.

  • Блокирующие обработчики событий - не единственный способ предотвратить повторный вход интерпретатора Tcl в цикл обработки событий. Возможно даже запустить несколько вложенных циклов обработки событий или полностью отказаться от цикла обработки событий. Если вы делаете что-то сложное, когда дело доходит до событий или потоков, помните об этих возможностях.

  • Существует несколько функций select tkinter, которые в настоящее время работают только при вызове из потока, создавшего интерпретатор Tcl.

Удобный справочник

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

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

Во время создания объекта, используя аргументы ключевых слов
fred = Button(self, fg="red", bg="blue")
После создания объекта обработайте имя параметра как индекс словаря
fred["fg"] = "red"
fred["bg"] = "blue"
Используйте метод config() для обновления нескольких атрибутов после создания объекта
fred.config(fg="red", bg="blue")

Для получения полного объяснения данной опции и ее поведения смотрите справочные страницы технического задания для данного виджета.

Обратите внимание, что на страницах руководства перечислены «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «ПАРАМЕТРЫ, СПЕЦИФИЧНЫЕ для виджета» для каждого виджета. Первый - это список параметров, которые являются общими для многих виджетов, а второй - это параметры, характерные для данного конкретного виджета. Стандартные параметры описаны на странице руководства options(3).

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

Параметры, поддерживаемые данным виджетом, перечислены на справочной странице этого виджета или могут быть запрошены во время выполнения путем вызова метода config() без аргументов или путем вызова метода keys() для этого виджета. Возвращаемое значение этих вызовов - это словарь, ключом которого является имя параметра в виде строки (например, 'relief'), а значениями - 5-кортежи.

Некоторые параметры, такие как bg, являются синонимами распространенных параметров с длинными названиями (bg - это сокращение от «фон»). При передаче методу 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. Менеджеры геометрии используются для определения взаимного расположения виджетов в их контейнере - их общего «главного» элемента. В отличие от более громоздкого placer (который используется реже, и мы его здесь не рассматриваем), упаковщик использует качественные характеристики соотношения - вверху, * слева от , *заполнение и т.д. - и обрабатывает все, чтобы определить точные координаты размещения для вас.

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

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

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

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

Варианты упаковщика

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

якорь

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

расширять

Логическое значение, 0 или 1.

заполнять

Правовые ценности: 'x', 'y', 'both', 'none'.

ipadx и ipady

Внутренняя прокладка, обозначающая расстояние, на каждой стороне подчиненного виджета.

padx и pady

Внешнее дополнение, обозначающее расстояние, на каждой стороне подчиненного виджета.

сторона

Правовые ценности - это: 'left', 'right', 'top', 'bottom'.

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

Настройки текущего значения некоторых виджетов (например, виджетов для ввода текста) могут быть напрямую связаны с переменными приложения с помощью специальных опций. Этими параметрами являются variable, textvariable, onvalue, offvalue, и value. Это соединение работает в обоих направлениях: если переменная изменится по какой-либо причине, виджет, к которому она подключена, будет обновлен, чтобы отразить новое значение.

К сожалению, в текущей реализации tkinter невозможно передать произвольную переменную Python в виджет с помощью опции variable или textvariable. Единственные типы переменных, для которых это работает, - это переменные, которые являются подклассами из класса с именем Variable, определенного в tkinter.

Существует множество полезных подклассов переменных, которые уже определены: 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. Виджеты верхнего уровня являются подклассами класса Wm и поэтому могут напрямую вызывать методы Wm.

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

якорь

Правовые ценности - это точки отсчета: "n", "ne", "e", "se", "s", "sw", "w", "nw", а также "center".

растровое изображение

Существует восемь встроенных именованных растровых изображений: 'error', 'gray25', 'gray50', 'hourglass', 'info', 'questhead', 'question', 'warning'. Чтобы указать имя файла растрового изображения X, укажите полный путь к файлу, перед которым укажите @, как в "@/usr/contrib/bitmap/gumby.bit".

логический

Вы можете передавать целые числа 0 или 1 или строки "yes" или "no".

обратный звонок

Это любая функция Python, которая не принимает аргументов. Например:

def print_it():
    print("hi there")
fred["command"] = print_it
цвет

Цвета могут быть заданы в виде названий X цветов в файле rgb.txt или в виде строк, представляющих значения RGB в 4-битном формате: "#RGB", 8 бит: "#RRGGBB", 12 бит: "#RRRGGGBBB" или 16-битном формате: "#RRRRGGGGBBBB" диапазоны, где R,G,B здесь обозначают любую допустимую шестнадцатеричную цифру. Подробности смотрите на странице 160 книги Остерхаута.

указатель

Можно использовать стандартные имена курсоров X, начиная с cursorfont.h, без префикса XC_. Например, чтобы получить ручной курсор (XC_hand2), используйте строку "hand2". Вы также можете указать свой собственный файл растрового изображения и маски. Смотрите страницу 179 книги Остерхаута.

расстояние

Расстояния между экранами могут быть указаны как в пикселях, так и в абсолютных значениях. Пиксели задаются в виде чисел, а абсолютные расстояния - в виде строк, причем завершающий символ обозначает единицы измерения: c для сантиметров, i для дюймов, m для миллиметров, p для точек печати. Например, 3,5 дюйма выражаются как "3.5i".

шрифт

В Tk используется формат названия шрифта в виде списка, например {courier 10 bold}. Размеры шрифта с положительными числами измеряются в пунктах; размеры шрифта с отрицательными числами измеряются в пикселях.

геометрия

Это строка вида widthxheight, где ширина и высота измеряются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например: fred["geometry"] = "200x100".

оправдывать

Допустимыми значениями являются строки: "left", "center", "right", и "fill".

регион

Это строка с четырьмя элементами, разделенными пробелами, каждый из которых является допустимым расстоянием (см. выше). Например: "2 3 4 5" и "3i 2i 4.5i 2i" и "3c 2c 4c 10.43c" являются допустимыми областями.

облегчение

Определяет, каким будет стиль границы виджета. Допустимыми значениями являются: "raised", "sunken", "flat", "groove", и "ridge".

команда прокрутки

Это почти всегда метод set() какого-либо виджета с полосой прокрутки, но это может быть любой метод виджета, который принимает один аргумент.

заворачивать

Должно быть одним из: "none", "char", или "word".

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

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

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

где:

последовательность

это строка, обозначающая целевой тип события. (Подробнее смотрите справочную страницу bind(3tk) и страницу 201 книги Джона Остерхаута, Tcl and the Tk Toolkit (2nd edition)).

функция

это функция Python, принимающая один аргумент и вызываемая при возникновении события. В качестве аргумента будет передан экземпляр события. (Функции, развернутые таким образом, обычно называются обратными вызовами.)

добавлять

является необязательным, либо '', либо '+'. Передача пустой строки означает, что эта привязка должна заменить любые другие привязки, с которыми связано это событие. Передача '+' означает, что эта функция должна быть добавлена в список функций, привязанных к данному типу событий.

Например:

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

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

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

Tk

Поле события Tkinter

Tk

Поле события Tkinter

%f

сосредоточить

обуглить

высота

%E

отправить событие

ключевой код

ключевой символ

%s

государство

ключевой символ_num

%t

время

%T

тип

%вт

ширина

%Вт

виджет

x

x_root (корень)

y

y_root - корень

Параметр index (индекс)

Для ряда виджетов требуется передача параметров «индекс». Они используются для указания на определенное место в текстовом виджете, или на определенные символы в виджете ввода, или на определенные пункты меню в виджете меню.

Индексы виджета ввода (index, view index и т.д.)

В виджетах ввода есть опции, которые относятся к позициям символов в отображаемом тексте. Вы можете использовать эти функции tkinter для доступа к этим специальным точкам в текстовых виджетах.:

Индексы текстового виджета

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

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

См.также

Пакет Pillow добавляет поддержку таких форматов, как BMP, JPEG, TIFF и WebP, среди прочих.

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

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

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.

Вернуться на верх