Kirigami з Python
Передумови
Перш ніж почати, нам потрібно встановити Kirigami і Python у нашій машині.
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 qqc2-desktop-style AppStream-compose | |
sudo dnf install pipx python3-pyqt6 python3-pyside6 kf6-kirigami-devel flatpak-builder 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.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
. - Типовим каталогом пакетів для проєктів 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
Основним призначенням файлів стільничних записів є показ вашої програми у засобі запуску програм у 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__.py
src/__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 і Kirigami в окремих просторах назв за допомогою ключового словаas
є найкращим способом, який забезпечує усування можливих конфліктів між компонентами з однаковими назвами. У різних програмах ви можете бачити різні назви для елементів керування QtQuick, зокрема «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 вашими власними очима.