PyQt

Основы

Введение в тему

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

Что такое pyqt5

PyQt – это модуль, предназначенный для создания графических интерфейсов в Python через библиотеку Qt. Эта библиотека написана на языке C++ и является одним из самых популярных инструментов разработки GUI, а также имеет обширное сообщество. Существует и альтернатива: модуль PySide. Различаются они тем, что PyQt нельзя свободно использовать в коммерческих проектах, однако, этот модуль, всё же, более зрелый. Существуют и другие распространённые средства создания графических интерфейсов:

  • Kyvi
  • WxPython
  • Tkinter
  • PyGTK

Установка pyqt

Устанавливать модуль будем в виртуальную среду. Для этого вводим в консоли:

Эта команда создаст папку venv/. Чтобы запустить виртуальную среду в ОС Windows, выполните следующую команду:

Для остальных ОС это делается так:

Если всё получилось, в начале строки в терминале появится префикс (venv).

Теперь, для установки PyQt с помощью pip, выполните следующую команду:

Создание gui графического интерфейса пользователя

Теперь можно приступить к созданию интерфейса. Сперва модуль надо импортировать:


from PyQt5.QtWidgets import QApplication, QLabel

Теперь необходимо создать объект приложения QApplication при помощи следующей команды:

В объект приложения необходимо передавать список аргументов. В данном случае он пустой [], но, общепринятая практика писать следующим образом:

sys.argv – аргументы командной строки и теперь Вы можете запустить свой скрипт из консоли, передав при этом какие-то аргументы.

Дальше нужно создать виджет (о них мы поговорим чуть позже):

На данный момент наш маленький интерфейс готов, но, чтобы его увидел пользователь, надо использовать метод show:

Готово:

PyQt

Внешний вид будет зависеть от Вашей операционной среды.

Осталось запустить приложение:

После этой команды скрипт попадает в цикл обработки событий. Благодаря этому, мы можем понимать, что делает пользователь: заполняет поля, нажимает кнопки и так далее. Хороший вариант обрабатывать закрытие окна:

Метод sys.exit() обеспечивает чистый выход. Вы сможете узнать, как завершилось приложение.

Виджеты

Виджеты – это все видимые части интерфейса. Они могут быть вложены друг в друга.

На этом изображении представлены самые часто встречающиеся виджеты:

PyQt

Они перечислены ниже в порядке сверху вниз и слева направо:

  • QLabel — обеспечивает отображение текста или изображения
  • QComboBox — представляет собой комбинированную кнопку и всплывающий список
  • QCheckBox — предоставляет флажок с текстовой меткой
  • QRadioButton — предоставляет переключатель с текстовой меткой
  • QPushButton — предоставляет командную кнопку
  • QTableWidget — предоставляют стандартные средства отображения таблиц для приложений
  • QLineEdit – изменяемая строка
  • QSlider — вертикальный или горизонтальный ползунок
  • QProgressBar — предоставляет горизонтальную или вертикальную полосу выполнения

Есть ещё несколько важных методов виджетов, о которых нельзя не рассказать:

resize() — изменяет размеры виджета.

move() — двигает виджет на экране.

setWindowTitle() – устанавливает название окна.

Пример использования:


import sys

from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
mywidget = QWidget()
mywidget.resize(750, 650)
mywidget.move(0, 0)
mywidget.setWindowTitle('My Window')
mywidget.show()
sys.exit(app.exec_())

Этот код создаёт пустое окно размером 750*650 пикселей, расположенное в верхнем левом углу. Название окна — ‘My Window’.

Есть ещё очень важный инструмент для создания интерфейсов — Qt Designer. Это программа, которая делает проще процесс создания графического интерфейса программы, конечно внешний вид можно сделать и без помощи данной программы, но не для всех это будет удобно. На данный момент разработчики прекратили поддержку этого инструмента.

Макеты

Чаще всего приложение состоит из целого набора виджетов. Если так, то нужно объяснить Qt, как их разместить внутри окна. Например, вы можете использовать QHBoxLayout для горизонтального расположения виджетов:

PyQt

Листинг кода, создающего окно, представленное на изображении выше:


import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout

app = QApplication(sys.argv)
mywindow = QWidget()
mylayout = QHBoxLayout()
mylayout.addWidget(QPushButton('Hello'))
mylayout.addWidget(QPushButton('World'))
mywindow.setLayout(mylayout)
mywindow.show()
sys.exit(app.exec_())

Что здесь происходит? Сперва мы импортируем необходимые модули, затем создаём объект приложения. Создаём виджет типа QWidget. Это базовый тип, не имеющий поведения. Дальше инициируем макет (mylayout), а в нём две кнопки QPushButton. Строка mywindow.setLayout(mylayout) говорит QT что для виджета mywindow будет использоваться именно этот макет. Делаем всё это видимым и запускаем.

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

QHBoxLayout – располагает виджеты горизонтально.

QVBoxLayout — располагает виджеты вертикально.

QGridLayout – сеточный макет. Этот макет делит пространство на строки и столбцы.

QFormLayout — размещает свои дочерние элементы в виде двух столбцов.

Если Вы знакомы с языком CSS, то, конечно же, заметили что QHBoxLayout и QVBoxLayout похожи на flexbox, а QGridLayout – на grid.

