Создание графического интерфейса на Python с PyQt: с чего начать
Для кого эта статья:
- Новички в программировании, заинтересованные в разработке приложений с графическим интерфейсом
- Python-разработчики, желающие расширить свои навыки и узнать о PyQt
Студенты и ученики, обучающиеся программированию и заинтересованные в практическом применении своих знаний
Разработка приложений с графическим интерфейсом часто кажется новичкам чем-то недостижимым и сложным. Я помню, как сам долго откладывал изучение GUI-фреймворков, считая, что для этого нужны какие-то особые навыки. Но оказалось, что создать своё первое приложение с окнами, кнопками и полями ввода можно буквально за пару часов! PyQt открывает удивительные возможности для Python-разработчиков — от простых утилит до профессиональных программных комплексов. Давайте разберемся, как сделать первые шаги в этом увлекательном мире. 🚀
Хотите за короткий срок освоить не только создание приложений с PyQt, но и стать востребованным Python-разработчиком? Обучение Python-разработке от Skypro — это структурированный путь от основ до продвинутых техник. Курс включает практические проекты по разработке реальных приложений, с которыми вы сможете пополнить портфолио и начать карьеру уже через несколько месяцев. Наставники-практики помогут избежать типичных ошибок и быстрее достичь профессионального уровня!
Что такое PyQt и зачем он нужен разработчикам Python
PyQt — это набор Python-привязок к фреймворку Qt, одному из самых мощных инструментов для создания кроссплатформенных приложений с графическим интерфейсом. Если вы когда-либо использовали такие программы как Skype, VLC Media Player или Autodesk Maya, то вы уже знакомы с приложениями, созданными с помощью Qt.
PyQt позволяет разработчикам Python создавать нативно выглядящие приложения для Windows, macOS, Linux и даже мобильных платформ, используя знакомый и простой синтаксис Python вместо более сложного C++.
Михаил Сергеев, технический руководитель проектов
Когда я начинал работать над внутренним инструментом для анализа данных, меня поставили перед выбором: делать веб-интерфейс или нативное приложение. Команда состояла из Python-разработчиков, и времени на изучение новых технологий почти не было. PyQt стал спасением — уже через неделю у нас был рабочий прототип с графиками, таблицами и даже экспортом в Excel.
Критическим моментом был выбор версии — PyQt5 или PySide2. Мы выбрали PyQt5 из-за более стабильной документации на тот момент. Весь проект занял около трех месяцев вместо планируемых шести, а клиенты до сих пор используют это приложение, даже не подозревая, что оно написано на Python.
Основные преимущества PyQt:
- Кроссплатформенность — код работает на всех основных операционных системах без изменений
- Широкий набор виджетов — от простых кнопок до сложных таблиц и графиков
- Встроенная поддержка паттерна "Модель-Представление"
- Система сигналов и слотов для обработки событий
- Возможность создания как классических, так и современных интерфейсов
Для разработчиков Python PyQt открывает возможность выйти за пределы консольных приложений и создавать полноценные программы, которыми смогут пользоваться обычные люди. Это особенно важно, если вы хотите создавать мобильное приложение на Python или пишете приложение для Андроид на Python.
| Сценарий использования | Преимущества PyQt | Альтернативы |
|---|---|---|
| Небольшие утилиты | Быстрая разработка, нативный внешний вид | Tkinter (проще, но менее функциональный) |
| Научные приложения | Интеграция с NumPy/Matplotlib, виджеты для визуализации | PyQtGraph (специализированный, но требует PyQt) |
| Бизнес-приложения | Готовые компоненты для форм, таблиц и отчетов | Веб-интерфейс (требует знания HTML/CSS/JS) |
| Мобильные приложения | Базовая поддержка через Qt for Mobile | Kivy (лучше для мобильных, хуже для десктопа) |

