🐍 Самоучитель по Python для начинающих. Часть 20: Графический интерфейс на Tkinter
Расскажем о преимуществах и недостатках Tkinter, изучим основы создания GUI и разберемся в особенностях компоновки виджетов с помощью pack(), place() и grid(). В конце статьи – 10 практических заданий по разработке GUI для Python-программ.
Графический интерфейс для программы на Python можно создать с помощью одной из
специальных GUI библиотек:
Tkinter
wxPython
PyQt
PySide
Kivy
PyGTK
У каждой из этих библиотек есть свои преимущества и
недостатки. Только одна из них, Tkinter,
входит в стандартную поставку Python.
Виджеты Tkinter не
отличаются сногсшибательной стильностью – это ее единственный очевидный
минус. Преимуществ у Tkinter гораздо больше, чем недостатков. Эта библиотека:
Максимально проста в изучении и использовании.
Имеет детальную и доступную документацию.
Помимо базовых элементов интерфейса, содержит два мощных виджета – Text (многострочное текстовое поле с поддержкой форматирования) и Canvas («холст», на котором можно рисовать и отображать любые графические объекты).
Включает в себя модуль ttk, который предоставляет в распоряжение разработчика набор дополнительных виджетов – Combobox, Notebook, Treeview, Progressbar, Scale и другие.
Позволяет сделать интерфейс адаптивным.
Отлично подходит для начинающих – поэтому на ней мы и сосредоточимся.
Создание окна приложения с Tkinter
Для создания простого окна приложения в Tkinterвыполните
следующие действия:
Импортируйте модуль import tkinter.
Создайте новый объект Tk, который представляет собой главное окно приложения.
(Опционально) Задайте заголовок окна с помощью метода title() объекта Tk.
(Опционально) Установите размер окна с помощью метода geometry() объекта Tk. Метод geometry() принимает строковый параметр в формате "ширинаxвысота".
Вызовите метод mainloop() объекта Tk, чтобы запустить основной цикл GUI приложения.
Вот пример кода, который создает простое окно размером 250 на 250 пикселей с заголовком «Мое
приложение»:
Чтобы разместить окно Tkinter приложения в центре экрана, необходимо:
Воспользоваться методами winfo_screenwidth() и winfo_screenheight() для получения ширины и высоты экрана соответственно.
Передать в метод geometry() координаты x и y, равные половине ширины и высоты экрана за минусом половины ширины и высоты окна приложения.
Код будет выглядеть так:
Теперь окно расположено точно в центре экрана:
Размещение элементов интерфейса в Tkinter
Элементы интерфейса в Tkinter называются виджетами. Существует три основных способа
расположения виджетов на поверхности окна: pack(), place() и grid(). Каждый из
этих методов имеет свои преимущества и недостатки, и выбор оптимального
способазависит от конкретной ситуации.
pack() – упорядочивает виджеты по горизонтали или вертикали.
Он прост в использовании, не требует дополнительных параметров (указания
отступов, конкретной позиции). Подходит для создания простых интерфейсов. Недостаток
– с помощью pack() проблематично реализовать сложную компоновку, например, сетку
или перекрывание виджетов: для этого нужно комбинировать метод с place().
place() – позволяет задать точное положение и размер каждого
виджета в окне. Его используют, когда необходимо точно расположить виджеты или
создать перекрывающиеся элементы интерфейса. Недостаток – при изменении
размеров окна или содержимого виджетов трудно сохранить расположение элементов.
grid() – упорядочивает виджеты в сетку из рядов и столбцов. Самый
гибкий и мощный, позволяет создавать сложные интерфейсы, состоящие из виджетов
разных размеров. Сложнее в использовании, чем pack(), поскольку требует больше
кода для компоновки виджетов.
В целом, pack() хорошо подходит для простых интерфейсов, place() – для более сложных, а grid() используют для создания сложных интерфейсов, которым нужна адаптивность, особое позиционирование или растягивание виджетов на несколько строк / столбцов.
Чтобы при нажатии кнопки выполнялось какое-то действие,
нужно связать кнопку с определенной функцией. Чаще всего для этого используются
методы command() и bind(), но при необходимости
к виджетам Tkinterможно привязывать выполнение анонимных и частично
примененных функций. Проиллюстрируем примерами.
Метод command() используется
для прямого связывания функции с нажатием кнопки:
Метод bind(), по сравнению с command(), отличается большей гибкостью: его можно использовать для связывания функции с любым событием, происходящим в виджете – с нажатием кнопки, движением мыши, нажатием клавиши, изменением размера окна и так далее:
Назначение кнопке анонимной функции:
Связывание кнопки с частично примененной функцией:
Практика
Задание 1
Создайте Tkinter
интерфейс для программы, которая получает от пользователя текст с помощью
виджетов Entry и Button,
а затем выводит полученную строку в терминале.
Ожидаемый результат:
Решение:
Задание 2
Создайте интерфейс для программы, которая изменяет текст
виджетаLabelпосле
нажатия на кнопку.
Ожидаемый результат:
Решение:
Задание 3
Создайте интерфейс для программы, которая получает от
пользователя многострочный текст в виджете Text и выводит в виджетах Labelколичество слов и символов.
Ожидаемый результат:
Задание 4
Напишите программу для оценки сервиса по шкале от 0 до 100.
Используйте виджет Scale
(ttk модуль).
Ожидаемый результат:
Решение:
Задание 5
Создайте индикатор выполнения задачи с помощью виджета Progressbarиз
модуля ttk. Индикатор
должен обнуляться спустя 5 секунд.
Ожидаемый результат:
Решение:
Задание 6
Создайте Tkinterинтерфейс для программы заказа фруктов. Для вывода списка
фруктов используйте виджет Combobox из модуля ttk.
Ожидаемый результат:
Решение:
Задание 7
Напишите GUIпрограмму, которая позволяет пользователю выбрать цвет из палитры,
и отображает его HEX-значение.
Ожидаемый результат:
Решение:
Задание 8
Напишите программу, которая использует виджеты Spinbox для получения двух
чисел a и b (0 <= a <= 100,
0 <= b <= 100), а затем выводит сумму всех целых чисел в диапазоне от a до bвключительно.
Ожидаемый результат:
Решение:
Задание 9
Создайте GUIинтерфейс для программы-каталога фильмов, книг и
мультфильмов. Используйте виджеты Notebookи Treeview для вывода объектов
разного типа на отдельных вкладках. Реализуйте всплывающее окно для вывода
полной информации об издании.
Ожидаемый результат:
Решение:
Задание 10
Напишите GUI калькулятор, который:
Выполняет основные арифметические операции – сложение, вычитание, деление и умножение.
Поддерживает операции с отрицательными числами, извлечение квадратного корня, деление с остатком и целочисленное деление.
Кроме того, программа должна поддерживать очистку ввода.
Ожидаемый результат:
Решение:
Подведем итоги
В этой статье мы рассмотрели основы создания GUIдля
Python-программ и
научились использовать основные виджеты Tkinter. В следующей главе будем изучать основы разработки игр с Pygame.
Какие трудности у вас возникают при создании GUI на Python?