Перейти к основному содержимому

Первая программа на PyQt6

Разработчику Архитектору

Первая программа на PyQt6

Где применяют PyQt6

Desktop-приложение — программа с окнами, кнопками и полями ввода на компьютере (в отличие от сайта в браузере).

Tkinter (Первая программа на Tkinter) уже в стандартной библиотеке Python; готовые окна и виджеты с разбором — Lab — 1124. Для "взрослого" desktop-UI часто берут Qt — богатые виджеты, стили, Designer, один код на Windows/macOS/Linux. PyQt6 — привязки Qt 6 к Python. Почти тот же API у PySide6 (лицензия LGPL от Qt); в коде замените PyQt6PySide6.

Разумный порядок в 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(), как консольный скрипт:

  1. QApplication(sys.argv) — инициализация подсистемы GUI.
  2. Создать окно, вызвать show().
  3. 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 + setCentralWidgetLayout вешают на виджет, виджет — в окно
.replace(",", ".")Ввод 21,5 как в русской локали
QMessageBox.warningМодальный диалог ошибки

Что делает пользователь в этом примере

Сценарий на уровне UX выглядит просто, но покрывает важные элементы GUI:

  1. Пользователь вводит значение температуры в QLineEdit.
  2. Нажимает кнопку.
  3. Приложение валидирует ввод.
  4. При ошибке показывает понятный диалог.
  5. При корректном вводе обновляет 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: PyQt6venv не активированpip install PyQt6
Кнопка не работаетНет connectbtn.clicked.connect(...)

Что попробовать

  1. QDialog с формулой °F = °C × 9/5 + 32.
  2. QDoubleValidator — только числа в поле.
  3. Тот же UI в PySide6PyQt, PySide и Flet — GUI beyond Tkinter.

Дальше


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на Tkinter, Первая программа на Flask, Первая программа на Django REST Framework, Первая программа на FastAPI, Первая программа на Django, Первая программа на JavaServer Faces.