Установка и настройка PyQt для разных платформ
Прежде чем погрузиться в разработку, необходимо правильно настроить рабочее окружение. PyQt доступен в двух основных версиях: PyQt5 и PyQt6. Для начинающих рекомендую использовать PyQt5, так как он более стабилен и имеет более обширную документацию и примеры.
Установка PyQt5 через pip — самый простой способ начать:
pip install PyQt5
Для разработки интерфейсов вам также пригодится Qt Designer — визуальный редактор, который позволяет создавать формы без написания кода:
pip install pyqt5-tools
После установки вы можете запустить Qt Designer:
- В Windows: находится в папке
Lib\site-packages\pyqt5_tools\Qt\binвнутри вашего окружения Python - В Linux: после установки через apt (
sudo apt-get install qttools5-dev-tools) запускается командойdesigner - В macOS: лучше всего установить через Homebrew:
brew install qt && brew install pyqt
Для тех, кто предпочитает работать в виртуальном окружении (что рекомендуется для изоляции зависимостей), последовательность действий будет такой:
# Создание виртуального окружения
python -m venv pyqt_env
# Активация окружения
# Windows:
pyqt_env\Scripts\activate
# Linux/macOS:
source pyqt_env/bin/activate
# Установка PyQt5
pip install PyQt5
| Платформа | Основной метод установки | Типичные проблемы | Решение |
|---|---|---|---|
| Windows | pip install PyQt5 | Отсутствие компилятора C++ | Использовать предкомпилированные колеса (wheel) |
| macOS | brew install python pyqt | Конфликты с системным Python | Использовать pyenv + pip в виртуальном окружении |
| Linux (Ubuntu/Debian) | sudo apt install python3-pyqt5 | Устаревшие версии в репозиториях | pip install --user PyQt5 |
| Raspberry Pi | sudo apt install python3-pyqt5 | Ограничения производительности | Использовать облегченные виджеты |
Для проверки корректности установки создайте простой скрипт:
import sys
from PyQt5.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel("PyQt5 успешно установлен!")
label.show()
sys.exit(app.exec_())
Если вы видите окно с текстом, значит установка прошла успешно! 🎉
Создание первого окна приложения: базовые компоненты
Теперь, когда все необходимые инструменты установлены, давайте создадим наше первое приложение с графическим интерфейсом. Начнем с самого простого — окна с заголовком.
Каждое PyQt-приложение следует определенной структуре:
- Импорт необходимых модулей
- Создание экземпляра QApplication (основа любого PyQt-приложения)
- Создание виджетов (окон, кнопок и т.д.)
- Показ виджетов на экране
- Запуск основного цикла событий приложения
Вот как выглядит минимальное приложение:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'Моё первое PyQt приложение'
self.left = 100
self.top = 100
self.width = 400
self.height = 300
self.initUI()
def initUI(self):
# Устанавливаем заголовок, положение и размер окна
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# Показываем окно
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
Этот код создает простое окно приложения с заданными размерами и заголовком. Здесь использованы несколько базовых компонентов PyQt:
- QApplication — основной класс приложения, управляющий потоком управления и основными настройками
- QWidget — базовый класс для всех объектов пользовательского интерфейса
- setGeometry() — метод для установки положения и размеров окна
- show() — метод для отображения виджета на экране
- exec_() — запуск главного цикла событий, который обрабатывает все действия пользователя
Метод initUI() — это распространенная практика в PyQt, которая позволяет отделить логику инициализации интерфейса от остального кода. Это делает код более читаемым и поддерживаемым, особенно когда приложение становится сложнее.
Для тех, кто хочет как можно быстрее создать приложение на Python для Android, стоит отметить, что PyQt может быть использован и для мобильной разработки через дополнительные инструменты, хотя для серьезных проектов обычно применяются специализированные решения.
Анна Волкова, преподаватель программирования
Я регулярно провожу мастер-классы для старшеклассников, и GUI-приложения всегда вызывают наибольший интерес. Когда ученики видят, что их код превращается в настоящее окно с кнопками — это магический момент!
Однажды на занятии у нас возникла проблема: Windows и macOS показывали совершенно разные интерфейсы. Оказалось, что мы забыли указать стиль. Добавив всего одну строку:
app.setStyle('Fusion'), мы получили единообразный вид на всех платформах. Это стало отличным уроком о кроссплатформенной разработке.Кстати, именно на таких практических примерах студенты лучше всего понимают концепцию ООП — они видят, что классы и наследование действительно упрощают работу, а не просто являются теоретической абстракцией.
Добавление интерактивных элементов: кнопки и текстовые поля
Пустое окно — это только начало. Давайте добавим в наше приложение интерактивные элементы: кнопку и текстовое поле. Здесь в игру вступает одно из самых мощных преимуществ PyQt — система сигналов и слотов, которая позволяет компонентам взаимодействовать друг с другом.
Расширим наш предыдущий пример:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QVBoxLayout, QLabel
from PyQt5.QtCore import pyqtSlot
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'Интерактивное приложение PyQt'
self.left = 100
self.top = 100
self.width = 400
self.height = 200
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# Создаем вертикальную разметку для организации элементов
layout = QVBoxLayout()
# Добавляем текстовую метку
self.label = QLabel('Введите ваше имя:')
layout.addWidget(self.label)
# Добавляем текстовое поле
self.textbox = QLineEdit()
layout.addWidget(self.textbox)
# Добавляем кнопку
self.button = QPushButton('Нажми меня!')
self.button.clicked.connect(self.on_button_click)
layout.addWidget(self.button)
# Добавляем еще одну метку для вывода результата
self.result_label = QLabel('')
layout.addWidget(self.result_label)
# Устанавливаем разметку для окна
self.setLayout(layout)
# Показываем окно
self.show()
@pyqtSlot()
def on_button_click(self):
name = self.textbox.text()
if name:
self.result_label.setText(f'Привет, {name}! Рад познакомиться!')
else:
self.result_label.setText('Пожалуйста, введите ваше имя')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
В этом примере мы добавили несколько новых элементов и концепций:
- QVBoxLayout — менеджер вертикальной компоновки, который автоматически размещает виджеты один под другим
- QLabel — виджет для отображения текста
- QLineEdit — текстовое поле для ввода пользовательских данных
- QPushButton — кнопка, которую можно нажимать
- Сигналы и слоты — метод
connect()связывает сигналclickedкнопки со слотомon_button_click
Когда пользователь нажимает на кнопку, срабатывает сигнал clicked, который вызывает наш метод on_button_click(). Этот метод получает текст из текстового поля и обновляет текст в нижней метке.
Система сигналов и слотов — это основа взаимодействия в PyQt. Она позволяет разделить интерфейс и бизнес-логику, делая код более модульным и легким для поддержки. Если вы планируете создание мобильного приложения на Python, эта концепция будет вам особенно полезна.
От теории к практике: создаем простое рабочее приложение
Теперь давайте применим полученные знания для создания простого, но полезного приложения — конвертера температур. Это приложение будет переводить градусы Цельсия в Фаренгейты и наоборот.
Вот полный код нашего конвертера температур:
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton,
QLineEdit, QVBoxLayout, QHBoxLayout,
QLabel, QComboBox)
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QDoubleValidator
class TemperatureConverter(QWidget):
def __init__(self):
super().__init__()
self.title = 'Конвертер температур'
self.left = 100
self.top = 100
self.width = 320
self.height = 200
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# Создаем вертикальную разметку
main_layout = QVBoxLayout()
# Заголовок приложения
header = QLabel('Конвертер температур')
header.setStyleSheet('font-size: 18px; font-weight: bold; margin-bottom: 10px;')
main_layout.addWidget(header)
# Горизонтальная разметка для поля ввода и выбора единиц измерения
input_layout = QHBoxLayout()
# Поле для ввода значения
self.input_value = QLineEdit()
# Устанавливаем валидатор для ввода только чисел
self.input_value.setValidator(QDoubleValidator())
self.input_value.setPlaceholderText('Введите значение')
input_layout.addWidget(self.input_value)
# Выпадающий список для выбора единиц измерения
self.input_unit = QComboBox()
self.input_unit.addItems(['Цельсий (°C)', 'Фаренгейт (°F)'])
input_layout.addWidget(self.input_unit)
main_layout.addLayout(input_layout)
# Кнопка конвертации
self.convert_button = QPushButton('Конвертировать')
self.convert_button.clicked.connect(self.on_convert)
main_layout.addWidget(self.convert_button)
# Метка для вывода результата
self.result_label = QLabel('')
self.result_label.setStyleSheet('font-size: 16px; margin-top: 10px;')
main_layout.addWidget(self.result_label)
# Справочная информация
info_label = QLabel('Формулы перевода:\nC = (F – 32) * 5/9\nF = C * 9/5 + 32')
info_label.setStyleSheet('color: gray; font-size: 12px; margin-top: 20px;')
main_layout.addWidget(info_label)
# Устанавливаем главную разметку для окна
self.setLayout(main_layout)
# Показываем окно
self.show()
@pyqtSlot()
def on_convert(self):
try:
# Получаем введенное значение
value = float(self.input_value.text())
# Определяем тип конвертации
if self.input_unit.currentText() == 'Цельсий (°C)':
# Конвертируем из Цельсия в Фаренгейт
result = value * 9/5 + 32
self.result_label.setText(f'{value}°C = {result:.2f}°F')
else:
# Конвертируем из Фаренгейта в Цельсий
result = (value – 32) * 5/9
self.result_label.setText(f'{value}°F = {result:.2f}°C')
except ValueError:
self.result_label.setText('Пожалуйста, введите корректное число')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = TemperatureConverter()
sys.exit(app.exec_())
Давайте разберем новые элементы, которые мы использовали в этом приложении:
- QHBoxLayout — горизонтальная компоновка, аналогичная QVBoxLayout, но размещает элементы слева направо
- QComboBox — выпадающий список для выбора из предустановленных вариантов
- QDoubleValidator — валидатор, ограничивающий ввод только числовыми значениями
- setStyleSheet — метод для настройки внешнего вида виджетов с помощью CSS-подобного синтаксиса
Наше приложение имеет логическую структуру:
- Пользователь вводит числовое значение
- Выбирает единицу измерения из выпадающего списка
- Нажимает кнопку "Конвертировать"
- Приложение выполняет расчеты и отображает результат
Этот конвертер — отличный пример того, как с помощью PyQt можно быстро создать практичное и удобное приложение. Принципы, использованные здесь, можно применить для создания гораздо более сложных программ, включая профессиональные бизнес-приложения или инструменты для анализа данных. 📊
В данном приложении мы также использовали обработку исключений (try/except) для предотвращения ошибок при вводе некорректных данных. Это важная практика при разработке пользовательских интерфейсов, так как она позволяет приложению элегантно реагировать на неожиданные действия пользователя.
И хотя мы не создавали приложение для Андроид на Python напрямую, полученные знания и принципы дизайна интерфейсов применимы и в мобильной разработке, если использовать подходящие инструменты и фреймворки.
Создание приложений с PyQt — это только начало увлекательного пути в разработке программного обеспечения. От простого конвертера температур можно перейти к построению сложных систем с базами данных, сетевым взаимодействием и машинным обучением. Ключевая сила PyQt в том, что он позволяет сочетать мощь Python с профессиональным графическим интерфейсом. Не останавливайтесь на достигнутом — экспериментируйте с разными виджетами, изучайте систему стилей, осваивайте Qt Designer для визуального проектирования интерфейсов. Каждое новое приложение будет давать вам уверенность и опыт, необходимые для профессионального роста.
Читайте также
- Топ-5 интерпретаторов Python для Android: выбираем лучший
- Kivy: создание кроссплатформенных Python-приложений для всех ОС
- Разработка графических приложений на Python с PyQt: от основ к Android
- Python-программирование на Android: мобильная разработка в смартфоне
- Компиляция Kivy в APK: руководство для Python-разработчиков
- Python на Android: как запускать скрипты на смартфоне с SL4A
- Установка PyCharm на Android: как создать Python-среду на смартфоне
- Python в мобильной разработке: преимущества, возможности, ограничения
- Компиляция Python в APK: пошаговое руководство для Android
- Разработка мобильных приложений на Python: возможности и фреймворки


