Как сделать список в python tkinter

Добавил пользователь Валентин П.
Обновлено: 10.09.2024

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

Python ресурсы Tkinter Руководство по Python Tkinter предоставляет большой объем информации об использовании Tk из Python и ссылки на другие источники информации о Tk. TK Docs Обширное руководство и более удобные страницы для некоторых виджетов. Справочник по Tkinter 8.5: графический интерфейс для Python Он-лайн справочный материал. Tkinter документы от eff bota Онлайн-справочник по tkinter. Программирование Python Книга Марка Лутца отлично освещает tkinter. Современный Tkinter для занятых разработчиков Python Книга Марка Роземана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter. Программирование на Python и Tkinter Книга Джона Грейсона (ISBN 1-884777-81-3).

Документация по 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() , может создано окно верхнего уровня (и инициализирована подсистема Tk) путём вызова его метода loadtk() .

Другие модули, обеспечивающие поддержку Tk, включают:

Спасательный круг Tkinter¶

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

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

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

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

(Очень) Быстрый взгляд на Tcl/Tk¶

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

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

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

Чтобы сделать виджет в Tk, у команды есть всегда следующий вид:

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

Чтобы передать виджет упаковщику (менеджеру геометрии), вы вызываете pack с необязательными аргументами. В Tkinter класс Pack содержит всю функциональность, а различные формы команды pack реализованы как методы. Все виджеты в tkinter являются производными от Packer, поэтому наследуют все методы упаковки. Дополнительную информацию о менеджере геометрии форм см. в документации модуля tkinter.tix .

Как связаны Tk и Tkinter¶

Ваше приложение здесь (Python) Приложение Python выполняет вызов tkinter . tkinter (пакет Python) Этот вызов (например, создание виджета-кнопки) реализован в пакете tkinter , написанный на Python. Python функция проанализирует команды и аргументы и преобразует их в файл формы, которая заставляет их выглядеть так, как если бы они были взяты из сценария Tk, а не скрипта Python. _tkinter (С) Эти команды и их аргументы будут переданы функции C в _tkinter — обратите внимание на подчеркивание — это модуль расширения. Виджеты Tk (C и Tcl) Эта функция C может вызывать другие модули C, включая C функции, составляющие библиотеку Tk. Tk реализован в C и некоторых Tcl. Часть Tcl виджетов Tk используется для привязки к определенному поведению по умолчанию виджеты и выполняется один раз в точке, где Python tkinter пакет был импортирован. (Пользователь никогда не видит этот этап). Tk (C) Часть Tk виджетов Tk реализует окончательное отображение в … Xlib (C) библиотека Xlib для рисования графики на экране.

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

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

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

Во время создания объекта с использованием ключевых аргументов

Полное объяснение данной опции и её поведения см. на страницах руководства Tk для рассматриваемого виджета.

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

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

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

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

Упаковщик¶

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

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

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

Опции упаковщика¶

Для получения более подробной информации о упаковщике и возможных вариантах см. man страницы и страницу 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 .

Уже определено множество полезных подклассов переменной: StringVar , IntVar , DoubleVar и BooleanVar . Чтобы прочитать текущее значение такой переменной, вызвать для неё метод get() , а для изменения её значения вызвать метод set() . Если вы будете следовать этому протоколу, виджет всегда будет отслеживать значение переменной без вашего дальнейшего вмешательства.

Оконный менеджер¶

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

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

Вот несколько примеров типичного использования:

Типы данных Tk Option¶

anchor Допустимые значения — точки компаса: "n" , "ne" , "e" , "se" , "s" , "sw" , "w" , "nw" , а также "center" . bitmap Имеется восемь встроенных именованных растровых изображений: 'error' , 'gray25' , 'gray50' , 'hourglass' , 'info' , 'questhead' , 'question' , 'warning' . Чтобы указать имя файла растрового изображения X, укажите полный путь к файлу начиная с @ , как в "@/usr/contrib/bitmap/gumby.bit" . boolean Вы можете передавать целые числа 0 или 1 или строки "yes" или "no" . callback

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

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

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

