Учебное пособие по PyQt5 с примерами: Создание Python Графический пользовательский интерфейс с использованием Qt
⚡ Умное резюме
PyQt — это Python Привязка для кроссплатформенного набора виджетов Qt, позволяющая разработчикам создавать нативные графические интерфейсы для настольных приложений. Она включает в себя более шестисот таких оберток. C++ классы, охватывающие окна, кнопки, макеты, сигналы, слоты и темы для Windows, macOS, и Linux.

В разделах ниже вы найдете информацию об основах PyQt, установке, основных виджетах, макетах и темах, а также примеры их работы.
Что такое PyQt?
PyQt - это Python привязка набора инструментов для виджетов с открытым исходным кодом Qt, который также функционирует как среда разработки кросс-платформенных приложений. Qt — популярный C++ Фреймворк для написания графических приложений для всех основных настольных, мобильных и встроенных платформ (поддерживает Linux). Windows, macOS, 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 не обратно совместим с устаревшими модулями более старой версии. В этом руководстве по графическому интерфейсу пользователя PyQt для демонстрации примеров будет использоваться PyQt5. Помимо этих двух версий, Riverbank Computing также предоставляет PyQt3D — Python привязки для фреймворка Qt3D. Qt3D — это прикладная среда, используемая для создания систем моделирования в реальном времени с 2D/3D-рендерингом.
Как установить PyQt5
В этом руководстве по PyQt5 мы увидим два способа установки PyQt:
- Использование файлов Wheel
- Сборка и установка из исходного кода
Qt (произносится как «кьют») — сложная система, а кодовая база PyQt содержит скомпилированные C++ и Python код под капотом. В результате его сборка и установка из исходного кода является более сложным процессом по сравнению с другими Python библиотеки. Однако вы можете легко установить PyQt5 с помощью колес.
Установка с колесами
Колеса — новый стандарт Python Формат упаковки и распространения. Проще говоря, колесо — это ZIP-архив со специальным именем и .Whl расширение файла. Колеса можно установить с помощью пипа (Pythonменеджер пакетов), который включен по умолчанию в последние версии Python.
Итак, если у вас есть Python 3.4 или более поздняя версия установлена, у вас уже есть pip. Если же вы используете более старую версию PythonДля продолжения необходимо загрузить и установить pip. Инструкции можно найти по этой ссылке: https://pypi.org/project/pip/.
Для установки pyQt5:
Шаг 1) Откройте командную строку.
Откройте командную строку или PowerShell в своем Windows машина.
Шаг 2) Введите следующее.
pip install PyQt5
Шаг 3) Установка прошла успешно.
На этом этапе этого руководства по PyQt5 вы загрузите пакет PyQt5 whl (около 50 МБ) и установите его в вашей системе.
Кроме того, вы также можете скачать Windows двоичный файл для версии Python установленных на вашем компьютере.
После завершения перейдите к следующему разделу этого руководства по PyQt5, чтобы написать свое первое приложение с графическим интерфейсом.
Базовый PyQt Concepts и программы
Теперь, когда вы успешно установили PyQt5 на свой компьютер, вы готовы писать код. Python Приложения с графическим интерфейсом пользователя.
Начнём с простого приложения в этом уроке по PyQt5, которое будет отображать пустое окно на вашем экране.
Зажгите свой Python 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 давайте подробно рассмотрим, что делает каждая строка вашей программы.
from PyQt5.QtWidgets import QApplication, QWidget
Этот оператор импортирует все модули, необходимые для создания графического интерфейса, в текущее пространство имен. Модуль QtWidgets содержит все основные виджеты, которые вы будете использовать в этом уроке. Python Учебник по Qt.
app = QApplication(sys.argv)
Здесь вы создаете объект класса QApplication. Этот шаг необходим для PyQt5; каждое приложение пользовательского интерфейса должно создать экземпляр QApplication как своего рода точку входа в приложение. Если вы его не создадите, будут показаны ошибки.
sys.argv — это список параметров командной строки, которые вы можете передать приложению при его запуске через оболочку или при автоматизации интерфейса.
В этом примере на PyQt5 вы не передавали никаких аргументов в QApplication. Поэтому вы можете заменить его приведенным ниже кодом, и вам даже не придется импортировать модуль 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, который завершит работу приложения только тогда, когда пользователь закроет его из графического интерфейса. Именно поэтому сочетание клавиш 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 Откроется новое окно с текстом и кнопкой, как показано ниже.
- После того, как вы нажмете кнопку в первом окне, откроется новое окно сообщения с написанным вами текстом.
- Теперь вы можете нажать кнопку «Скрыть детали/Показать детали», чтобы переключить видимость дополнительного текста.
Как видите, поскольку мы не задали заголовок окна в диалоговом окне, был предоставлен заголовок по умолчанию. 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
Это основные модули, используемые 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Он используется для создания полос прокрутки, позволяющих пользователю прокручивать окно вверх и вниз. Он состоит из подвижного ползунка и ползунка. track, а также две кнопки для прокрутки ползунка вверх или вниз.
scroll = QScrollBar()
- QSplitter: Разделители используются для разделения содержимого окна, чтобы виджеты были правильно сгруппированы и не выглядели загроможденными. QSplitter — это один из основных обработчиков макета, доступных в PyQt5, который используется для разделения содержимого как по горизонтали, так и по вертикали.
- QDockВиджет-докачка — это дочернее окно с двумя свойствами: его можно перемещать внутри основного окна и закреплять за пределами родительского окна в другом месте на экране.
Макеты и темы
В предыдущих примерах PyQt5 вы использовали только методы move() и resize() для установки положения виджетов в вашем графическом интерфейсе.
Однако PyQt имеет надежный механизм управления макетом, который можно использовать для создания расширенных пользовательских интерфейсов для приложений. В этом разделе вы узнаете о двух важных классах, которые используются в Qt для создания макетов и управления ими.
- QBoxПланировка
- QGridLayout
QBoxПланировка
QBoxМакет используется для выравнивания дочерних виджетов макета в горизонтальный или вертикальный ряд. Два класса интересов, которые наследуются от QBoxПланировка:
- QHBoxМакет: используется для горизонтального расположения дочерних виджетов.
- QVBoxМакет: используется для вертикального расположения дочерних виджетов.
Например, вот так три кнопки совмещены с QH.BoxМакет будет выглядеть.
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Макет.
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_())
Это будет вывод:
Метод addWidget() в компоненте GridLayout принимает следующие аргументы:
- Объект виджета, который вы хотите добавить в сетку.
- Координата X объекта
- Координата Y объекта
- Параметр row-span (по умолчанию = 0)
- Параметр col-span (по умолчанию = 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_())
Вот как будет выглядеть сетка:
Вы также можете передать параметры rowspan и colspan в addWidget(), чтобы охватить более одной строки или столбца.
Например,
grid.addWidget(QPushButton("Button five"),2,0,1,0)
Это создаст кнопку, которая растянется на оба столбца.
Темы
PyQt5 поставляется с некоторыми встроенными темами, которые вы можете использовать в своих приложениях. setStyle () Метод, вызываемый в экземпляре QApplication, используется для установки определенной темы для вашего приложения.
Например, добавление следующей строки кода изменит тему вашего приложения со стандартной на тему Fusion.
app.setStyle("Fusion")
Вот как будет выглядеть предыдущий пример в теме Fusion.
Ещё одна полезная функция для оформления ваших приложений — метод 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.












