Підручник з 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
- мереж
Ці функції можна поєднувати для створення розширених інтерфейсів користувача, а також окремих програм. Багато великих компаній у всіх галузях використовують 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-архів зі спеціальною назвою та .кружляти розширення файлу. Колеса можна встановити за допомогою pip (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 МБ) і встановить його у вашій системі.
Крім того, ви також можете завантажити a 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
Цей оператор імпортує всі модулі, необхідні для створення GUI, у поточний простір імен. Модуль 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)
Метод зміни розміру класу QWidget дозволяє встановити розміри будь-якого віджета. У цьому випадку ви змінили розмір вікна до 300 на 300 пікселів.
Тут слід пам'ятати, що віджети можуть бути вкладені один в одного; найзовніший віджет (тобто віджет без батьківського елемента) називається вікном (Window).
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 і 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_()
Тут ви визначили метод під назвою dialog, який створює віджет вікна повідомлень і встановлює деякий текст для кнопок та інших полів.
Метод діалогу викликається з головного блоку програми, коли натиснуто кнопку в певному віджеті (у цьому випадку btn 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, ви передаєте об’єкт window (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 викликає a сигналізувати. Ці сигнали можна підключати до Python Функції (як у діалоговій функції в цьому прикладі), щоб функція виконувалася, коли спрацьовує сигнал. Ці функції називаються ігрові автомати мовою Qt.
Згодом, основний синтаксис для запуску функції слота у відповідь на сигнал від події виглядає наступним чином:
widget.signal.connect(slot)
Це означає, що щоразу, коли сигналізувати викликається a віджет, підключений слот функція буде виконана. Підсумовуючи, сигнали та слоти використовуються Qt для зв’язку між об’єктами та полегшення повторного використання компонентів та інтерактивності.
Тепер, коли ви знаєте, як вкладати віджети та реалізовувати взаємодії за допомогою сигналів і слотів, ось список корисних віджетів та інших класів, які ви можете використовувати у своїх програмах PyQt.
Компоненти та віджети
У PyQt доступна велика кількість віджетів для створення програм графічного інтерфейсу користувача. Однак у PyQt5 відбулося перетасування класів у різні модулі та зміни в ліцензіях.
Тому вкрай важливо мати загальне уявлення про структуру PyQt5. У цьому розділі ви побачите, як PyQt5 організований внутрішньо, та дізнаєтеся про різні модулі, бібліотеки та класи API, що надаються PyQt5.
Структура каталогу PyQt5
Це основні модулі, які використовує Pythonзв'язування Qt, зокрема PyQt5.
- QtВін об'єднує всі класи/модулі, згадані нижче, в один модуль. Це значно збільшує обсяг пам'яті, що використовується застосунком. Однак, керувати фреймворком легше, імпортуючи лише один модуль.
- QtCore: Містить основні неграфічні класи, які використовуються іншими модулями. Тут реалізовано цикл подій Qt, сигнали, з’єднання слотів тощо.
- QtWidgetsМістить більшість віджетів, доступних у PyQt5.
- QtGui: Містить компоненти GUI та розширює модуль QtCore.
- QtNetwork: Містить класи, які використовуються для реалізації мережевого програмування через Qt. Він підтримує сервери TCP, сокети TCP, сокети UDP, обробку SSL, мережеві сеанси та пошук DNS.
- QtMultimedia: забезпечує низькорівневу мультимедійну функціональність.
- QtSql: реалізує інтеграцію бази даних для баз даних SQL. Підтримує ODBC, MySQL, Oracle, SQLite та PostgreSQL.
Віджети PyQt5
Ось список найчастіше використовуваних віджетів у PyQt5:
- QLineEdit: Це поле введення, яке дозволяє користувачеві ввести один рядок тексту.
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() для встановлення позицій віджетів у вашому GUI.
Однак PyQt має надійний механізм керування макетом, який можна використовувати для створення розширених інтерфейсів користувача для програм. У цьому розділі ви дізнаєтесь про два важливі класи, які використовуються в Qt для створення та керування макетами.
- QBoxмакет
- QGridLayout
QBoxмакет
QBoxМакет використовується для вирівнювання дочірніх віджетів макета в горизонтальному або вертикальному рядку. Два класи інтересів, що успадковують QBoxМакет:
- QHBoxМакет: використовується для горизонтального вирівнювання дочірніх віджетів.
- QVBoxМакет: використовується для вертикальної лінії дочірніх віджетів.
Наприклад, ось як три кнопки вирівняні з QHBoxМакет буде виглядати.
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_())
А так вони виглядатимуть у КВBoxLayout.
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 або ВBox макет. Він також використовується в інших макетах, де він приймає іншу кількість параметрів, як ви побачите в наступному розділі. Віджети відображатимуться всередині макета в тому порядку, у якому ви їх вставите.
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() у сітковому макеті приймає такі аргументи:
- Об’єкт віджета, який потрібно додати до сітки
- Координата х об'єкта
- 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_())
Ось так буде виглядати сітка:
Ви також можете передати параметри rowspan і colspan в addWidget(), щоб охопити більше ніж один рядок або стовпець.
Наприклад,
grid.addWidget(QPushButton("Button five"),2,0,1,0)
Це створить кнопку, яка розтягується на обидва стовпці.
теми
PyQt5 постачається з деякими вбудованими темами, які можна використовувати у своїх програмах. The 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.












