Учебное пособие по PyQt5 с примерами: разработка графического интерфейса с использованием PyQt в Python

Что такое PyQt?

PyQt является python-привязкой к open-source widget-toolkit Qt, который также функционирует как кроссплатформенный фреймворк для разработки приложений. Qt является популярным C++ среда для написания приложений с графическим интерфейсом для всех основных настольных, мобильных и встраиваемых платформ (поддерживает Linux, Windows, макОС, Android, iOS, Raspberry Pi и другие).

PyQt — это бесплатное программное обеспечение, разработанное и поддерживаемое компанией Riverbank Computing, базирующейся в Англии, тогда как Qt разработан финской фирмой The Qt Company.

Особенности PyQT

Вот важные особенности PyQt:

Изучите PyQt, который состоит из более чем шестисот классов, охватывающих ряд функций, таких как

  • Графические пользовательские интерфейсы
  • Базы данных SQL
  • Веб-инструментарии
  • Обработка XML
  • Networking

Эти функции можно комбинировать для создания расширенных пользовательских интерфейсов, а также автономных приложений. Многие крупные компании во всех отраслях используют Qt. Некоторые примеры: LG, Mercedes, AMD, Panasonic, Harman и т. д.

Версии PyQt

PyQt доступен в двух редакциях: PyQt4 и PyQt5. PyQt4 предоставляет связующий код для привязки версий платформы Qt 4.x и 5.x, тогда как PyQt5 предоставляет привязку только для версий 5.x. В результате PyQt5 не имеет обратной совместимости с устаревшими модулями старой версии. В этом руководстве по Qt GUI PyQt5 будет использоваться для демонстрации примеров. Помимо этих двух версий,

Riverbank Computing также предоставляет PyQt3D — привязки Python для платформы Qt3D. Qt3D — это прикладная среда, используемая для создания систем моделирования в реальном времени с 2D/3D-рендерингом.

Как установить PyQt5

В этом руководстве по PyQt5 мы увидим два способа установки PyQt:

  • Использование файлов Wheel
  • Сборка и установка из исходного кода

Qt (произносится как «кьют») — сложная система, а кодовая база PyQt содержит скомпилированные C++ и Python код под капотом. В результате, это сложный процесс сборки и установки из исходников по сравнению с другими библиотеками Python. Однако вы можете легко установить PyQt5 с помощью wheels.

Установка с колесами

Колеса — новый стандарт Python Формат упаковки и распространения. Проще говоря, колесо — это ZIP-архив со специальным именем и .Whl расширение файла. Колеса можно установить с помощью пипа (Pythonменеджер пакетов), который включен по умолчанию в последние версии Python.

Итак, если у вас есть Python 3.4 или более поздняя версия установлена, у вас уже есть pip. Если же вы используете более старую версию Python, вам необходимо скачать и установить pip, прежде чем продолжить. Инструкцию по этому поводу вы можете найти по этой ссылке: https://pypi.org/project/pip/.

Чтобы установить PyQt5,

Шаг 1) Откройте командную строку.
Откройте командную строку или PowerShell в своем Windows машина.

установить PyQt5

Шаг 2) Введите следующее.

 pip install PyQt5

Шаг 3) Установка прошла успешно.
На этом этапе этого руководства по PyQt5 вы загрузите пакет PyQt5 whl (около 50 МБ) и установите его в вашей системе.

установить PyQt5

Кроме того, вы также можете скачать Windows двоичный файл для версии Python, установленной на вашем компьютере.

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

Базовый PyQt Concepts и программы

Теперь, когда вы успешно установили PyQt5 на свой компьютер, вы готовы писать Python Приложения для проектирования графического интерфейса.

Давайте начнем с простого приложения в этом руководстве по PyQt5, которое будет отображать пустое окно на вашем экране.

Запустите свой питон IDLE и введите следующее:

Программа 1

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    w.show()
    sys.exit(app.exec_())

