PyQt в Python
PyQt — это мощная библиотека Python для создания графических интерфейсов пользователя (GUI), которую можно использовать для замены встроенного в Python Tkinter.
PyQt — это привязка Python для фреймворка Qt, широко используемая при разработке настольных приложений.
Qt — это кросс-платформенный фреймворк для разработки приложений на C++.
PyQt позволяет разработчикам на Python использовать библиотеку Qt для создания мощных GUI-приложений.
PyQt имеет следующие основные версии:
- PyQt4: привязки на основе Qt4
- PyQt5: привязки на основе Qt5
- PyQt6: привязки на основе Qt6 (последняя версия)
Установка PyQt
Установите PyQt5 с помощью pip:
# 安装PyQt5 pip install PyQt5 # 安装Qt设计师和其他工具(可选) pip install PyQt5-tools
Первая программа на PyQt
Создание простого окна
Ниже приведена базовая программа на PyQt, создающая пустое окно:
Пример
# Создать экземпляр приложения
app = QApplication([])
# Создать главное окно
window = QWidget()
window.setWindowTitle("My first PyQt program")
window.setGeometry(100, 100, 400, 300) # (x, y, ширина, высота)
# Показать окно
window.show()
# Запустить приложение
app.exec_()

Объяснение кода
QApplicationУправляет потоком управления и основными настройками приложений с графическим интерфейсом.QWidgetСамый базовый класс окна, от него наследуются все компоненты интерфейса.setWindowTitle()Устанавливает заголовок окна.setGeometry()Устанавливает положение и размер окна.show()Показывает окно.app.exec_()Запускает цикл обработки событий и ожидает взаимодействия с пользователем.
Типичное приложение PyQt состоит из следующих частей:
- Объект QApplicationКаждому приложению PyQt нужен экземпляр QApplication.
- Окна и виджетыКомпоненты пользовательского интерфейса.
- Цикл обработки событийЦикл, который обрабатывает пользовательский ввод и системные события.
- Обработчики событийФункции или методы, которые реагируют на события.
Пример
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Задать заголовок и размер окна
self.setWindowTitle("Моё первое приложение PyQt")
self.setGeometry(100, 100, 400, 300) # x, y, width, height
# Создать кнопку
self.button = QPushButton("Нажми меня", self)
self.button.setGeometry(150, 150, 100, 30)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
print("Кнопка была нажата!")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Часто используемые виджеты PyQt
Кнопка (QPushButton)
Пример
button = QPushButton("Нажми меня", window)
button.move(150, 150) # Установить позицию кнопки
Метка (QLabel)
Пример
label = QLabel("Привет, PyQt!", window)
label.move(100, 100)
Текстовое поле (QLineEdit)
Пример
textbox = QLineEdit(window)
textbox.move(100, 50)
Подробнее о распространённых виджетах см.:https://www.example.com/python3/python-pyqt-widgets.html
Управление компоновкой (QVBoxLayout)
Использование менеджеров компоновки позволяет автоматически настраивать положение виджетов:
Пример
layout = QVBoxLayout()
layout.addWidget(QLabel("Имя пользователя"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Вход"))
window.setLayout(layout)
Дополнительные материалы по управлению компоновкой см. здесь:https://www.example.com/python3/python-pyqt-layout.html
Механизм сигналов и слотов
PyQt используетSignalиSlotмеханизм обработки событий.
Механизм сигналов и слотов в PyQt — это основной механизм взаимодействия между объектами.
- Сигнал: уведомление, испускаемое при возникновении определённого события.
- Слот: функция или метод, реагирующий на сигналы.
Пример
def on_button_click():
print("Кнопка была нажата!")
button = QPushButton("Нажми меня", window)
button.clicked.connect(on_button_click) # Подключение сигнала и слота
Пользовательские сигналы
Пример
class MyEmitter(QObject):
my_signal = pyqtSignal(str) # Определение сигнала
emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Получен сигнал: {x}"))
emitter.my_signal.emit("Привет") # Отправить сигнал
Дополнительные материалы по управлению компоновкой см.:https://www.example.com/python3/python-pyqt-signals-and-slots.html
Использование Qt Designer
Qt Designer — это инструмент визуального проектирования, который позволяет перетаскивать виджеты для создания интерфейсов:
- Запустите Designer (обычно находится в каталоге Lib\site-packages\qt5_applications\Qt\bin вашей установки Python)
- Создайте интерфейс и сохраните его как.uiфайл
будет.uiПреобразовать файл в код Python:
pyuic5 input.ui -o output.py
Используйте сгенерированный интерфейс в коде:
Пример
# Загрузить файл интерфейса
Form, Window = uic.loadUiType("output.ui")
# Использовать интерфейс
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())
Практика: простое приложение «Блокнот»
Дизайн интерфейса
Пример
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QAction, QFileDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.create_actions()
self.create_menus()
self.setWindowTitle('Простой блокнот')
self.setGeometry(100, 100, 800, 600)
def create_actions(self):
# Действия меню «Файл»
self.new_action = QAction('Создать', self)
self.new_action.setShortcut('Ctrl+N')
self.new_action.triggered.connect(self.new_file)
self.open_action = QAction('Открыть', self)
self.open_action.setShortcut('Ctrl+O')
self.open_action.triggered.connect(self.open_file)
self.save_action = QAction('Сохранить', self)
self.save_action.setShortcut('Ctrl+S')
self.save_action.triggered.connect(self.save_file)
self.exit_action = QAction('Выход', self)
self.exit_action.setShortcut('Ctrl+Q')
self.exit_action.triggered.connect(self.close)
# Действия меню «Правка»
self.copy_action = QAction('Копировать', self)
self.copy_action.setShortcut('Ctrl+C')
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action = QAction('Вставить', self)
self.paste_action.setShortcut('Ctrl+V')
self.paste_action.triggered.connect(self.text_edit.paste)
self.cut_action = QAction('Вырезать', self)
self.cut_action.setShortcut('Ctrl+X')
self.cut_action.triggered.connect(self.text_edit.cut)
def create_menus(self):
menubar = self.menuBar()
# Меню «Файл»
file_menu = menubar.addMenu('Файл')
file_menu.addAction(self.new_action)
file_menu.addAction(self.open_action)
file_menu.addAction(self.save_action)
file_menu.addSeparator()
file_menu.addAction(self.exit_action)
# Меню правки
edit_menu = menubar.addMenu('Правка')
edit_menu.addAction(self.copy_action)
edit_menu.addAction(self.paste_action)
edit_menu.addAction(self.cut_action)
def new_file(self):
self.text_edit.clear()
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, 'Открыть файл')
if filename:
try:
with open(filename, 'r') as f:
self.text_edit.setText(f.read())
except Exception as e:
QMessageBox.warning(self, 'Ошибка', f'Не удалось открыть файл: {e}')
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, 'Сохранить файл')
if filename:
try:
with open(filename, 'w') as f:
f.write(self.text_edit.toPlainText())
except Exception as e:
QMessageBox.warning(self, 'Ошибка', f'Не удалось сохранить файл: {e}')
if __name__ == '__main__':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec_())

