Настройка проекта на Python
Предварительные требования
Прежде чем начать, необходимо установить Kirigami и PySide на компьютере.
sudo pacman -S python-pipx python-pyqt6 pyside6 kirigami flatpak-builder qqc2-desktop-style appstream | |
sudo zypper install python3-pipx python3-qt6 python3-pyside6 kf6-kirigami-devel flatpak-builder kf6-qqc2-desktop-style AppStream-compose | |
sudo dnf install pipx python3-pyqt6 python3-pyside6 kf6-kirigami-devel flatpak-builder kf6-qqc2-desktop-style appstream-compose |
Если в дистрибутиве установлены старые пакеты PySide6 или PyQt6, для работы с этим руководством можно использовать раздел Сборка программного обеспечения с помощью distrobox.
Структура проекта
Сначала создаётся папка проекта (можно использовать приведённые ниже команды). Папка будет называться kirigami_python/.
kirigami_python/
├── README.md
├── LICENSE.txt
├── MANIFEST.in # Добавление файлов QML
├── pyproject.toml # Основной файл управления проектом
├── org.kde.kirigami_python.desktop
└── src/
├── __init__.py # Импорт папки src/ в качестве пакета
├── __main__.py # Указание app в качестве точки входа
├── app.py
└── qml/
└── Main.qmlИмя пакета будет kirigami_python, «исполняемый файл» (консольный сценарий) будет называться kirigami_hello, а точкой входа будет app.
Совет
Чтобы быстро создать такую структуру папок, просто выполните:mkdir -p kirigami_python/src/qml/.Более полный проект, в котором структура этих файлов рассматривается подробнее, описан в разделе Весь проект на Python + Kirigami.
pyproject.toml
Современным приложениям Python достаточно одного файла TOML, чтобы указать все метаданные, сведения о пакете и зависимости в соответствии с PEP 621. Приведённый ниже пример послужит хорошей отправной точкой для приложения, и его можно расширить в дальнейшем.
Большая часть содержимого этого файла — шаблонный код, а более полную его версию можно увидеть в разделе Python с Kirigami: общая структура.
| |
Обратите внимание на выделенные строки. Как упоминалось в разделе Структура проекта, имя пакета — kirigami_python, имя исполняемого файла — kirigami_hello, а имя точки входа — app. В частности, следует отметить следующее:
- Сценарий проекта состоит из сценария точки входа, который будет создан setuptools для запуска приложения, в этом случае —
kirigami_hello. - Сценарий созданного проекта
kirigami_helloзапускает функциюmain()в сценарииapp.pyпакетаkirigami_python. - По умолчанию
package-dirдля проектов Python обычно является корневой папкой. В этом случае он переопределяется вложенной папкойsrc/, чтобы тот выступал в роли корневой папки пакета. - Именно из-за
package-dirсозданный сценарий проекта выполняетkirigami_python → app, а неkirigami_python → src → app. package-dirтакже объясняет, почему вызовimportlib.resources.files()в app.py возвращаетkirigami_python → qml → Main.qml, а неkirigami_python → src → qml → Main.qml.
Подробнее см. в разделе Прямой запуск, запуск в качестве модуля и в качестве консольного сценария.
org.kde.kirigami_python.desktop
Основное назначение файлов .desktop — показывать приложение в меню запуска приложений в Linux. Ещё одна причина их использовать — значки окон в Wayland, поскольку они нужны, чтобы сообщить композитору: «это окно соответствует этому значку».
Оно должно соответствовать схеме обратного именования DNS, за которой следует расширение .desktop, например org.kde.kirigami_python.desktop:
| |
Примечание
Значки окон и панели задач будут работать в сеансе Wayland только если файлы .desktop приложений размещены в~/.local/share/applications или /usr/share/applications. Чтобы значки работали при выполнении этого руководства, скопируйте туда файл .desktop приложения.MANIFEST.in
Этот файл — просто объявление дополнительных файлов исходного кода, которые должны присутствовать в пакете при запуске приложения. Python по умолчанию не включает файлы QML в пакеты, и они должны быть доступны, чтобы приложение работало.
| |
src/app.py
| |
Так как это приложение с графическим интерфейсом, нужно, чтобы главная функция выполнялась только при запуске сценария, а не при его импорте, поэтому в конце файла требуется условие if __name__ == "__main__". Дополнительные сведения см. в разделе Прямой запуск, запуск в качестве модуля и в качестве консольного сценария.
Создаётся QGuiApplication и инициализируется движок QML, а с помощью QGuiApplication.exec() приложение продолжает работу до закрытия. Затем importlib.resources.files() получает путь к файлу, присутствующему в пакете, а именно к Main.qml. С помощью этого пути файл QML загружается в движок QML как основная точка входа для интерфейса приложения.
src/init.py
Создайте пустой файл kirigami_python/src/__init__.py. Этот файл нужен лишь для того, чтобы папку можно было импортировать как пакет.
touch __init__.pysrc/main.py
Создайте файл kirigami_python/src/__main__.py со следующим содержимым:
| |
Он просто добавляет содержимое текущей папки (src/) и импортирует его как модуль с именем app, после чего сразу запускает функцию main() приложения.
src/qml/Main.qml
| |
Здесь мы займёмся фронтендом приложения.
Тем, кто знаком с JavaScript, многое в QML покажется знакомым (хотя у него есть свои особенности). В документации Qt содержится обширный материал по этому языку, если возникнет желание попробовать что-то самостоятельно. В этих уроках основное внимание будет уделено коду QML, где с помощью Kirigami можно извлечь из него максимум.
Пока сосредоточимся на Main.qml. Сначала импортируем несколько важных модулей:
- QtQuick — стандартная библиотека, используемая в приложениях QML.
- QtQuick Controls предоставляет ряд стандартных элементов управления, которые можно использовать, чтобы сделать приложения интерактивными.
- QtQuick Layouts, который предоставляет средства для размещения компонентов в окне приложения.
- Kirigami, предоставляющий набор компонентов, подходящих для создания приложений, работающих на устройствах разных форм и размеров.
Примечание
Размещение импортов QtQuick Controls и Kirigami в отдельных пространствах имён с помощью ключевого словаas — рекомендуемая практика, гарантирующая, что компоненты с одинаковыми именами не будут конфликтовать. В разных источниках можно встретить другие имена для QtQuick Controls, например «QQC» или «QQC2». В этом руководстве для ясности будет использоваться «Controls».Далее следует базовый элемент — Kirigami.ApplicationWindow, который предоставляет ряд основных возможностей, необходимых всем приложениям Kirigami. Это окно, в котором будут размещаться все страницы — основные разделы пользовательского интерфейса.
Затем свойству id окна присваивается значение «root». Идентификаторы полезны, поскольку позволяют однозначно ссылаться на компонент, даже если имеется несколько компонентов одного типа.
Также свойству title окна присваивается значение «Hello World».
Затем задаётся первая страница стека страниц. Большинство приложений Kirigami организованы в виде стека страниц, каждая из которых содержит связанные компоненты, подходящие для конкретной задачи. Пока всё делается просто, и используется только одна страница. pageStack — это изначально пустой стек страниц, предоставляемый Kirigami.ApplicationWindow, а с помощью pageStack.initialPage: Kirigami.Page {...} первая страница, показываемая при загрузке приложения, задаётся как Kirigami.Page. Именно на ней будет размещено всё содержимое.
Наконец, на страницу добавляется Controls.Label, позволяющий разместить текст. Чтобы выровнять надпись по центру по горизонтали и вертикали внутри родительского элемента, используется anchors.centerIn: parent. В этом случае родительским компонентом надписи является Kirigami.Page. Последнее, что нужно сделать, — задать её текст: text: "Hello World!".
Запуск приложения
Консольный сценарий kirigami_hello можно запустить без предварительной установки:
pipx run --system-site-packages --spec . kirigami_helloФлаг --system-site-packages нужен, чтобы Python получил доступ к пакетам Python из дистрибутива. Это необходимо, поскольку Kirigami и PySide должны быть собраны с одной и той же версией Qt, чтобы работать, — а это так, когда оба они входят в состав дистрибутива.
Флаг --spec определяет путь к исходному коду или пакету wheel, содержащему программу, а kirigami_hello — исполняемый сценарий, который нужно запустить.
Для сборки и установки пакета Python выполните:
pipx install --force --system-site-packages .Пакет будет установлен в ~/.local/share/pipx/venvs/kirigami-python, а исполняемый сценарий — в ~/.local/bin/kirigami_hello.
Использование pipx вместо pip
В отличие от раздела Python с Kirigami: создание пакета Python, в этом руководстве для упрощения запуска и установки проекта использовался pipx. Те же шаги можно выполнить вручную с помощью venv, build и pip, как в более полном руководстве.
pipx полезен и рекомендован согласно PEP 668 для запуска приложений Python, а pip универсален и подходит также для импортируемых модулей Python.
После этого приложение запускается командой:
kirigami_helloЧтобы запустить новое приложение QML в мобильном режиме, можно использовать QT_QUICK_CONTROLS_MOBILE=1:
QT_QUICK_CONTROLS_MOBILE=1 kirigami_helloВот и всё! Теперь перед глазами появится самое первое приложение Kirigami.
