Создание настольных Python приложений с графическим интерфейсом пользователя
Исходный код
Исходный код к примерам можно скачать по адресу https://github.com/novts/python-gui.
Введение
Де факто Python является наиболее популярным объектно-ориентированным языком программирования, который используется для веб-разработки и анализа больших данных.
И конечно, Python – это интерактивный язык программирования, который предоставляет широкий спектр возможностей для создания графического интерфейса пользователя.
PyQt – это библиотека графического фреймворка Qt для языка программирования Python.
А Qt кью-ти – это кроссплатформенный инструментарий для разработки программного обеспечения на языке программирования C++, такого как графические интерфейсы, работа с сетью, базами данных и XML.
PyQt работает на всех платформах, поддерживаемых Qt – Linux и другие UNIX-подобные ОС, Mac OS и Windows.
И существуют 2 версии: PyQt5, поддерживающий Qt 5, и PyQt4, поддерживающий Qt 4.
PyQt практически полностью реализует возможности Qt, включая набор виджетов графического интерфейса, доступ к базам данных с помощью SQL, парсер XML и так далее.
PyQt также включает в себя Qt Designer— дизайнер графического интерфейса пользователя с генерацией Python кода из файлов, созданных в Qt Designer.
PySide – это также библиотека графического фреймворка Qt для языка программирования Python.
Основное отличие PySide от PyQt – это лицензии под которыми распространяются эти две обёртки Qt.
PyQt5 распространяется под GPL и коммерческой лицензией.
А PySide2 распространяется как Qt под GPL, LGPL и коммерческой лицензией.
То есть если вы пишите открытое ПО – можно использовать как PyQt5, так и PySide2.
Но если вы пишите закрытое/коммерческое ПО – бесплатно можно использовать только PySide2, а для использования PyQt5 потребуется покупать коммерческую лицензию.
Tkinter – это самая популярная библиотека для создания графического интерфейса пользователя или настольных приложений.
Tkinter – это комбинация стандартного графического интерфейса пользователя Tk и Python.
А Tk – это кроссплатформенная библиотека графического интерфейса с открытым исходным кодом.
Tkinter входит в стандартную библиотеку Python.
И Tkinter – это свободное программное обеспечение, распространяемое под Python-лицензией.
TKinter поставляется с хорошей документацией, что является основным ее достоинством.
И получить ответы на свои вопросы здесь легко, так как у Tkinter тысячи пользователей, потому что эта библиотека используется в течение очень долгого времени.
Kivy – это бесплатная среда Python с открытым исходным кодом для разработки кросс-платформенных приложений с поддержкой мультитач с пользовательским интерфейсом.
Kivy создана поверх OpenGL и для создания пользовательских интерфейсов дает возможность один раз написать код и запустить его на разных платформах Windows, MacOSX, Linux, Android, iOS и Raspberry.
WxPython – это обёртка библиотеки кроссплатформенного графического интерфейса пользователя wxWidgets, написанной на языке программирования C++.
Это еще одна из альтернатив Tkinter, которая поставляется вместе с Python.
И WxPython реализована в виде модуля расширения Python.
Dear
PyGUI – это простая и легкая библиотека графического интерфейса пользователя, так как она полностью связана с языком программирования Python.
Dear PyGui предоставляет оболочку библиотеки С++ Dear ImGui, которая имитирует традиционный графический интерфейс.
Это кроссплатформенная среда приложений с графическим интерфейсом пользователя, которая отображает естественный графический интерфейс платформы.
Здесь мы перечислили наиболее широко используемые и лучшие доступные фреймворки графического пользовательского интерфейса Python.
И вы можете выбрать наиболее подходящую вам среду для разработки графического интерфейса Python.
Далее мы более подробно разберем каждую библиотеку.
Библиотека PyQt
PyQt – это библиотека, которая позволяет использовать библиотеку графического интерфейса Qt в Python.
Сама библиотека Qt написана на C ++.
Самая последняя версия библиотеки – это PyQt5, и она поддерживает последнюю версию Qt5.
Для работы с библиотекой PyQt5, установим питон 3.6.
Для разработки приложений питон с графическим интерфейсом пользователя мы будем пользоваться средой разработки
PyCharm
.
Создадим питон проект. При этом будет автоматически создана виртуальная среда.
Виртуальная среда – это просто локальный каталог, содержащий библиотеки для конкретного проекта.
И для установки библиотеки PyQt просто наберите в окне терминала, в командной строке pip install PyQt5.
Далее в проекте создадим питон файл и наберем в нем код.
Сначала мы загружаем PyQt с помощью оператора импорта.
И из PyQt5 виджетов импортируем QApplication, QLabel.
Класс QApplication управляет потоком управления и основными настройками приложения с графическим интерфейсом.
Виджет QLabel обеспечивает отображение текста или изображения.
Затем мы создаем QApplication с помощью команды:
app = QApplication
Это требование Qt – каждое приложение с графическим интерфейсом должно иметь ровно один экземпляр QApplication.
Здесь квадратные скобки представляют аргументы командной строки, переданные приложению.
Так как наше приложение не использует никаких параметров, мы оставляем скобки пустыми.
Далее мы создаем простую метку 'Привет, мир!'.
И затем мы говорим Qt показать метку на экране с помощью команды show.
И последний шаг – это передать управление среде Qt и попросить ее «запустить приложение, пока пользователь не закроет его».
Это делается с помощью команды exec.
Далее нажмем правой кнопкой мыши на созданном питон файле и выберем команду
run
.
В результате будет запущено приложение и откроется окно с меткой.
Теперь у нас есть приложение с графическим интерфейсом пользователя.
И оно работает на вашем компьютере.
Вопрос – как его передать другим людям, чтобы они тоже могли его запустить?
Вы можете попросить пользователей вашего приложения установить Python и PyQt, а затем предоставить им свой исходный код.
Но это очень неудобно.
Вместо этого нам нужен исполняемый файл, который другие люди могут запускать в своих системах, ничего не устанавливая.
В Python процесс превращения исходного кода в автономный исполняемый файл называется замораживанием.
Хотя существует множество библиотек, которые решают эту проблему, например PyInstaller, py2exe и так далее, здесь мы будем использовать библиотеку под названием fbs, которая позволяет создавать автономные исполняемые файлы для приложений PyQt.
Поэтому для начала установим библиотеку fbs.
Далее мы в терминале запускаем команду fbs startproject.
В результате выполнения которой будет создана папка src/main/python/с файлом main.py.
Команда startproject создает необходимую структуру папок для приложения fbs.
Если мы наберем в терминале команду fbs run, откроется просто пустое окно.
Теперь, как нам вставить в это окно нашу метку.
Здесь вы можете заметить, что создание приложения с помощью fbs представляет новую концепцию – ApplicationContext.
При создании приложений PyQt5 обычно используется ряд компонентов или ресурсов, которые используются во всем приложении.
И ApplicationContext предоставляет центральное место для инициализации и хранения этих компонентов, а также предоставляет доступ к некоторым основным функциям fbs.
Объект ApplicationContext также создает и содержит ссылку на глобальный объект QApplication, доступный в ApplicationContext.app, так как каждое приложение Qt должно иметь один и только один объект QApplication для хранения цикла событий и основных настроек.
Теперь, чтобы вставить нашу метку, помимо QMainWindow импортируем метку.
Создадим метку и методом setAlignment установим ее посередине.
Методом setCentralWidget добавим метку в окно QMainWindow.
В результате после вызова команды fbs run мы увидим окно с меткой.
Более подробно про окно QMainWindow можно посмотреть в
QT
документации.
Теперь, приложениям обычно требуются дополнительные файлы данных помимо исходного кода – например, изображения.
И вот здесь может быть полезен ApplicationContext.
Вы можете поместить ресурсы приложения в папку resources, и чтобы упростить загрузку ресурсов из папки resources, fbs предоставляет метод ApplicationContext.get_resource.
Этот метод принимает имя файла, который можно найти в папке resources, и возвращает абсолютный путь к этому файлу.
И вы можете использовать этот возвращенный абсолютный путь, чтобы открыть файл.
Папка resources должна содержать папку base плюс любую комбинацию других папок.
Базовая папка содержит файлы, общие для всех операционных систем, в то время как папки для конкретных платформ могут использоваться для файлов, специфичных для данной ОС.
Теперь, далее мы можем использовать fbs, чтобы превратить файл питона в отдельный исполняемый файл.
Для этого в терминале наберем команду fbs freeze.
Эта команда помещает исполняемый двоичный файл в целевую папку текущего каталога.
Далее мы можем создать установщик приложения.
Но для начала мы должны установить NSIS – систему с открытым исходным кодом для создания установщиков Windows.
Также нужно добавить каталог NSIS в переменную среды
Windows
PATH.
После этого нужно перезапустить среду разработки PyCharm, чтобы она увидела эти изменения.
Далее создадим установщик с помощью команды fbs installer.
Эта команда помещает исполняемый двоичный файл в целевую папку текущего каталога.
Теперь вы можете отправлять его для установки приложения.
Виджеты и компоновки PyQt
Система компоновки Qt предоставляет простой и мощный способ организации дочерних виджетов внутри родительского виджета.
Qt предоставляет набор классов управления компоновкой.
Эти компоновки автоматически позиционируют и изменяют размер виджетов.
И все виджеты Qt могут использовать компоновки для управления своими дочерними элементами с помощью функции setLayout.
Здесь мы с помощью компоновки QHBoxLayout располагаем метки горизонтально в окне QWidget.
Компоновка QVBoxLayout размещает метки вертикально.
Компоновка QGridLayout располагает элементы в сетке.
При этом для каждого элемента можно указать строку, столбец, в которых должен находиться элемент.
Также можно указать затем сколько строк и столбцов должен заполнять элемент.
Компоновка QFormLayout добавляет два виджета в строку, обычно QLabel и QLineEdit для создания форм.
В качестве резюме – виджеты могут иметь в качестве родительских только другие виджеты, но не компоновки.
Но вы можете вкладывать компоновки в родительскую компоновку с помощью метода addLayout, тогда внутренний макет становится дочерним по отношению к макету, в который он вставлен.
Теперь, модуль Qt Widgets предоставляет набор элементов пользовательского интерфейса для создания пользовательских интерфейсов приложения.
И все, что вы видите в приложении PyQt, представляет собой виджеты: кнопки, метки, окна, диалоговые окна, индикаторы выполнения и т. д.
С меткой мы уже познакомились.
При создании метки, передавая в конструктор в качестве параметра объект окна, мы сообщаем, что метка является частью окна.
Метки имеют размер по умолчанию, и для длинных строк текста размер по умолчанию может быть слишком мал.
К счастью, у нас есть метод adjustSize, который автоматически настраивает размер метки.
В противном случае длинный текст будет отображаться на экране только частично.
И метод move определяет начальную позицию метки от левого верхнего угла экрана.
Каждому графическому интерфейсу нужен какой-нибудь способ получения ввода от пользователя.
В PyQt такой способ ввода данных – это использование виджета QLineEdit.
Или если вы хотите получить ввод многострочного текста, вам нужно использовать виджет QTextEdit.
И конечно ввод как правило используется вместе с кнопкой QPushButton.
Чтобы получить введенный текст из виджета QLineEdit, вы должны использовать метод text.
Здесь мы создаем кнопку Submit, которая вызывает функцию show, использующую метод text виджета QLineEdit.
Мы также создаем кнопку Clear, которая вызывает метод clear виджета QLineEdit, который удаляет все его содержимое.
Метод SetEchoMode принимает несколько различных «режимов», одним из которых является режим пароля, который скрывает ввод.
Используя метод setFixedWidth, мы можем установить размер виджета QLineEdit в пикселях.
Значение по умолчанию для каждого виджета составляет около 100 пикселей.
Теперь о кнопке QPushButton.
Как следует из названия, это кнопка, которая запускает функцию при нажатии.
Кнопка, которая не связана с функцией, бесполезна.
Кнопки предназначены для подключения функции, которая будет выполняться после нажатия кнопки.
И такая функция подключается с помощью метода clicked.connect.
Также вы можете установить изображение на кнопку, с помощью виджета QIcon.
Просто передайте в него путь к файлу, и все готово.
Виджет QComboBox представляет собой раскрывающийся список элементов, из которых пользователь может выбрать свой вариант.
Преимущество этого виджета в том, что он занимает очень мало места на экране, при наличии большого списка элементов.
Здесь мы добавляем элементы в список по одному методом addItem.
Хотя мы можем добавить сразу все элементы кортежем с помощью метода addItems.
Зафиксировать ширину списка мы можем методом setFixedWidth.
Теперь, обработать выбор пользователем элемента в списке мы можем с помощью метода currentText(), который возвращает элемент списка в виде строки.
Теперь перейдем к флажкам и радиокнопкам.
И здесь мы можем использовать сам флажок как кнопку, чтобы связать его с функцией обработки выбора флажка.
Мы делаем это с помощью метода stateChanged.connect.
Вы можете получить значение флажка с помощью метода text, который вернет текстовое значение флажка.
И вы можете использовать метод checkState, который возвращает целое число 0, если флажок не выбран и 2 – если он выбран.
Метод isChecked возвращает true, если флажок выбран.
В отличие от флажка, вы можете выбрать только одну радиокнопку из многих.
И здесь мы также можем использовать саму радиокнопку как кнопку, чтобы связать ее с функцией обработки выбора.
Мы делаем это с помощью метода toggled.connect.
Вы можете получить значение радиокнопки с помощью метода text, который вернет текстовое значение переключателя.
Есть еще один метод, который вы можете использовать – это метод isChecked, который возвращает true или false, показывая состояние выбора переключателя.
Как и виджет QLineEdit, виджет QTextEdit используется для ввода данных пользователем в виде текста.
Однако, в отличие от QLineEdit, который вводит только одну строку, QTextEdit позволяет ввести несколько строк текста.
Чтобы получить от пользователя введенный текст, мы можем использовать метод toPlainText и метод кнопки clicked.connect.
Метод setPlaceholderText используется для установки в виджет выделенного серым цветом текста, который исчезает при взаимодействии с виджетом.
Метод setUndoRedoEnabled отключает / включает возможность для пользователя использовать функции Undo и Redo с помощью клавиш Ctrl + Z и Ctrl + Y.
Помимо строки ввода и текстовой области, диалоговые окна обычно используются для ввода данных пользователя.
И в PyQt5 есть виджет QInputDialog, который позволяет создавать множество различных диалоговых окон для ввода данных различными способами.
И самое распространенное диалоговое окно – это ввод текста.
Оно представляет собой простое поле ввода и две кнопки, ОК и Отмена.
Функция getText возвращает два значения, поэтому мы устанавливаем две переменные для них.
Первая переменная input получает ввод пользователя, вторая переменная получает значение True или False, указывающее, была ли нажата кнопка OK или нет.
Далее есть диалоговое окно ввода целого числа.
Здесь вы можете использовать стрелки для изменения целочисленного значения или непосредственно ввести значение самостоятельно.
Следующее окно – это окно выбора элемента.
И здесь мы сначала определяем список / кортеж строк, отображаемых в качестве элементов.
И последнее диалоговое окно – это окно ввода чисел с плавающей запятой.
Здесь вы также можете использовать стрелки для изменения значения или непосредственно ввести значение самостоятельно.
QMessageBox – это виджет, который используется для создания диалоговых окон для отображения различных сообщений и кнопок.
Как правило, в приложении определяется метод, который открывает окно сообщения.
И этот метод связывается с какой-нибудь кнопкой или событием приложения.
Здесь метод setWindowTitle устанавливает заголовок окна сообщения.
Метод setText устанавливает текст под заголовком.
Метод exec открывает окно сообщения.
Окно сообщения имеет 4 различных типа значков, которые можно изменить с помощью метода setIcon.
В окне сообщения по умолчанию используется кнопка «ОК».
Однако на самом деле существует более десятка различных кнопок, которые QMessageBox предлагает для использования.
Используя функцию setStandardButtons, мы можем установить другой тип кнопки.
Когда окно открывается, вокруг кнопки «ОК» есть синий контур.
Это обозначение кнопки по умолчанию.
Используя функцию setDefaultButton, мы можем изменить кнопку по умолчанию.
По умолчанию у нас есть только одна область в QMessageBox, где мы показываем текст.
Однако есть еще две дополнительные области, которые мы можем разблокировать, чтобы добавить больше текста.
Первая область – это дополнительный текстовый раздел в самом окне сообщения, который мы можем определить с помощью функции setInformativeText.
Вторая область текста отображается в расширении окна.
При настройке этого раздела автоматически создается кнопка, которая используется для отображения этой области.
И для создания этой области потребуется функция setDetailedText.
Теперь, если у нас есть 3 разные кнопки в окне сообщений, как мы узнаем, какая из них была нажата?
Используя метод buttonClicked.connect, мы можем вызвать запуск функции всякий раз, когда нажимается кнопка в окне сообщения.
Здесь когда нажимается кнопка окна сообщений, она автоматически запускает функцию popup, объявленную в buttonClicked.connect.
И вызов функции text кнопки вернет ее текстовое значение.
Виджет ProgressBar, индикатор выполнения – это отличный способ визуализировать процесс выполнения длительных операций, таких как передача файлов, загрузка, выгрузка, копирование и т. д.
Здесь с помощью метода setGeometry, мы определяем расположение и размеры индикатора выполнения.
Первые два параметра представляют положение X и Y индикатора выполнения в окне.
Третий и четвертый параметры – это ширина и высота индикатора выполнения.
Метод setValue устанавливает значения индикатора.
Однако имейте в виду, что диапазон для индикатора выполнения составляет от 0 до 100.
Если вы хотите изменить этот диапазон, используйте метод setRange.
Метод reset сбрасывает значение на индикаторе выполнения.
Метод value возвращает текущее целочисленное значение индикатора.
Виджет PyQt QSlider предоставляет графический интерфейс для выбора значения из диапазона различных значений.
У виджета Slider есть ползунок, который можно перемещать.
При перемещении ползунка выбранное значение соответственно изменяется.
По умолчанию ориентация слайдера вертикальная.
Для горизонтального ползунка вам нужно использовать значение Qt.Horizontal.
Затем нам нужно установить минимальный и максимальный диапазон с помощью методов setMinimum и setMaximum.
Используя метод setGeometry, мы определяем расположение и размеры слайдера.
Первые два параметра определяют положение ползунка по осям X и Y в окне.
Третий и четвертый параметры – это ширина и высота слайдера.
Затем нам нужно установить Ticks, маркеры по ползунку.
Вы можете выбрать место размещения тиков и установить интервал для расстояния между тиками.
Используя метод valueChanged, мы можем связать значение ползунка с функцией show.
Каждый раз, когда значение ползунка изменяется, вызывается функция show и показывается значение слайдера.
Виджет PyQt5 QDateEdit – это интерактивный и визуальный способ ввести дату в приложении.
Здесь вы можете редактировать дату вручную или с помощью встроенных клавиш со стрелками.
И здесь вам не нужно назначать минимальное или максимальное значение, PyQt сам назначит значения по умолчанию.
Но вы можете сделать это с помощью методов setMinimumDate и setMaximumDate.
Чтобы получить введенную дату, вы можете использовать метод date и метод toPyDate, чтобы распечатать дату в более читаемом формате.