Основные виджеты PyQt5
Большинство виджетов находятся в PyQt5.QtWidgets.
Дополнительные функции (такие как мультимедиа, сеть) могут требовать других модулей (например, QtCore, QtGui, QtNetwork и т. д.).
QListView/QTableView/QTreeView необходимо использовать с моделью данных (например, QStandardItemModel) для большей гибкости.
Другие расширения установки:
pip install PyQtWebEngine # 网页支持 pip install PyQtChart # 图表支持
| Категория виджета | Название виджета | Модуль | Описание |
|---|---|---|---|
| Базовые оконные виджеты | QWidget | QtWidgets | Базовый класс для всех объектов пользовательского интерфейса, может использоваться как пустое окно или контейнер. |
QMainWindow | QtWidgets | Каркас главного окна, содержащий строку меню, панель инструментов, строку состояния и т. д. | |
QDialog | QtWidgets | Базовый класс для диалогов, используется для всплывающих окон. | |
| Управление компоновкой | QVBoxLayout | QtWidgets | Вертикальный менеджер компоновки |
QHBoxLayout | QtWidgets | Менеджер горизонтальной компоновки | |
QGridLayout | QtWidgets | Менеджер сеточной компоновки | |
QFormLayout | QtWidgets | Менеджер компоновки формы (пары «метка + поле ввода») | |
| Классы кнопок | QPushButton | QtWidgets | Обычная кнопка |
QRadioButton | QtWidgets | Радиокнопка | |
QCheckBox | QtWidgets | Флажок | |
QToolButton | QtWidgets | Кнопка панели инструментов (может иметь значок) | |
| Виджеты ввода | QLineEdit | QtWidgets | Однострочное поле ввода текста |
QTextEdit | QtWidgets | Многострочный редактор форматированного текста (поддерживает HTML) | |
QPlainTextEdit | QtWidgets | Многострочный редактор простого текста | |
QSpinBox | QtWidgets | Счётчик (целое число) | |
QDoubleSpinBox | QtWidgets | Счётчик (число с плавающей запятой) | |
QComboBox | QtWidgets | Выпадающий список | |
QDateEdit | QtWidgets | Поле выбора даты | |
QTimeEdit | QtWidgets | Поле выбора времени | |
QDateTimeEdit | QtWidgets | Поле выбора даты и времени | |
QSlider | QtWidgets | Ползунок (горизонтальный/вертикальный) | |
QDial | QtWidgets | Круглая ручка управления | |
| Виджеты отображения | QLabel | QtWidgets | Текстовая/графическая метка |
QLCDNumber | QtWidgets | Цифровой ЖК-дисплей | |
QProgressBar | QtWidgets | Индикатор выполнения | |
QStatusBar | QtWidgets | Строка состояния (обычно используется дляQMainWindow) | |
| Классы контейнеров | QGroupBox | QtWidgets | Групповой блок (контейнер с заголовком) |
QTabWidget | QtWidgets | Контейнер вкладок | |
QStackedWidget | QtWidgets | Стековый контейнер (отображает один дочерний виджет за раз) | |
QScrollArea | QtWidgets | Контейнер области прокрутки | |
QMdiArea | QtWidgets | Область MDI (интерфейс нескольких документов) | |
| Список/Таблица/Дерево | QListWidget | QtWidgets | Элемент управления списком (с управлением элементами) |
QTreeWidget | QtWidgets | Виджет дерева | |
QTableWidget | QtWidgets | Виджет таблицы | |
QListView | QtWidgets | Представление списка (требуется модель данных) | |
QTableView | QtWidgets | Представление таблицы (требуется модель данных) | |
QTreeView | QtWidgets | Представление дерева (требуется модель данных) | |
| Меню/Панель инструментов | QMenuBar | QtWidgets | Строка меню |
QMenu | QtWidgets | Меню (может содержать подменю и действия) | |
QToolBar | QtWidgets | Панель инструментов | |
QAction | QtWidgets | Действие (используется для пунктов меню, кнопок панели инструментов и т. д.) | |
| Диалог | QFileDialog | QtWidgets | Диалог выбора файла |
QColorDialog | QtWidgets | Диалог выбора цвета | |
QFontDialog | QtWidgets | Диалог выбора шрифта | |
QInputDialog | QtWidgets | Диалог ввода (текст, числа и т. д.) | |
QMessageBox | QtWidgets | Окно сообщения (предупреждение, ошибка, вопрос и т. д.) | |
| Графическое представление | QGraphicsView | QtWidgets | Graphics View Framework (для 2D-графики) |
QGraphicsScene | QtWidgets | Графическая сцена (для совместногоQGraphicsViewиспользования) | |
| Другие функциональные компоненты | QCalendarWidget | QtWidgets | Виджет календаря |
QSplashScreen | QtWidgets | Экран-заставка | |
QSystemTrayIcon | QtWidgets | Значок в системном трее | |
QWebEngineView | QtWebEngineWidgets | Компонент веб-браузера (требуется отдельная установкаPyQtWebEngine) |