Пример с QFormLayout:

PyQt


import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFormLayout, QLineEdit

app = QApplication(sys.argv)
mywindow = QWidget()
mylayout = QFormLayout()
mylayout.addRow(QPushButton('Hello'), QLineEdit('World'))
mywindow.setLayout(mylayout)
mywindow.show()
sys.exit(app.exec_())

Пользовательские стили

Библиотека Qt является очень мощной, ведь с ней можно управлять почти всеми аспектами интерфейса. Не исключение и стиль оформления.

Встроенные стили

Проще всего установить для приложения глобальный стиль. Сделаем это для программы из предыдущего примера:

PyQt


import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QSlider

app = QApplication(sys.argv)
mywindow = QWidget()
mylayout = QHBoxLayout()
mylayout.addWidget(QPushButton('Hello'))
mylayout.addWidget(QPushButton('World'))
mylayout.addWidget(QSlider())
mywindow.setLayout(mylayout)
mywindow.show()
app.setStyle('Fusion')
sys.exit(app.exec_())

Меняем строку: app.setStyle(‘Fusion’) на app.setStyle(‘Windows’) и стиль меняется:

PyQt

Для применения стиля, необходимо использовать метод app.setStyle().

Какие стили Вы можете использовать, зависит от Вашей операционной системы. Чаще всего это: «Fusion», «Windows», «WindowsVista» (для Windows) и «Macintosh» (только для Mac).

Пользовательские цвета

Вы так же можете самостоятельно задать цвет элементов:


import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QSlider

app = QApplication(sys.argv)
mywindow = QWidget()
mylayout = QHBoxLayout()
mylayout.addWidget(QPushButton('Hello'))
mylayout.addWidget(QPushButton('World'))
mylayout.addWidget(QSlider())
mywindow.setLayout(mylayout)
mywindow.show()
app.setStyle('Windows')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.black)
palette.setColor(QPalette.Button, Qt.darkGray)
palette.setColor(QPalette.Window, Qt.lightGray)
app.setPalette(palette)
sys.exit(app.exec_())

Теперь наш интерфейс оформлен в тёмных цветах.

PyQt

Таблицы стилей

Так же можно использовать таблицы стилей, как в CSS. Так, мы можем изменить оформление кнопок, поменять их рамку:

PyQt


import sys

from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QSlider

app = QApplication(sys.argv)
mywindow = QWidget()
mylayout = QHBoxLayout()
mylayout.addWidget(QPushButton('Hello'))
mylayout.addWidget(QPushButton('World'))
mylayout.addWidget(QSlider())
mywindow.setLayout(mylayout)
mywindow.show()
app.setStyle('Windows')
palette = QPalette()
app.setStyleSheet("QPushButton {border: 2px dotted grey;}")
sys.exit(app.exec_())

Здесь мы использовали метод setStyleSheet и передали в него свойство CSS. Будьте осторожны, не всегда этот способ работает так, как Вы этого ожидаете.

Сигналы и слоты

В Qt есть такой механизм как сигналы. Они созданы, чтобы оповещать основной код о происходящих с интерфейсом событиях. Ниже представлен код, который создаёт окно с кнопкой. Если на эту кнопку нажать (нажатие – это событие), всплывёт оповещение.


import sys

from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
mywidget = QPushButton('Hello')


def on_button_clicked():
alert = QMessageBox()
alert.setText('World')
alert.exec_()


mywidget.clicked.connect(on_button_clicked)
mywidget.show()
sys.exit(app.exec_())

PyQt

PyQt

Объект mywidget.clicked — это сигнал, а метод этого объекта .connect() позволяет установить на нем слот. Слот- это просто функция, которая вызывается при поступлении сигнала. Это ещё можно назвать коллбеком или функцией обратного вызова.

Компилируем наше приложение

Одна из проблем, связанных с PyQt, это распространение программ, использующих этот модуль.

В Питоне процесс создания автономного исполняемого файла из исходного кода называют замораживанием. Несмотря на то, что существует несколько модулей для таких задач, например PyInstaller, py2exe, pyqtdeploy, cx_Freeze, bbfreze, py2app и прочие, замораживание программ PyQt – задача не из простых.

Воспользуемся модулем fbs, который позволяет создавать автономные исполняемые файлы для программ PyQt. Для ее установки введите команду:

Затем выполним следующую команду:

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

Команда создает новую папку с именем src/в вашем текущем каталоге. Эта папка содержит минимальную конфигурацию для простого приложения PyQt.

Когда Вы введете команду run, должно открыться пустое окно:

PyQt

Это программа PyQt5. Исходный код этого приложения находится в директории src/main/python/main.py в текущем каталоге.

Эта команда создает и помещает автономный двоичный файл в папку /MyApp/ вашего текущего каталога. Запустить его можно на любом компьютере с той же операционной системой, что и у Вас

Бонус создаем установщик

Библиотека fbs также предоставляет Вам возможность создать установщик с помощью команды fbs installer:

PyQt

Иван Душенко
Автор статьи
Задать вопрос

Оцените статью
О Python на русском языке
Добавить комментарий

Adblock
detector