Сохраните его как app.py (имя не имеет значения) и нажмите F5, чтобы запустить программу. Альтернативно, просто дважды щелкните сохраненный файл, чтобы запустить приложение. Если вы все сделали правильно, откроется новое окно с заголовком Guru99, как показано ниже.

Базовый PyQt Concepts

Большой! Работает. Это немного, но достаточно, чтобы понять основы. Теперь в этом уроке по PyQt давайте подробно рассмотрим, что делает каждая строка вашей программы.

from PyQt5.QtWidgets import QApplication, QWidget

Этот оператор импортирует все модули, необходимые для создания графического интерфейса, в текущее пространство имен. Модуль QtWidgets содержит все основные виджеты, которые вы будете использовать в этом уроке. Python Учебник по Qt.

app = QApplication(sys.argv)

Здесь вы создаете объект класса QApplication. Этот шаг необходим для PyQt5; каждое приложение пользовательского интерфейса должно создать экземпляр QApplication как своего рода точку входа в приложение. Если вы его не создадите, будут показаны ошибки.

sys.argv — это список параметров командной строки, которые вы можете передать приложению при его запуске через оболочку или при автоматизации интерфейса.

В этом примере PyQt5 вы не передали QApplications никаких аргументов. Следовательно, вы также можете заменить его приведенным ниже кодом и даже не импортировать модуль sys.

app = QApplication([])
w = QWidget()

Далее мы создаем объект класса QWidget. QWidget — это базовый класс всех объектов пользовательского интерфейса в Qt, и практически все, что вы видите в приложении, является виджетом. Сюда входят диалоги, тексты, кнопки, панели и т. д. Особенность, позволяющая проектировать сложные пользовательские интерфейсы, заключается в том, что виджеты могут быть вложенными, т. е. вы можете иметь виджет внутри виджета, который находится внутри другого виджета. Вы увидите это в действии в следующем разделе.

w.resize(300,300)

Метод resize класса QWidget позволяет вам установить размеры любого виджета. В данном случае вы изменили размер окна до 300 на 300 пикселей.

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

w.setWindowTitle("Guru99")

Метод setWindowTitle() позволяет вам передавать строку в качестве аргумента, который установит заголовок окна в соответствии с переданной строкой. В примере PyQt5 в строке заголовка будет отображаться Guru99.

w.show()

show() просто отображает виджет на экране монитора.

sys.exit(app.exec_())

Метод app.exec_() запускает Qt/C++ цикл событий. Как вы знаете, PyQt в основном написан на C++ и использует механизм цикла событий для реализации параллельного выполнения. app.exec_() передает управление Qt, который выйдет из приложения только тогда, когда пользователь закроет его из GUI. Вот почему ctrl+c не выйдет из приложения, как в других программах Python. Поскольку Qt контролирует приложение, события Python не обрабатываются, если мы не настроим их внутри приложения. Также обратите внимание, что метод exec имеет подчеркивание в своем имени; это связано с тем, что exec() уже было ключевым словом в Python, а подчеркивание разрешает конфликт имен.

За пустыми окнами

В предыдущем разделе вы увидели, как создать базовый виджет в Qt. Пришло время создать более сложные интерфейсы, с которыми пользователи смогут по-настоящему взаимодействовать. И снова зажгите свой IDLE и напишите следующее.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    
    label = QLabel(w)
    label.setText("Behold the Guru, Guru99")
    label.move(100,130)
    label.show()

    btn = QPushButton(w)
    btn.setText('Beheld')
    btn.move(110,150)
    btn.show()
    btn.clicked.connect(dialog)

    
    w.show()
    sys.exit(app.exec_())

Сохраните файл как appone.py или как угодно и нажмите F5, чтобы запустить программу. Если вы не допустили ошибок, IDLE Откроется новое окно с текстом и кнопкой, как показано ниже.

За пределами пустого Windows

  1. После того, как вы нажмете кнопку в первом окне, откроется новое окно сообщения с написанным вами текстом.
  2. Теперь вы можете нажать кнопку «Скрыть детали/Показать детали», чтобы переключить видимость дополнительного текста.

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

