الإعداد مع بايثون
المتطلبات الأساسية
قبل البدء، سنحتاج إلى تثبيت 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.py
└── qml/
└── Main.qmlاسم الحزمة سيكون kirigami_python، والملف التنفيذي (سكريبت وحدة التحكم) سيُسمى kirigami_hello، ونقطة الدخول ستكون app.
تلميح
لإنشاء هيكل المجلد هذا بسرعة، شغّل:mkdir -p kirigami_python/src/qml/.لمشروع أكثر شمولاً يتناول تفاصيل إضافية عن هيكل الملفات هذا، انظر المشروع الكامل بلغة بايثون + كيريغامي.
pyproject.toml
تطبيقات بايثون الحديثة تحتاج فقط إلى ملف TOML واحد لتحديد جميع البيانات الوصفية ومعلومات الحزمة والتبعيات وفقًا لـ PEP 621. ما يلي يصلح كنقطة بداية جيدة لتطبيق ويمكن توسيعه لاحقًا.
معظم محتويات هذا الملف هي قالب أساسي، ويمكن رؤية نسخة أكثر اكتمالاً منه في بايثون مع كيريغامي: الهيكل العام.
| |
لاحظ الأسطر المميزة. كما ذُكر تحت هيكل المشروع، اسم الحزمة هو kirigami_python، اسم الملف التنفيذي هو kirigami_hello، واسم نقطة الدخول هو app. على وجه الخصوص، يجب ملاحظة ما يلي:
- يتكون سكريبت المشروع من سكريبت نقطة دخول سيُولد بواسطة setuptools لتشغيل التطبيق، وفي هذه الحالة هو
kirigami_hello. - سكريبت المشروع المُولد
kirigami_helloيشغّل الدالةmain()في سكريبتapp.pyفي حزمةkirigami_python. - الدليل الافتراضي
package-dirلمشاريع بايثون هو عادة الدليل الجذر. في هذه الحالة، يُستبدل هذا بالدليل الفرعي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
الغرض الأساسي من ملفات إدخال سطح المكتب هو عرض تطبيقك على مشغل التطبيقات في لينكس. سبب آخر لامتلاكها هو الحصول على أيقونات النوافذ على Wayland، حيث إنها مطلوبة لإخبار المُركِّب "هذه النافذة تذهب مع هذه الأيقونة".
يجب أن يتبع نظام تسمية DNS العكسي متبوعًا بالامتداد .desktop مثل org.kde.kirigami_python.desktop:
| |
ملاحظة
أيقونات النافذة وشريط المهام ستعمل في جلسة Wayland فقط إذا وُضعت ملفات سطح المكتب للتطبيقات في~/.local/share/applications أو /usr/share/applications. لتشغيل الأيقونات في هذا الدليل، انسخ ملف سطح المكتب للتطبيق هناك.MANIFEST.in
هذا الملف هو ببساطة إعلان عن ملفات شيفرة مصدرية إضافية يجب أن تكون موجودة في الحزمة عند تشغيل التطبيق. بايثون افتراضيًا لا تتضمن ملفات 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 ضرورية لجعل بايثون قادرًا على الوصول إلى حزم بايثون من توزيعتك. هذا مطلوب لأن كيريغامي وPySide يجب أن يكونا قد بُنيا ضد نفس إصدار كيوتي ليعملا، وهذا هو الحال عندما يأتي كلاهما من التوزيعة.
العلامة --spec تحدد المسار إلى شفرة المصدر أو حزمة العجلة التي تحتوي البرنامج، وkirigami_hello هو البرنامج النصي القابل للتنفيذ الذي سيُشغّل.
لبناء حزمة بايثون وتثبيتها، شغّل:
pipx install --force --system-site-packages .ستُثبّت الحزمة إلى ~/.local/share/pipx/venvs/kirigami-python، وسيُثبّت برنامج نصي قابل للتنفيذ إلى ~/.local/bin/kirigami_hello.
استخدام pipx مقابل pip
على عكس بايثون مع كيريغامي: إنشاء حزمة بايثون، استخدم هذا الدليل pipx لجعل المشروع أسهل في التشغيل والتثبيت. يمكن تنفيذ نفس الخطوات يدويًا باستخدام venv وbuild وpip كما في الدليل الأكثر اكتمالًا.
pipx مفيد وموصى به وفقًا لـ PEP 668 لتشغيل تطبيقات بايثون، بينما pip متعدد الأغراض ويمكن استخدامه أيضًا لوحدات بايثون القابلة للاستيراد.
بعد هذا، يمكن إطلاق التطبيق بتشغيل:
kirigami_helloلتشغيل تطبيق QML الجديد في وضع الجوال، يمكنك استخدام QT_QUICK_CONTROLS_MOBILE=1:
QT_QUICK_CONTROLS_MOBILE=1 kirigami_helloهكذا! الآن سترى أول تطبيق Kirigami لك يظهر أمام عينيك.