sequence строка, обозначающая целевой тип события. (См. страницу руководства по связыванию и стр. 201 книги Джона Остерхаута для деталей). func функция Python, которая принимает один аргумент и вызывается при возникновении события. Экземпляр события будет передан в качестве аргумента. (Функции, развернутые таким образом обычно известны как обратные вызовы.) add не является обязательным, либо '' , либо '+' . Означает, что передаётся пустая строка эта привязка предназначена для замены любых других привязок, связанных с этим событием. Передача '+' означает, что функция должна добавляться в список функций, связанных с данным типом события.

Обратите внимание, как осуществляется доступ к полю виджета события в обратном вызове turn_red() . Данное поле содержит виджет, который перехватил событие X. В следующей таблице перечислены другие поля событий, к которым вы можете получить доступ, и их обозначение в Tk, что может быть полезно при обращении к man страницам 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¶

Индексы виджетов Entry (индекс, индекс просмотра и т. д.) У виджетов Entry есть параметры, которые относятся к позициям символов в тексте отображается. Вы можете использовать функции tkinter для доступа к этим специальным точкам в текстовых виджетах: Индексы Text виджетов Обозначение индекса для Text виджетов очень богато и лучше всего описано в man Tk страницах. Индексы Menu (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, когда для файлового дескриптора возможен ввод-вывод. На файловый дескриптор может зарегистрироваться только один обработчик. Пример кода:

Эта функция недоступна в Windows.

Поскольку вы не знаете, сколько байтов доступно для чтения, вы можете не захотеть использовать методы BufferedIOBase или TextIOBase , read() или readline() , поскольку они будут настаивать на чтении заранее определенного количества байтов. Для сокетов подойдут методы recv() или recvfrom() ; для других файлов использовать необработанное чтение или os.read(file.fileno(), maxbytecount) .

Widget.tk. createfilehandler ( file, mask, func ) ¶

Регистрирует функцию обратного вызова обработчика файлов func. Аргумент file может быть либо объектом с методом fileno() (например, файлом или объектом сокета), либо целочисленным файловым дескриптором. Аргумент mask представляет собой комбинацию по ИЛИ любой из трёх констант ниже. Обратный вызов вызывается следующим образом:

image

Tkinter – это кроссплатформенная библиотека для разработки графического интерфейса на языке Python (начиная с Python 3.0 переименована в tkinter). Tkinter расшифровывается как Tk interface, и является интерфейсом к Tcl/Tk.
Tkinter входит в стандартный дистрибутив Python.

Весь код в этой статье написан для Python 2.x.
Чтобы убедиться, что Tkinter установлен и работает, воспользуемся стандартной функцией Tkinter _test():


После выполнения данного кода должно появиться следующее окно:


Отлично, теперь можно приступать к написанию нескольких простых программ для демонстрации основных принципов Tkinter.

Hello world

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


Да-да, всего одна строка, это вам не WinAPI (=. Теперь создадим кнопку, при нажатии на которую будет выводиться текст в консоль:


Всё просто, не так ли? Создаём экземпляр класса Button, указываем родителя и при желании список параметров. Есть еще немало параметров, таких как шрифт, толщина рамки и т.д.
Затем привязываем к нажатию на кнопку событие (можно привязать несколько разных событий в зависимости, например, от того, какой кнопкой мыши был нажат наш btn.
mainloop() запускает цикл обработки событий; пока мы не вызовем эту функцию, наше окно не будет реагировать на внешние раздражители.

Упаковщики

Функция pack() — это так называемый упаковщик, или менеджер расположения. Он отвечает за то, как виджеты будут располагаться на главном окне. Для каждого виджета нужно вызвать метод упаковщика, иначе он не будет отображён. Всего упаковщиков три:

pack(). Автоматически размещает виджеты в родительском окне. Имеет параметры side, fill, expand. Пример:



grid(). Размещает виджеты на сетке. Основные параметры: row/column – строка/столбец в сетке, rowspan/columnspan – сколько строк/столбцов занимает виджет. Пример:



place(). Позволяет размещать виджеты в указанных координатах с указанными размерами.
Основные параметры: x, y, width, height. Пример:



Теперь для демонстрации других возможностей Tkinter, напишем простейший

Текстовый редактор

Без лишних слов приведу код:


Здесь есть несколько новых моментов.

Во-первых, мы подключили модуль tkFileDialog для диалогов открытия/закрытия файла. Использовать их просто: нужно создать объект типа Open или SaveAs, при желании задав параметр filetypes, и вызвать его метод show(). Метод вернёт строку с именем файла или пустую строку, если пользователь просто закрыл диалог.

Во-вторых, мы создали два фрейма. Фрейм предназначен для группировки других виджетов. Один содержит управляющие кнопки, а другой — поле для ввода текста и полосу прокрутки.
Это сделано, чтобы textbox не налезал на кнопки и всегда был максимального размера.

В-третьих, появился виджет Text. Мы его создали с параметром wrap='word', чтобы текст переносился по словам. Основные методы Text: get, insert, delete. Get и delete принимают начальный и конечный индексы. Индекс — это строка вида 'x.y', где x — номер символа в строке, а y — номер строки, причём символы нумеруются с 1, а строки — с 0. То есть на самое начала текста указывает индекс '1.0'. Для обозначения конца текста есть индекс 'end'. Также допустимы конструкции вида '1.end'.

B в-четвёртых, мы создали полосу прокрутки (Scrollbar). После создания её нужно связать с нужным виджетом, в данном случае, с textbox. Связывание двустороннее:

Вот и всё. Tkinter – это, безусловно, мощная и удобная библиотека. Мы осветили не все её возможности, остальные — тема дальнейших статей.

Существует множество пакетов для создания графических интерфейсов пользователя в Python, но есть только один такой пакет, который считается стандартом де-факто и распространяется со всеми установками Python по умолчанию. Этот пакет называется Tkinter, это привязка Python к Tk – кроссплатформенному набору графических интерфейсов с открытым исходным кодом.

Создание первого окна

Как упоминалось ранее, Tkinter доступен со стандартными установками Python, поэтому независимо от вашей операционной системы создание вашего первого окна должно быть очень быстрым. Все, что вам нужно, это 3 строки кода:

Создание первого окна

После импорта пакета tkinter в строке 1, в строке 3 мы создаем виджет главного (корневого) окна приложения. Чтобы программа работала должным образом, в нашем интерфейсе должен быть только один виджет корневого окна, и, поскольку все остальные виджеты будут ниже в иерархии, чем корневые, он должен быть создан перед любыми другими виджетами.

В строке 5 мы инициализируем главный цикл корня. Благодаря этой строке окно остается в цикле, который ожидает событий (например, взаимодействия с пользователем) и соответствующим образом обновляет интерфейс. Цикл заканчивается, когда пользователь закрывает окно или вызывается метод quit().

Добавление простых виджетов в корневое окно

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

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

Мы создаем экземпляр класса Label в строке 5 приведенного выше кода. В первом аргументе мы указываем на желаемый родительский виджет метки, которым в этом примере является наше корневое окно. Во втором аргументе мы указываем текст, который должна отображать метка.

Затем в строке 7 мы применяем метод ориентации нашей метки внутри корневого окна. Самый простой метод ориентирования виджетов, который предлагает Tkinter, – это pack(). Метка – единственный виджет внутри окна, поэтому он просто отображается в середине окна.

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

Добавление функциональной кнопки

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

В строке 8 мы создаем экземпляр класса Button аналогично тому, как мы создавали метку. Однако, как вы, вероятно, видите, мы добавили аргумент команды, в котором мы сообщаем программе, что должно произойти после нажатия кнопки. В этом случае вызывается метод destroy() root, который закрывает наше окно при выполнении.

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

Вы, наверное, заметили еще одну новую строчку. В строке 5 мы указываем заголовок корневого окна. К сожалению, самый широкий виджет нашего интерфейса недостаточно широк, чтобы заголовок окна стал видимым.

Управление размером окна

Давайте взглянем на три новые строки, которые позволят нам легко изменять размер нашего окна.

Разработка графического интерфейса с помощью Tkinter в Python

Однако в этом примере мы используем методы root minsize и maxsize для управления максимальными и минимальными значениями ширины и высоты нашего окна. Здесь мы точно определяем, насколько широким и высоким должно быть окно, но я рекомендую вам поиграть с этими тремя строками, чтобы увидеть, как изменение размера работает в зависимости от размера наших виджетов и от того, какие минимальные и максимальные значения мы определяем.

Подробнее об ориентации виджета

Как вы, наверное, уже заметили, использование метода pack() не дает нам слишком много контроля над тем, где находятся виджеты после их упаковки в родительские контейнеры. Нельзя сказать, что метод pack() непредсказуем – просто очевидно, что иногда размещение виджетов в окне в одном столбце, где один виджет помещается поверх предыдущего, не обязательно согласуется с нашим изощренным чувством эстетики. . В этих случаях мы можем либо использовать pack() с некоторыми умными аргументами, либо использовать grid() – еще один метод ориентации виджетов внутри контейнеров.

Изменив строки 15 и 16 из предыдущего примера, мы можем немного улучшить наш интерфейс:

Ориентация виджета

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

Упаковка виджетов

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

Чтобы сделать этот пример более понятным, мы избавились от строк, которые меняли заголовок и размер корневого окна. В строках 6 и 8 мы добавили еще одну метку и еще одну кнопку (обратите внимание, что щелчок по ней ничего не сделает, поскольку мы не добавили к ней никаких команд).

Однако, что наиболее важно, во всех случаях pack() был заменен на grid(). Как вы, вероятно, легко догадываетесь, столбец и строка аргументов позволяют нам определить, какую ячейку сетки будет занимать наш виджет. Имейте в виду, что если вы определяете одинаковые координаты для двух разных виджетов, тот, который отображается далее в вашем коде, будет отображаться поверх другого.

Привязанный аргумент, вероятно, не так очевиден. Используя эту опцию, мы можем прикрепить края наших виджетов к краям их соответствующих ячеек сетки – северного (вверху), южного (внизу), восточного (справа) и западного (слева). Мы делаем это, передавая простую строку, содержащую конфигурацию букв n, s, e и w.

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

Теперь, когда вы знаете два разных метода ориентации виджетов, имейте в виду, что никогда не следует смешивать grid() и pack() внутри одного контейнера.

Frames

Windows – не единственные виджеты, которые могут содержать другие виджеты. Чтобы сделать ваши сложные интерфейсы более понятными, обычно рекомендуется разделять виджеты на фреймы.

Давайте попробуем сделать это с помощью наших четырех простых виджетов:

Виджет Frame

Давайте внимательно рассмотрим пример, показанный выше. В строках 5 и 6 мы определяем два новых виджета Frame. Очевидно, что в первом аргументе мы указываем на их родительский виджет, которым является корневое окно.

По умолчанию границы Frame невидимы, но, допустим, мы хотели бы видеть, где именно они расположены. Чтобы показать их границы, мы должны дать им определенную ширину (в нашем примере 2 пикселя) и стиль рельефа (своего рода трехмерный эффект), в котором будет отображаться граница. На выбор предлагается 5 различных стилей relief – в нашем примере мы используем ridge.

В строках 14 и 15 мы ориентируем фреймы внутри корневого окна с помощью метода grid(). Затем мы используем метод grid() для ориентации меток (строки 17–18) и метод pack() для ориентации кнопок (строки 20–21). Метки и кнопки теперь находятся в отдельных контейнерах, поэтому ничто не мешает нам ориентировать виджеты разными методами.

Окна верхнего уровня

Ваш интерфейс не должен содержать более одного корневого окна, но вы можете создать множество окон, которые являются дочерними по отношению к корневому окну. Лучший способ сделать это – использовать класс Toplevel.

В приведенном выше примере мы создаем наше новое окно в строке 5. Поскольку окно – это объект, который не привязан к какому-либо другому виджету, нам не нужно указывать на его родительский элемент или ориентировать его внутри родительского виджета.

Мы хотели бы показывать новое окно после нажатия кнопки. В строке 5 он отображается сразу, поэтому мы используем метод remove() в строке 6, чтобы скрыть его. Затем мы изменяем определение кнопки в строке 15.

Помимо нового имени переменной и текста, кнопка теперь выполняет команду – метод объекта new_window, deiconify, который заставит окно снова появиться после того, как пользователь щелкнет кнопку window_button.

Заключение

Как видите, с помощью Tkinter вы можете легко и быстро создавать графические интерфейсы для непрофессиональных пользователей вашего программного обеспечения. Библиотека включена во все установки Python, поэтому создание вашего первого простого окна – это всего лишь пара строк кода.

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

Что такое tkinter? [ ]

Tkinter - это графическая библиотека, позволяющая создавать программы с оконным интерфейсом. Эта библиотека только перенесена на Python, она широко известна в мире UNIX-систем, и для её изучения можно использовать туториалы для этих систем. Импортируется она как и любая другая библиотека:

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

Основные виджеты [ ]

Button [ ]

Виджет Button - самая обыкновенная кнопка, которая используется в тысячах программ. Пример кода:

Разберем этот небольшой код. За создание, собственно, окна, отвечает класс Tk(), и первым делом нужно создать экземпляр этого класса. Этот экземпляр принято называть root, хотя вы можете назвать его как угодно. Далее создаётся кнопка, при этом мы указываем её свойства(начинать нужно с указания окна, в примере - root). Здесь перечислены некоторые из них:

  • text - какой текст будет отображён на кнопке (в примере - ок)
  • width,height - соответственно, ширина и длина кнопки.
  • bg - цвет кнопки (сокращенно от background, в примере цвет - чёрный)
  • fg - цвет текста на кнопке (сокращённо от foreground, в примере цвет - красный)
  • font - шрифт и его размер (в примере - arial, размер - 14)

Далее, нашу кнопку необходимо разместить на окне. Для этого, в Tkinter используются специальные упаковщики( pack(),place(), grid() ). Поподробнее об упаковщиках узнаем позже. Пока, чтобы разместить несколько виджетов на окне, будем применять самый простой упаковщик pack(). В конце программы, нужно использовать функцию mainloop(см. пример), иначе окно не будет создано.

Label [ ]

Label - это виджет, предназначенный для отображения какой-либо надписи без возможности редактирования пользователем. Имеет те же свойства, что и перечисленные свойства кнопки.

Entry [ ]

Entry - это виджет, позволяющий пользователю ввести одну строку текста. Имеет дополнительное свойство bd (сокращённо от borderwidth), позволяющее регулировать ширину границы.

Text - это виджет, который позволяет пользователю ввести любое количество текста. Имеет дополнительное свойство wrap, отвечающее за перенос (чтобы, например, переносить по словам, нужно использовать значение WORD).Например:

Listbox [ ]

Listbox - это виджет, который представляет из себя список, из элементов которого пользователь может выбирать один или несколько пунктов. Имеет дополнительное свойство selectmode, которое, при значении SINGLE, позволяет пользователю выбрать только один элемент списка, а при значении EXTENDED - любое количество. Пример:

Стоит заметить, что в этой библиотеке для того, чтобы использовать русские буквы в строках, нужно использовать Unicode-строки. В Python 2.x для этого нужно перед строкой поставить букву u, в Python 3.x этого делать вообще не требуется, т.к. все строки в нем изначально Unicode.

Frame [ ]

Виджет Frame (рамка) предназначен для организации виджетов внутри окна. Рассмотрим пример:

Свойство bd отвечает за расстояние от края рамки до виджетов.

Checkbutton [ ]

Checkbutton - это виджет, который позволяет отметить „галочкой“ определенный пункт в окне. При использовании нескольких пунктов нужно каждому присвоить свою переменную. Разберем пример:

IntVar() - специальный класс библиотеки для работы с целыми числами. variable - свойство, отвечающее за прикрепление к виджету переменной. onvalue, offvalue - свойства, которые присваивают прикреплённой к виджету переменной значение, которое зависит от состояния(onvalue - при выбранном пункте, offvalue - при невыбранном пункте).

Radiobutton [ ]

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

В этом виджете используется уже одна переменная. В зависимости от того, какой пункт выбран, она меняет своё значение. Самое интересное, что если присвоить этой переменной какое-либо значение, поменяется и выбранный виджет. На этом мы прервём изучение типов виджетов (потом мы к ним обязательно вернёмся).

Упаковщики [ ]

Упаковщик - это специальная подпрограмма, которая размещает (упаковывает) виджеты на окне. Как и говорилось ранее, в Tkinter есть три упаковщика: pack(), place(), grid(). Разберем каждый из них по порядку:

Упаковщик pack() является самым простым в основном потому, что его можно вызвать без указания свойств(что мы и делали ранее). Основная задача этого упаковщика - указать, с какой стороны находится виджет, относительно виджетов, находящихся после него, с помощью свойства side. Например:

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

place() [ ]

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

Этот упаковщик, хоть и кажется неудобным, предоставляет полную свободу в размещении виджетов на окне. Перейдем к самому (на мой взгляд) эффективному упаковщику - grid()

Этот упаковщик представляет окно как сетку с ячейками, в которые помещаются, собственно, виджеты. Имеет три свойства:

  • row - строка
  • column - столбец
  • columnspan - сколько ячеек занимает виджет. (необязательный аргумент)

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

Привязка событий [ ]

"Всё это хорошо" - наверное, подумали вы -"Но как сделать так, чтобы мои виджеты что-то делали, а не просто красовались на окне?". В Tkinter есть специальный метод, привязывающий событие к какому-либо действию. Этот метод - bind()

Метод bind привязывает событие к какому-либо действию (будь то нажатие кнопки мыши, клавиши и т.д.). Вот основные действия:

  • - нажатие левой кнопки мыши
  • - нажатие правой кнопки мыши
  • - нажатие на колесико мыши
  • - нажатие клавиши Enter
  • - движение мышкой
  • - нажатие клавиши Ctrl
  • - нажатие клавиши Shift
  • - нажатие клавиши z (вместо z можно использовать любой символ)

Если вы хотите, чтобы событие возникало при нажатии комбинации клавиш, нужно указать их через тире, например:

Событие описывается обычной функцией. Например:

Продвинутые виджеты [ ]

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

Scale [ ]

Scale (шкала) - это виджет, позволяющий выбрать какое-либо значение из заданного диапазона. Свойства:

  • orient - как расположена шкала на окне. Возможные значения: HORIZONTAL, VERTICAL (горизонтально, вертикально).
  • length - длина шкалы.
  • from_ - с какого значения начинается шкала.
  • to - каким значением заканчивается шкала.
  • tickinterval - интервал, через который отображаются метки шкалы.
  • resolution - шаг передвижения (минимальная длина, на которую можно передвинуть движок)

Здесь используется специальный метод get(), который позволяет снять с виджета определенное значение, и используется не только в Scale.

Scrollbar [ ]

Этот виджет даёт возможность пользователю "прокрутить" другой виджет (например текстовое поле) и часто бывает полезен. Реализация этого виджета достаточно оригинальна (рассмотрим её на примере):

Мы указываем свойством command, какой виджет будет прокручиваться и привязываем Scrollbar к текстовому полю при помощи команды set().

Читайте также: