- Создание графического интерфейса
- Tkinter. Создание окна приложения
- Начальная позиция окна
- tkinter — Python интерфейс для Tcl/Tk¶
- Модули Tkinter¶
- Спасательный круг Tkinter¶
- Как использовать этот раздел¶
- Простая программа Hello World¶
- (Очень) быстрый взгляд на Tcl/Tk¶
- Отображение базового Tk в Tkinter¶
- Как связаны Tk и Tkinter¶
- Удобная ссылка¶
- Опции настройки¶
- Пакер¶
- Опции пакера¶
- Переменные виджета соединения¶
- Диспетчер окон¶
- Типы данных опций Tk¶
- Привязки и события¶
- Параметр индекса¶
- Изображения¶
- Обработчики файлов¶
Создание графического интерфейса
Tkinter. Создание окна приложения
Многие программы на сегодняшний день используют графический интерфейс, который более интуитивен и удобен для пользователя, чем консоль. И с помощью языка программирования Python также можно создавать графические программы. Для этого в Python по умолчанию применяется специальный тулкит — набор компонентов, который называется tkinter .
Тулкит tkinter доступен в виде отдельного встроенного модуля, который содержит все необходимые графические компоненты — кнопки, текстовые поля и т.д.
Базовым моментом в построении графических программ является создание окна. Затем в окно добавляются все остальные компоненты графического интерфейса. Поэтому создадим вначале простейшее окно. Для этого определим следующий скрипт:
Для создания графического окна применяется конструктор Tk() , который определен в модуле tkinter. Создаваемое окно присваивается переменной root, и через эту переменную мы можем управлять атрибутами окна. В частности, с помощью метода title() можно установить заголовок окна.
С помощью метода geometry() — размер окна. Для установки размера в метод geometry() передается строка в формате «Ширина x Высота». Если при создании окна приложения метод geometry() не вызывается, то окно занимает то пространство, которое необходимо для размещения внутреннего содержимого.
Для отображения окна надо вызвать у него метод mainloop() , который запускает цикл обработки событий окна для взаимодействия с пользователем.
В результате при запуске скрипта мы увидим такое пустое окошко:
Начальная позиция окна
По умолчанию окно позиционируется в верхний левый угол экрана. Но мы можем изменить его положение, передав нужные значения в метод geometry() :
Теперь строка в методе geometry имеет следующий формат: «Ширина x Высота + координатаX + координатаY». То есть при запуске окно будет находиться на 300 пикселей вправо и на 250 пикселей вниз от верхнего левого угла экрана.
tkinter — Python интерфейс для Tcl/Tk¶
Пакет tkinter («Tk интерфейс») является стандартным интерфейсом Python для инструментария Tk GUI. И Tk, и tkinter доступны на большинстве платформ Unix, а также в системах Windows. (Сам Tk не является частью Python; он поддерживается в ActiveState.)
Запуск python -m tkinter из командной строки должен открыть окно, демонстрирующее простой интерфейс Tk, сообщающее, что tkinter правильно установлен в системе, а также показывающее, какая версия Tcl/Tk установлена, чтобы можно было прочитать документацию Tcl/Tk, специфичную для этой версии.
Python ресурсы Tkinter Руководство темы Python Tkinter предоставляет большую информацию об использовании Tk от Python и ссылок с другими источниками информации о Tk. TKDocs Обширное учебное пособие и более удобные страницы виджетов для некоторых виджетов. Справочник по Tkinter 8.5: графический интерфейс для Python Он-лайн справочный материал. Tkinter документы от effbot Интерактивная ссылка на tkinter, поддерживаемая effbot.org. Программирование Python Книга марка лутца, имеет отличное освещение ткинтера. Современный Tkinter для занятых разработчиков Python Книга марка роузмана о построении привлекательных и современных графических пользовательских интерфейсов с Python и Tkinter. Программирование на Python и Tkinter Книга Джона Грейсона (ISBN 1-884777-81-3).
Тк команды Большинство команд доступны как классы tkinter или tkinter.ttk . Измените „8.6“ на версию установки Tcl/Tk. Tcl/Tk последние страницы руководства Последние руководства Tcl/Tk по www.tcl.tk. Домашняя страница ActiveState Tcl Разработка Tk/Tcl в основном происходит в ActiveState. Tcl и инструментарий Tk Книга джона оустерхаута, изобретателя Tcl. Практическое программирование на Tcl и Tk Энциклопедическая книга брента уэлча.
Модули Tkinter¶
Большую часть времени, tkinter все, что вам действительно нужно, но ряд дополнительных модулей также доступны. Интерфейс Tk расположен в двоичном модуле с именем _tkinter . Модуль содержит низкоуровневый интерфейс к Tk и не должен использоваться непосредственно программистами приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях она может быть статически связана с Python интерпретатор.
В дополнение к интерфейсному модулю Tk, tkinter включает в себя ряд Python модулей, tkinter.constants являясь одним из наиболее важных. Импорт tkinter будет автоматически импортировать tkinter.constants , поэтому, как правило, для использования Tkinter требуется только простая инструкция импорта:
Класс Tk создается без аргументов. Это создает виджет верхнего уровня Tk, который обычно является главным окном приложения. Каждый сущность имеет свой собственный интерпретатор Tcl.
tkinter. Tcl ( screenName=None, baseName=None, className=’Tk’, useTk=0 ) ¶
Функция Tcl() является функцией фабрикой, которая создает объект, похожий на созданный классом Tk , за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при управлении интерпретатор Tcl в среде, где не нужно создавать посторонние окна верхнего уровня, или где нельзя (например, системы Unix/Linux без сервера X). Объект, созданный Tcl() объектом, может иметь окно Toplevel, созданное (и инициализированную подсистему Tk) путем вызова метода loadtk() .
К другим модулям, обеспечивающим поддержку Tk, относятся:
tkinter.scrolledtext Текстовый графический виджет со встроенной вертикальной полосой прокрутки. tkinter.colorchooser Диалоговое окно, чтобы пользователь мог выбрать цвет. tkinter.commondialog Базовый класс для диалоговых окон, определенных в других перечисленных здесь модулях. tkinter.filedialog Общие диалоговые окна, чтобы пользователь мог указать файл для открытия или сохранения. tkinter.font Утилиты для работы со шрифтами. tkinter.messagebox Доступ к стандартным диалоговым окнам Tk. tkinter.simpledialog Основные диалоговые окна и удобные функции. tkinter.dnd Поддержка перетаскивания для tkinter . Он является экспериментальным и должен стать устаревшим при замене на Tk DND. turtle Черепашья графика в окне Tk.
Спасательный круг Tkinter¶
Этот раздел не является исчерпывающим учебным пособием по Tk или Tkinter. Скорее, он предназначен как стоп-пробел, обеспечивающий некоторую вводную ориентацию на системе.
- Tk был написан Джоном Оустерхаутом (John Ousterhout) во время пребывания в Беркли.
- Tkinter был написан Стином Люмхолтом (Steen Lumholt) и Гидо ван Россумом (Guido van Rossum).
- Этот Спасательный круг был написан Мэттом Конуэем (Matt Conway) в университете Вирджинии.
- Рендеринг HTML и некоторые либеральные изменения были произведены из версии FrameMaker Кеном Манхаймером (Ken Manheimer).
- Фредрик Лундх (Fredrik Lundh) разработал и пересмотрел описания интерфейсов классов, чтобы получить их в актуальном виде с Tk 4.2.
- Майк Кларксон (Mike Clarkson) преобразовал документацию в LaTeX и составил главу «Пользовательский интерфейс» справочного руководства.
Как использовать этот раздел¶
Этот раздел состоит из двух частей: первая половина (грубо) охватывает материал фона, в то время как вторая половина может быть взята за клавиатуру в качестве удобного эталона.
При попытке ответить на вопросы формы «как мне делать бла», часто лучше всего узнать, как делать «бла» в прямом Tk, а затем преобразовать это обратно в соответствующий tkinter звонок. Python программисты часто могут угадать правильную команду Python, просматривая документацию Tk. Это означает, что для того, чтобы использовать Tkinter, вам придется знать немного о Tk. Этот документ не может выполнять эту роль, поэтому лучшее, что мы можем сделать, это указать на лучшую существующую документацию. Вот некоторые намеки:
- Авторы настоятельно предлагают получить копию страниц Tk man. В частности, наиболее полезны мужские страницы в каталоге manN . Страницы man3 man описывают интерфейс C с библиотекой Tk и поэтому не особенно полезны для составителей сценариев.
- Addison-Wesley публикует книгу под названием «Tcl and the Tk Toolkit» Джона Оустерхаута (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичка. Книга не является исчерпывающей, и по многим деталям она откладывает на ман страницы.
- tkinter/__init__.py является последним средством для большинства, но может быть хорошим местом, чтобы пойти, когда больше нет смысла.
Простая программа Hello World¶
(Очень) быстрый взгляд на Tcl/Tk¶
Иерархия классов выглядит сложной, но на практике программисты приложений почти всегда ссылаются на классы в самом низу иерархии.
- Эти классы предоставляются для целей организации определенных функций под одним пространством имен. Они не должны создаваться независимо.
- Класс Tk должен быть создан только один раз в приложении. Программисты приложений не должны создавать один экземпляр явным образом, система создает его всякий раз, когда создается экземпляр любого из других классов.
- Класс Widget не предназначен для создания экземпляров, он предназначен только для подкласса для создания «реальных» виджетов (в C++ это называется «абстрактным классом»).
Чтобы использовать этот справочный материал, необходимо знать, как читать короткие отрывки Tk и как идентифицировать различные части команды Tk. (См. раздел Отображение базового Tk в Tkinter для tkinter эквивалентов того, что ниже.)
Сценарии Tk — это программы Tcl. Как и все программы Tcl, сценарии Tk — это просто списки токенов, разделенных пробелами. Виджет Tk — это только его class, options, которые помогают его настроить, и actions, которые заставляют его делать полезные вещи.
Чтобы создать виджет в Tk, команда всегда имеет форму:
После создания путь к виджету становится новой командой. Этот новый widget command является дескриптором программиста для получения нового виджета для выполнения некоторых action. В C вы выражаете это как someAction (fred, someOptions), в C++ вы выражаете это как fred.someAction (someOptions), а в Tk вы говорите:
Обратите внимание, что имя объекта, .fred , начинается с точки.
Как и следовало ожидать, допустимые значения для someAction будет зависеть от класса виджета: .fred disable работает, если fred является кнопкой (fred становится серым), но не работает, если fred является меткой (отключение меток не поддерживается в Tk).
Допустимые значения someOptions зависит от конкретных действий. Некоторые действия, такие как disable , не требуют аргументов, другие, как команда delete поля ввода текста, должны содержать аргументы для указания диапазона удаляемого текста.
Отображение базового Tk в Tkinter¶
Команды классов в Tk соответствуют конструкторам классов в Tkinter.:
Хозяин объекта является неявным в новом имени, данном ему во время создания. В Tkinter мастера указываются явно.
Опции конфигурации в Tk приведены в списках тегов с переносами, за которыми следуют значения. В Tkinter параметры задаются как ключевые-аргументы в конструкторе сущность и ключевый аргументы для настройки вызовов или как индексы сущность в стиле словаря для установленных сущности. См. раздел Опции настройки о настройке параметров.:
В Tk для выполнения действия над виджетом используйте имя виджета в качестве команды и следуйте за ним с именем действия, возможно, с аргументами (параметрами). В Tkinter методы класса сущность вызываются для вызова действий с виджетом. Действия (методы), которые может выполнять данный виджет, перечислены в tkinter/__init__.py .:
Для предоставления виджета пакеру (менеджеру геометрии) вызывается пакет с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, и различные формы команды pack реализуются как методы. Все виджеты в tkinter являются подклассами от Packer и поэтому наследуют все методы упаковки. Дополнительные сведения о диспетчере геометрии формы см. в документации по модулю tkinter.tix :
Как связаны 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 для рисования графики на экране.
Удобная ссылка¶
Опции настройки¶
Параметры управляют такими параметрами, как цвет и ширина границы виджета. Параметры можно задать тремя способами:
Во время создания объекта с использованием ключевой аргументов:
После создания объекта, рассматривая имя параметра как индекс словаря:
Используйте метод config () для обновления нескольких объектов после создания объекта:
Полное объяснение данной опции и ее поведения см. на страницах Tk man для рассматриваемого виджета.
Обратите внимание, что на справочных страницах перечислены «STANDARD OPTIONS» и «WIDGET SPECIFIC OPTIONS» для каждого виджета. Первый является списком параметров, которые являются общими для многих виджетов, второй является опциями, которые являются идиосинкратичными для этого конкретного виджета. Стандартные параметры задокументированы на странице 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’ |
Конечно, напечатанный словарь будет включать все доступные варианты и их значения. Это подразумевается только в качестве примера.
Пакер¶
Пакер — один из механизмов управления геометрией Tk. Диспетчеры геометрии используются для указания относительного позиционирования виджетов внутри их контейнера — общего для них master. В отличие от более громоздкого placer (который используется реже и мы здесь не рассматриваем), пакер принимает качественные характеристики взаимосвязи: выше, слева от, заполнение и т. д. — и прорабатывает все, чтобы определить точные координаты размещения для вас.
Размер любого виджета master определяется размером «подчиненных виджетов» внутри. Пакер используется для управления местом появления подчиненных виджетов внутри главного, в которое они упакованы. Вы можете упаковать виджеты в фреймы, а фреймы в другие фреймы, чтобы получить желаемый вид макета. Кроме того, компоновка динамически регулируется для внесения дополнительных изменений в конфигурацию после ее упаковки.
Обратите внимание, что виджеты не отображаются до тех пор, пока их геометрия не будет задана менеджером геометрии. Это распространенная ранняя ошибка, чтобы исключить спецификацию геометрии, а затем удивиться, когда виджет создан, но ничего не появляется. Виджет появится только после применения, например, метода pack() упаковщика.
Метод pack() можно вызвать с ключевой-опцией/значение парами, которые управляют отображением виджета в контейнере и его поведением при изменении размера главного окна приложения. Вот несколько примеров:
Опции пакера¶
Для получения более подробной информации о упаковщике и опциях, которые он может использовать, см. справочные страницы и страницу 183 книги Джона Оустерхаута (John Ousterhout’s).
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 .
Уже определено много полезных подклассы переменной: StringVar , IntVar , DoubleVar и BooleanVar . Для считывания текущего значение такой переменной вызовите на ней метод get() , а для изменения его значение вызовите метод set() . Если вы следуете этому протоколу, виджет всегда будет отслеживать значение переменной, без дальнейшего вмешательства с вашей стороны.
Диспетчер окон¶
В Tk имеется служебная команда wm для взаимодействия с оконным менеджером. Параметры команды wm позволяют управлять такими элементами, как заголовки, размещение, растровые изображения значков и т.п. В tkinter эти команды были реализованы как методы в классе Wm . Виджеты Toplevel относятся к подклассу класса Wm и поэтому могут вызывать методы Wm напрямую.
Чтобы попасть в окно верхнего уровня, содержащее данный виджет, часто можно просто обратиться к хозяину виджета. Конечно, если виджет был упакован внутри фрейм, мастер не будет представлять окно верхнего уровня. Чтобы открыть окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод _root() . Этот метод начинается с подчеркивания для обозначения того факта, что эта функция является частью реализации, а не интерфейсом функциональности Tk.
Вот несколько примеров типичного использования:
Типы данных опций Tk¶
Любая Python функция, которая не принимает аргументов. Например:
Привязки и события¶
Метод bind из команды виджета позволяет отслеживать определенные события и иметь триггер функции колбэка при возникновении этого типа событий. Форма метода привязывания
sequence представляет собой строку, которая обозначает целевой вид события. (Для получения более подробной информации см. страницу bind man и страницу 201 книги John Ousterhout). func функция Python, принимающая один аргумент и вызываемая при возникновении события. В качестве аргумента будет передан сущность события. (Функции, развернутые таким образом, обычно известны как callbacks.) add является необязательным, либо » , либо ‘+’ . Передача пустого строка означает, что этот биндинг должен заменить любые другие привязки, с которыми связано это событие. Передача ‘+’ означает, что эта функция должна быть добавлена в список функций, связанных с данным типом события.
Обратите внимание на доступ к полю виджета события в turn_red() колбэк. Это поле содержит виджет, уловивший событие X. В следующей таблице перечислены другие поля событий, к которым можно получить доступ, и то, как они обозначаются в Tk, что может быть полезно при обращении к страницам Tk man.
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». Они используемый указывать на определенное место в виджете «Текст», на определенные символы в виджете «Ввод» или на определенные пункты меню в виджете «Меню».
Индексы виджетов ввода (индекс, индекс вида и т.д.) Виджеты ввода имеют параметры, относящиеся к символ позициям в отображаемом тексте. Для доступа к этим специальным точкам в текстовых виджетах можно использовать следующие функции tkinter : Индексы текстовых виджетов Представление индекса для текстовых виджетов очень богато и лучше всего описано на страницах Tk man. Индексы меню (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, когда I/O возможно файловый дескриптор. На обработчик файла может быть зарегистрирован только один дескриптор. Пример код:
Эта функция недоступна в Windows.
Так как Вы не знаете, сколько байтов доступно для чтения, Вам не нужно использовать BufferedIOBase или TextIOBase read() или методы readline() , так как они настаивают на том, чтобы читать предопределенное число байтов. Для сокеты recv() или recvfrom() методы будут работать нормально; для других файлов используйте необработанные чтения или os.read(file.fileno(), maxbytecount) .
Widget.tk. createfilehandler ( file, mask, func ) ¶
Регистрирация функцию файлового обработчика колбэка func. Аргументом file может быть либо объектом с методом fileno() (например, файл или объект сокета), либо целочисленный дескриптор файла. Аргумент mask представляет собой комбинацию ИЛИ любой из трех приведенных ниже констант. Колбэк вызывается следующим образом:
Отменяет регистрацию файлового обработчика.
tkinter. READABLE ¶ tkinter. WRITABLE ¶ tkinter. EXCEPTION ¶
Константы, используемые в аргументах mask.