Навчальний посібник із PyQt5 із прикладами: проектування графічного інтерфейсу за допомогою PyQt Python
Що таке 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 framework 4.x і 5.x, тоді як PyQt5 забезпечує зв’язування лише для версій 5.x. Як наслідок, PyQt5 не сумісний із застарілими модулями старішої версії. У цьому підручнику з графічним інтерфейсом Qt 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 Програми для проектування GUI.
Давайте почнемо з простої програми в цьому підручнику 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 давайте детально розглянемо, що робить кожен із рядків вашої програми.
from PyQt5.QtWidgets import QApplication, QWidget
Цей оператор імпортує всі модулі, необхідні для створення GUI, у поточний простір імен. Модуль 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)
Метод зміни розміру класу 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 і 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 сигналізувати викликається 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: використовується для створення смуг прокручування, які дозволяють користувачеві прокручувати вікно вгору та вниз. Він складається з рухомого повзунка, доріжки повзунка та двох кнопок для прокручування повзунка вгору або вниз.
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 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 є:
- Qt
- QtCore
- QtWidgets
- QtGui
- QtSql
- QtNetwork
- PyQt підтримує різні віджети, наприклад:
- Кнопки
- Текстові мітки
- Текстові поля
- Перемикачі та прапорці
- Панелі інструментів і панелі меню
- Вебкіт
- Tabs
- Доки
- У PyQt інтерактивність реалізована за допомогою сигнали та слоти.
- An подія це дія, яку виконує користувач у GUI (наприклад, натискання кнопки).
- A сигналізувати викликається відповідним віджетом, коли на ньому відбувається подія.
- A слот це функція, яка пов’язана з сигналом і виконується, коли сигнал піднято.
- PyQt має надійний механізм макета та підтримує розширений дизайн та керування макетом. Це дві схеми компонування, які часто використовуються в PyQt:
- Box макет
- Сітка макету
- Дизайнер PyQt дозволяє створювати власні теми для програм із графічним інтерфейсом і має вбудовану підтримку таблиць стилів.
- qtcreator Python можна використовувати для створення інтерфейсів користувача, а також автономних програм.