Теперь, когда все работает, давайте посмотрим на дополнительный код, который вы добавили в предыдущий пример PyQt5.

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

Это импортирует еще несколько виджетов, которые вы использовали в примерах PyQt5, а именно QLabel, QPushButton и QMessage.Box.

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

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

Метод диалога вызывается из основного блока программы при нажатии кнопки в конкретном виджете (в данном случае кнопка PushButton). Событие щелчка, вызванное этой кнопкой, вызывает выполнение этой функции. Такая функция в Qt называется слотом, и вы узнаете больше о ней. сигналы и слоты в следующих пунктах.

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")

Это основной раздел приложения, и, как и в предыдущем примере, вы начинаете с создания экземпляра QApplication, за которым следует простой виджет, то есть экземпляр QWidget.

label = QLabel(w)
    btn = QPushButton(w)

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

Здесь важно отметить, что при создании объектов label и btn вы передаете объект окна (w) конструкторам QLabel и QPushButton. Вот как работает вложение в PyQt5. Чтобы создать виджет внутри другого виджета, вы передаете ссылку родительского виджета конструктору дочернего виджета.

label.move(100,130)
btn.move(110,150)

move() используется для установки положения виджета относительно его родительского виджета. В первом случае метка будет перемещена на 100 пикселей слева и на 130 пикселей сверху окна.

Аналогично, кнопка будет размещена на расстоянии 110 пикселей слева и 150 пикселей сверху окна. Этот пример представляет собой грубый способ создания макетов и обычно не используется в производстве; оно включено сюда только в учебных целях. Qt поддерживает различные макеты, которые вы подробно увидите в следующих разделах этого руководства по PyQt.

btn.clicked.connect(dialog)

Наконец, это пример сигналов и слотов в Qt. В приложениях на основе графического пользовательского интерфейса функции выполняются на основе действий, выполняемых пользователем, таких как наведение курсора на элемент или нажатие кнопки. Эти действия называются События. Напомним, что метод app.exec_() передает управление Qt. событие-петля. Именно для этого существует цикл событий: для прослушивания событий и выполнения ответных действий.

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

Следовательно, основной синтаксис для запуска функции слота в ответ на сигнал события выглядит следующим образом:

 widget.signal.connect(slot)

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

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

Компоненты и виджеты

В PyQt доступно большое количество виджетов для создания приложений с графическим интерфейсом. Однако в PyQt5 произошла перестановка классов в разные модули и изменения в лицензиях.

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

Структура каталогов PyQt5

Структура каталогов PyQt5

Это основные модули, используемые PythonПривязка Qt, в частности PyQt5.

  • Qt: Он объединяет все классы/модули, упомянутые ниже, в один модуль. Это значительно увеличивает память, используемую приложением. Однако управлять платформой проще, импортировав только один модуль.
  • QtCore: Содержит основные неграфические классы, используемые другими модулями. Здесь реализован цикл событий Qt, сигналы, связь со слотами и т. д.
  • QtВиджеты: Содержит большинство виджетов, доступных в Pyqt5.
  • QtGui: Содержит компоненты графического интерфейса и расширяет модуль QtCore.
  • QtNetwork: Содержит классы, используемые для реализации сетевого программирования посредством Qt. Он поддерживает TCP-серверы, TCP-сокеты, UDP-сокеты, обработку SSL, сетевые сеансы и поиск DNS.
  • QtМультимедиа обеспечивает низкоуровневую мультимедийную функциональность.
  • QtSql: реализует интеграцию баз данных для баз данных SQL. Поддерживает ODBC, MySQL, Oracle, SQLiteи PostgreSQL.

Виджеты PyQt5

