Первая программа на PyQt6
Первая программа на PyQt6
Где применяют PyQt6
Desktop-приложение — программа с окнами, кнопками и полями ввода на компьютере (в отличие от сайта в браузере).
Tkinter (Первая программа на Tkinter) уже в стандартной библиотеке Python; готовые окна и виджеты с разбором — Lab — 1124. Для "взрослого" desktop-UI часто берут Qt — богатые виджеты, стили, Designer, один код на Windows/macOS/Linux. PyQt6 — привязки Qt 6 к Python. Почти тот же API у PySide6 (лицензия LGPL от Qt); в коде замените PyQt6 → PySide6.
Разумный порядок в Qt: одно рабочее окно → валидация полей → разнесение по модулям → Qt Designer и сложные паттерны. Так вы раньше получаете собираемый проект и не утонете в API с первого дня.
Сравнение стеков: PyQt, PySide и Flet. Аналог на C++: Qt — первая программа.
Словарь Qt
| Термин | Простыми словами |
|---|---|
| Виджет (Widget) | Элемент UI: кнопка, поле ввода, надпись |
| Окно | Контейнер, в котором лежат виджеты |
| Layout | Как виджеты выстраиваются (столбик, сетка) |
| Сигнал (signal) | Событие: "кнопку нажали", "текст изменился" |
| Слот (slot) | Функция, которая вызывается при сигнале |
| Event loop | Цикл "ждать действия пользователя и перерисовать" |
В Tkinter кнопку связывают так: command=self.convert. В Qt связь явная: btn.clicked.connect(self.convert) — удобно, когда сигналов много.
Что получится
Окно "Конвертер °C → °F" — поле ввода, кнопка "Перевести", метка результата, диалог при неверном вводе. Формула: °F = °C × 9/5 + 32.
Установка
python -m venv venv
# Windows —
venv\Scripts\activate
# macOS / Linux —
source venv/bin/activate
pip install PyQt6
Блок готовит изолированное окружение для проекта:
python -m venv venvсоздаёт локальную папку с отдельным интерпретатором и пакетами.venv\Scripts\activateиsource venv/bin/activateактивируют окружение в разных ОС.pip install PyQt6устанавливает GUI-библиотеку в это окружение, не затрагивая другие проекты.
venv изолирует PyQt6 от других проектов на том же компьютере.
Событийный цикл
GUI-программа не "заканчивается" после show(), как консольный скрипт:
QApplication(sys.argv)— инициализация подсистемы GUI.- Создать окно, вызвать
show(). app.exec()— цикл: клик → слот → перерисовка.
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
Здесь запускается жизненный цикл Qt-приложения:
QApplication(sys.argv)инициализирует графическую подсистему и аргументы запуска.MainWindow()создаёт объект вашего главного окна.window.show()отображает окно пользователю.app.exec()запускает event loop и обрабатывает клики, ввод и перерисовку.sys.exit(...)корректно передаёт код завершения процессу ОС.
Код с разбором
converter.py:
Код ITЗагрузка примера кода…
Это полный каркас приложения с окном и обработчиком кнопки:
- импорт из
PyQt6.QtWidgetsподключает нужные виджеты и layout-контейнеры; - класс
MainWindow(QMainWindow)инкапсулирует структуру интерфейса и поведение окна; btn.clicked.connect(self.convert)связывает событие клика с методомconvert;- в
convert()ввод читается, валидируется черезfloat(...), затем рассчитывается формула; QMessageBox.warning(...)показывает пользователю понятную ошибку при нечисловом вводе;- функция
main()создаёт приложение, показывает окно и запускает цикл событий.
Разбор по блокам
| Элемент | Смысл |
|---|---|
QMainWindow | Главное окно; здесь — central widget по центру |
QLineEdit | Однострочный ввод; setPlaceholderText — серая подсказка |
btn.clicked.connect(self.convert) | Сигнал → слот |
QVBoxLayout | Виджеты столбиком |
container + setCentralWidget | Layout вешают на виджет, виджет — в окно |
.replace(",", ".") | Ввод 21,5 как в русской локали |
QMessageBox.warning | Модальный диалог ошибки |
Что делает пользователь в этом примере
Сценарий на уровне UX выглядит просто, но покрывает важные элементы GUI:
- Пользователь вводит значение температуры в
QLineEdit. - Нажимает кнопку.
- Приложение валидирует ввод.
- При ошибке показывает понятный диалог.
- При корректном вводе обновляет
QLabelс результатом.
Даже такой маленький сценарий уже включает связь "виджет → сигнал → слот → обновление интерфейса", то есть базовый каркас большинства desktop-приложений.
Мини-рефакторинг после первой версии
После рабочего MVP полезно сделать небольшую структуризацию:
- вынести формулу в отдельную функцию, чтобы тестировать её отдельно от GUI;
- добавить типы и короткие docstring для публичных методов окна;
- разделить "логику интерфейса" и "доменную логику";
- добавить простой unit-тест на преобразование температуры.
Пример функции, которую удобно тестировать отдельно:
def celsius_to_fahrenheit(celsius: float) -> float:
return celsius * 9 / 5 + 32
Функция выделяет бизнес-логику отдельно от GUI:
- принимает одно значение
celsiusтипаfloat; - возвращает вычисленный
floatпо формуле перевода; - такой формат упрощает unit-тесты и повторное использование без привязки к виджетам.
Связанный материал по структуре приложений: ООП в Python, Функции и модули, Тестирование в Python.
Запуск
python converter.py
Команда запускает файл приложения в текущем окружении:
- Python загружает
converter.py; - условие
if __name__ == "__main__":вызываетmain()и открывает окно Qt.
Qt Designer
Визуальный редактор сохраняет .ui (XML):
from PyQt6 import uic
self.ui = uic.loadUi("mainwindow.ui", self)
Фрагмент загружает интерфейс, созданный в Qt Designer:
uicчитает XML-файл.ui;loadUi("mainwindow.ui", self)внедряет визуальную разметку в текущий объект окна;- после загрузки к элементам из
.uiможно подключать сигналы и бизнес-логику в Python-коде.
Логику оставляют в Python.
Частые ошибки
| Симптом | Причина | Решение |
|---|---|---|
| Окно мелькает | Нет app.exec() | Добавить цикл событий |
ModuleNotFoundError: PyQt6 | venv не активирован | pip install PyQt6 |
| Кнопка не работает | Нет connect | btn.clicked.connect(...) |
Что попробовать
QDialogс формулой °F = °C × 9/5 + 32.QDoubleValidator— только числа в поле.- Тот же UI в PySide6 — PyQt, PySide и Flet — GUI beyond Tkinter.
Дальше
QTableWidget, фоновые задачи черезQThread;- упаковка: PyInstaller;
- игры: Разработка игр на Python, Pygame — мини-игры.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Первые шаги (маршрут подборки) — Первая программа на Tkinter, Первая программа на Flask, Первая программа на Django REST Framework, Первая программа на FastAPI, Первая программа на Django, Первая программа на JavaServer Faces.