PyQt5#

PyQt5 — это один из самых популярных фреймворков для создания графических интерфейсов (GUI) на языке Python. Он предоставляет мощные инструменты для создания десктопных приложений в ALSE.

Основные пакеты

Пакет

Версия

Репозиторий

Описание

python3-pqt5

5.15.9+dfsg-1+b1

installation

Библиотека PyQt5

Дополнительные пакеты

Пакет

Версия

Репозиторий

Описание

qtcreator

7.0.2-2astra2

extended

IDE для разработки Qt, в состав входит Qt Designer

python3-sqlalchemy

1.4.46+ds1-1+b2

installation

Библиотека абстракции базы данных (ORM)

python3-psycopg2

2.9.5+b2

installation

Адаптер базы данных PostgreSQL

Примечание

В репозиториях большая часть пакетов, относящихся к PyQt5, имеют вид python3-pyqt5…

Установка PyQt5#

Пункт 1#

  • перед началом разработки необходимо установить PyQt5 и необходимые зависимости:

sudo apt install python3-pyqt5

Установка инструментов разработки:#

Пункт 1#

  • для разработки может необходимо установить qtqreator, которые включают в себя Qt Designer и другие утилиты:

sudo apt install qtcreator

Использование Qt Designer#

Qt Designer — это графический инструмент для создания интерфейсов пользователя. Вы можете использовать его для создания .ui файлов, которые затем можно загрузить в ваше приложение на PyQt5.

Пункт 1#

Запуск Qt Designer:

  • вы можете запустить Qt Designer следующей командой:

designer

Пункт 2#

Создание интерфейса:

  • в Qt Designer вы можете создавать интерфейсы, перетаскивая виджеты на форму. Сохраните ваш интерфейс в файл с расширением .ui, или конвертировать в файл с расширением .py и наследовать в приложении

Создание приложения на PyQt5 без использования Qt Designer#

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

  • сохраните этот код в файл example.py:

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

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # Создаем кнопку
        self.button = QPushButton('Нажми меня', self)
        self.button.clicked.connect(self.on_button_clicked)

        # Создаем вертикальный layout и добавляем кнопку
        layout = QVBoxLayout()
        layout.addWidget(self.button)

        # Устанавливаем layout для основного окна
        self.setLayout(layout)

        # Настройки окна
        self.setWindowTitle('PyQt5 Пример')
        self.setGeometry(300, 300, 300, 200)

    def on_button_clicked(self):
        # Показываем сообщение при нажатии кнопки
        QMessageBox.information(self, 'Сообщение', 'Вы нажали кнопку!')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    ex.show()
    sys.exit(app.exec_())
  • запустите файл:

python3 example.py

Вы увидите окно с кнопкой. При нажатии на кнопку появится сообщение.

Создание приложения на PyQt5 с использованием Qt Designer вариант 1#

Загрузка .ui файла в приложение: Вы можете загрузить .ui файл в ваше приложение с помощью uic модуля:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('my_ui_file.ui', self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    ex.show()
    sys.exit(app.exec_())

Создание приложения на PyQt5 с использованием Qt Designer вариант 2#

Преобразование .ui файла в Python-код и наследование в приложении

Пункт 1#

Создание .ui файла в Qt Designer

  • откройте Qt Designer и создайте интерфейс. Например, добавьте кнопку (QPushButton) и метку (QLabel).

  • сохраните интерфейс в файл, например, main_window.ui.

Пункт 2#

Преобразование .ui файла в Python-код

  • для использования .ui файла в PyQt5 его нужно преобразовать в Python-код, это можно сделать с помощью утилиты uic:

uic main_window.ui -o ui_main_window.py

Эта команда создаст файл ui_main_window.py, который содержит класс, описывающий интерфейс.

Пункт 3#

Наследование класса UI

  • теперь создадим основной класс приложения, который будет наследовать сгенерированный класс UI, пример структуры проекта:

project/
│
├── main.py              # Основной файл приложения
├── main_window.ui       # Файл интерфейса
└── ui_main_window.py    # Сгенерированный файл из .ui

Содержимое ui_main_window.py (пример):

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(150, 100, 100, 30))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(150, 150, 100, 30))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Click Me"))
        self.label.setText(_translate("MainWindow", "Hello"))

Основной класс приложения (main.py):

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from ui_main_window import Ui_MainWindow  # Импортируем сгенерированный класс

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)  # Настраиваем интерфейс

        # Добавляем логику
        self.pushButton.clicked.connect(self.on_button_clicked)

    def on_button_clicked(self):
        self.label.setText("Button clicked!")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

Пункт 4#

Объяснение кода

Импорт сгенерированного класса: Мы импортируем класс Ui_MainWindow из файла ui_main_window.py.

Наследование: Класс MainWindow наследует QMainWindow (базовый класс для главного окна) и Ui_MainWindow (класс с интерфейсом).

Инициализация интерфейса: В конструкторе вызывается метод setupUi(self), который настраивает интерфейс, созданный в Qt Designer.

Добавление логики: Мы добавляем обработчик события для кнопки (self.pushButton.clicked.connect), который изменяет текст метки.

Сборка и упаковка#

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

  • Debian Package (.deb): Создание пакета для Debian. Используйте dpkg и dh_make для создания пакета.

  • PyInstaller: Инструмент для упаковки Python приложений в исполняемые файлы.