Вот список наиболее часто используемых виджетов в PyQt5.

  • QLineПравить: это поле ввода, которое позволяет пользователю ввести одну строку текста.
    line = QLineEdit()
  • QRadioButton: это поле ввода с выбираемой кнопкой, аналогично переключателям в HTML.
    rad = QRadioButton("button title")
    rad.setChecked(True)  #to select the button by default.
  • QComboBox: используется для отображения раскрывающегося меню со списком доступных для выбора элементов.
    drop = QComboBox(w)
    drop.addItems(["item one", "item two", "item three"])
  • QCheckBox: Отображает выбираемое квадратное поле перед меткой, которое отмечается при выборе, аналогично переключателям.
    check = QCheckBox("button title")
  • QMenuBar: отображает горизонтальную строку меню в верхней части окна. На эту панель можно добавлять только объекты класса QMenu. Эти объекты QMenu могут дополнительно содержать строки, объекты QAction или другие объекты QMenu.
  • QToolBar: это горизонтальная полоса или панель, которую можно перемещать внутри окна. Он может содержать кнопки и другие виджеты.
  • QTab: используется для разделения содержимого окна на несколько страниц, доступ к которым можно получить через разные вкладки в верхней части виджета. Он состоит из двух разделов: панели вкладок и страницы вкладок.
  • QScrollBar: используется для создания полос прокрутки, которые позволяют пользователю прокручивать окно вверх и вниз. Он состоит из подвижного ползунка, дорожки ползунка и двух кнопок для прокрутки ползунка вверх или вниз.
    scroll = QScrollBar()
  • QSplitter: Разделители используются для разделения содержимого окна, чтобы виджеты были правильно сгруппированы и не выглядели загроможденными. QSplitter — это один из основных обработчиков макета, доступных в PyQt5, который используется для разделения содержимого как по горизонтали, так и по вертикали.
  • QDock: виджет закрепления представляет собой подокно с двумя свойствами:
  • Его можно перемещать в главном окне и
  • Его можно закрепить за пределами родительского окна в другом месте экрана.

Макеты и темы

В предыдущих примерах PyQt5 вы использовали только методы move() и resize() для установки положения виджетов в вашем графическом интерфейсе.

Однако PyQt имеет надежный механизм управления макетом, который можно использовать для создания расширенных пользовательских интерфейсов для приложений. В этом разделе вы узнаете о двух важных классах, которые используются в Qt для создания макетов и управления ими.

  1. QBoxПланировка
  2. QGridLayout

QBoxПланировка

QBoxМакет используется для выравнивания дочерних виджетов макета в горизонтальный или вертикальный ряд. Два класса интересов, которые наследуются от QBoxПланировка:

  • QHBoxМакет: используется для горизонтального расположения дочерних виджетов.
  • QVBoxМакет: используется для вертикального расположения дочерних виджетов.

Например, вот так три кнопки совмещены с QH.BoxМакет будет выглядеть.

QBoxПланировка

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    hbox = QHBoxLayout(w)

    hbox.addWidget(btn1)
    hbox.addWidget(btn2)
    hbox.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

А вот так они будут выглядеть в QVBoxМакет.

QBoxПланировка

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    vb = QVBoxLayout(w)

    vb.addWidget(btn1)
    vb.addWidget(btn2)
    vb.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

Единственная функция, которая на данном этапе нуждается в пояснении, — это метод addWidget(). Он используется для вставки виджетов в HBox или VBox макет. Он также используется в других макетах, где принимает другое количество параметров, как вы увидите в следующем разделе. Виджеты появятся внутри макета в том порядке, в котором вы их вставите.

QGridLayout

QGridLayout используется для создания интерфейсов, в которых виджеты располагаются в виде сетки (например, матрицы или 2D-массива). Чтобы вставить элементы в макет сетки, вы можете использовать матричное представление, чтобы определить количество строк и столбцов в сетке, а также положение этих элементов.

Например, чтобы создать сетку 3*3 (т. е. сетку с тремя строками и тремя столбцами), вы напишете следующий код:

Import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)

    for i in range(3):
        for j in range(3):
            grid.addWidget(QPushButton("Button"),i,j)


    w.show()
    sys.exit(app.exec_())

Это будет вывод:

QGridLayout

Метод addWidget() в макете сетки принимает следующие аргументы:

  • Объект виджета, который вы хотите добавить в сетку.
  • Координата X объекта
  • Координата Y объекта
  • Диапазон строк (по умолчанию = 0)
  • Диапазон столбцов (по умолчанию = 0)

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

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

Вот как будет выглядеть сетка:

QGridLayout

Вы также можете передать параметры rowspan и colspan в addWidget(), чтобы охватить более одной строки или столбца.

Например,

grid.addWidget(QPushButton("Button five"),2,0,1,0)

Это создаст кнопку, которая растянется на оба столбца.

QGridLayout

Темы

PyQt5 поставляется с некоторыми встроенными темами, которые вы можете использовать в своих приложениях. setStyle () Метод, вызываемый в экземпляре QApplication, используется для установки определенной темы для вашего приложения.

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

app.setStyle("Fusion")

Вот как будет выглядеть предыдущий пример в Fusion Theme

Темы

Еще одна полезная функция для оформления тем ваших приложений — метод setPalette(). Вот код для изменения цвета различных виджетов с помощью setPalette().

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPalette

if __name__ == "__main__":
    app = QApplication([])
    app.setStyle("Fusion")
    
    qp = QPalette()
    qp.setColor(QPalette.ButtonText, Qt.black)
    qp.setColor(QPalette.Window, Qt.black)
    qp.setColor(QPalette.Button, Qt.gray)
    app.setPalette(qp)

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

Вот результат.

Темы

Чтобы использовать метод setPalette(), сначала необходимо определить палитру. Это делается путем создания объекта класса QPalette.

 qp = QPalette()

Обратите внимание, что класс QPalette принадлежит модулю QtGui, и вам нужно будет его импортировать, чтобы это работало. После создания объекта QPalette используйте метод setColor(), чтобы передать имя виджета, цвет которого вы хотите изменить, и цвет, который вы хотите установить.

 qp.setColor(QPalette.Window, Qt.black)

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

app.setPalette(qp)

Это все, что вам нужно сделать, если вы хотите создать базовые темы для своего приложения. PyQt также позволяет вам использовать таблицы стилей для определения внешнего вида ваших виджетов. Если вы знакомы с CSS, вы можете легко определить расширенные стили для своего приложения с помощью таблиц стилей Qt.

Итого

  • PyQt — это привязка Python для C++ Фреймворк пользовательского интерфейса, Qt.
  • PyQt4 и PyQt5 — две основные версии, разработанные Riverbank Computing.
  • Основными модулями платформы PyQt являются:
    1. Qt
    2. QtCore
    3. QtВиджеты
    4. QtGui
    5. QtSql
    6. QtNetwork
  • PyQt поддерживает различные виджеты, такие как:
    1. Кнопки
    2. Текстовые метки
    3. Текстовые поля
    4. Радиокнопки и флажки
    5. Панели инструментов и строки меню
    6. Вебкит
    7. Tabs
    8. Доки
  • В PyQt интерактивность реализована с помощью сигналы и слоты.
  • An мероприятие — это действие, выполняемое пользователем в графическом интерфейсе (например, нажатие кнопки).
  • A сигнал вызывается соответствующим виджетом, когда на нем происходит событие.
  • A слоты — это функция, которая подключается к сигналу и выполняется при повышении сигнала.
  • PyQt имеет надежный механизм компоновки и поддерживает расширенные возможности проектирования и управления макетами. Это две часто используемые схемы компоновки в PyQt:
    1. Box Планировка
    2. Макет сетки
  • Дизайнер PyQt позволяет создавать собственные темы для приложений с графическим интерфейсом и имеет встроенную поддержку таблиц стилей.
  • Создатель Qt Python может использоваться для создания пользовательских интерфейсов, а также автономных приложений.