﷽
بايثون لغة تركز على الوضوح وتسهيل قراءة نصها ولها تواجد قوي في برامج الخوادم والبرامج المكتبية وكذلك في برامج الوب لكنها ليست مدعومة بشكل قوي على أجهزة الجوالات.
كيوي Kivy جاء ليفتح نافذة لمبرمجي بايثون إلى عالم برمجة الجوال.
سأتحدث هنا مباشرة عن كيفية جعل برنامجك يعمل على أندرويد.
تهيئة بيئة العمل
نثبت pipenv
sudo apt -y install pipenv
أداة pipenv أداة مفيدة جدا للتعامل مع البيئة الوهمية وذلك لحصر احتياجات البرنامج وحزمه داخل بيئة محدودة لا تؤثر في حزم النظام أو حزم المستخدم، ببساطة العمل بنظافة.
ننشئ مجلد جديد وندخله
mkdir kivy_project
cd kivy_project
ثم ننشئ البيئة الوهمية وندخلها باستخدام
pipenv shell
يمكنك تنفيذ الأمر التالي لترى أن بايثون الآن يعمل من البيئة الوهمية
$ which python3
# /home/ubuntu/.local/share/virtualenvs/kivy_project-Wpp2_XPR/bin/python3
إعداد كيوي
ثم نثبت Kivy
pipenv install kivy
سيأخذ الأمر عدة ثواني إلى دقائق قليلة لجلب الاعتماديات وترتيبها في ملفات pipenv التي ستحتوي على معلومات لتشغيل البرنامج في بيئة أخرى بنفس الشروط وتسهيل التحديثات لكن هذا ليس موضوع شرحنا.
ونثبت المكتبات التي سنستخدمها في البرنامج وفي هذا المثال مكتبة واحدة:
pipenv install hijri_converter
كتابة البرنامج
لنضع الآتي في ملف main.py
في داخل دليل kivy_project الذي أنشأناه سابقا.
# Arabic: استيراد أدوات كيوي
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
# Arabic: استيراد المكتبة التي تأتي بالتاريخ الهجري
from hijri_converter import convert
# Arabic: تحميل صيغة كيوي وهي صيغة غرضها الأساسي رسم الواجهة كما يمكن تحميلها من ملف
Builder.load_string('''
<mybox>:
orientation: 'vertical'
Label:
text: "Hijri Date"
Label:
id: date_text
text: "____-__-__"
Button:
text: "Get date"
on_press: root.show_date()
''')
class mybox(BoxLayout):
"""
Arabic: الصندوق الذي يحوي عناصر الواجهة
"""
def show_date(self):
test = SampleApp.hijri()
self.ids.date_text.text = test
class SampleApp(App):
"""
Arabic: التطبيق الأساسي
"""
def hijri():
"""
Get today Hijri date, Arabic: جلب التاريخ الهجري
"""
hijri = convert.Gregorian.today().to_hijri()
return str(hijri)
def build(self):
return mybox()
SampleApp().run()
لنشغله باستخدام بايثون على جهازنا المكتبي:
python3 main.py
أصبح لدينا برنامج يظهر لنا التاريخ الهجري.
تجهيز بناء البرنامج
لنقم الآن بتجهيز البناء للجوال، نثبت الاعتماديات التي يحتاجها buildozer
:
sudo apt install -y git zip unzip openjdk-13-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
راجع هنا لأحدث نسخة من المتطلبات:
https://buildozer.readthedocs.io/en/latest/installation.html#targeting-android
ثم نحدث Cython
pip3 install --user --upgrade Cython==0.29.19 virtualenv
ونضيف المسار:
export PATH=$PATH:~/.local/bin/
ثم نثبت بيلدوزر
pipenv install --dev buildozer
استخدمنا --dev
لنبين أن هذا من متطلبات البناء وليس تشغيل البرنامج
بدء بناء البرنامج
ثم ننشئ ملفات البناء
buildozer init
ونعدل على الملف buildozer.spec
بما يناسبنا وأهم شيء هو إضافة الحزم المطلوبة للبناء أي الاعتماديات.
أنا عدلت في هذه التجربة بإضافة حزمة hijri_converter
لا أكثر فأصبح الجزء المتعلق بالاعتماديات بهذا الشكل.
# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy,hijri_converter
نحفظ المل و نبدأ عملية البناء:
buildozer android debug
ستأخذ وقتا طويلا حوالي ربع ساعة أو أكثر سنجد بعد انتهائها بنجاح ملف apk داخل مجلد bin/
وهذا مثال لآخر بضعة أسطر من مخرجات بناء ناجح:
[DEBUG]: /home/my_home/.buildozer/android/platform/android-ndk-r19c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip:/home/my_home/dev/gitlab/mobile-paper-wallet/src/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/mobile_paper_wallet/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/gdb.setup: File format not recognized
[DEBUG]:
[DEBUG]: Unable to strip library /home/my_home/dev/gitlab/mobile-paper-wallet/src/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/mobile_paper_wallet/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/gdb.setup due to error 1 returned from /home/my_home/.buildozer/android/platform/android-ndk-r19c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip, packaging it as is.
[DEBUG]:
[DEBUG]: Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
[DEBUG]: Use '--warning-mode all' to show the individual deprecation warnings.
[DEBUG]: See https://docs.gradle.org/6.4.1/userguide/command_line_interface.html#sec:command_line_warnings
[DEBUG]: > IDLE
[DEBUG]: BUILD SUCCESSFUL in 5s
[DEBUG]: 25 actionable tasks: 25 executed
[INFO]: <- directory context /home/my_home/dev/gitlab/mobile-paper-wallet/src/.buildozer/android/platform/python-for-android
[INFO]: Of the existing distributions, the following meet the given requirements:
[INFO]: mobile_paper_wallet: min API 21, includes recipes (hostpython3, libffi, openssl, sdl2_image, sdl2_mixer, sdl2_ttf, sqlite3, python3, sdl2, setuptools, six, pyjnius, android, kivy, certifi, charset-normalizer, pygments, peewee, urllib3, ecashaddress, pypng, idna, base58, bitcoinaddress, requests, kivy-garden, python-bidi, pyqrcode, arabic-reshaper, ecdsa, docutils), built for archs (arm64-v8a, armeabi-v7a)
[INFO]: mobile_paper_wallet has compatible recipes, using this one
[INFO]: # Copying android package to current directory
[INFO]: # Android package filename not found in build output. Guessing...
[INFO]: # Found android package file: /home/my_home/dev/gitlab/mobile-paper-wallet/src/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/mobile_paper_wallet/build/outputs/apk/debug/mobile_paper_wallet-debug.apk
[INFO]: # Add version number to android package
[INFO]: # Android package renamed to mobile_paper_wallet-debug-1.3.5-.apk
[DEBUG]: -> running cp /home/my_home/dev/gitlab/mobile-paper-wallet/src/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/mobile_paper_wallet/build/outputs/apk/debug/mobile_paper_wallet-debug.apk mobile_paper_wallet-debug-1.3.5-.apk
# Android packaging done!
# APK mobile_paper_wallet-1.3.5-arm64-v8a_armeabi-v7a-debug.apk available in the bin directory
استخدام adb
سنستفيد من adb إن رغبنا بتثبيت سريع للبرناج على الجوال والتحقق من العلل والاشكالات بعد بناءه.
تثبيت البرنامج
إذا كانت adb
مثبتة على جهازك وكنت مفعلا ل usb debugging
يمكنك تثبيت الحزمة المبنية حديثا بعد وصل الجهاز هكذا:
adb install myapp_0.1-arm64*****.apk
طبعا استبدل ما بعد install
باسم الملف الخاص بك.
التحقق من العلل في البرنامج
يمكنك التحقق من العلل في برنامجك إن حصل انهيار أو تحطم أو غيره باستخدام التالي:
adb logcat
وباضافة
adb logcat | grep python
تحصر المخرجات بالمتعلقة ببايثون وكيوي
مزيد من الأمثلة
مثال زر يتحرك عن الضغط عليه، كل ما عليك هو نسخ المحتوى ولصقه في main.py لهذا المثال:
https://kivy.org/doc/stable/examples/gen__animation__animate__py.html
التحزيم لأندروي وتثبيت بيلدوزر
https://kivy.org/doc/stable/guide/packaging-android.html
للحصول على أمثلة أخرى يمكنك النظر في مسار examples داخل مستودع كيوي، بعض الحزم تتطلب وجود ملفين حتى تعمل ملف البرنامج وملف كيوي لتصميم الواجهة.
مصادر عن كيوي
الموقع الرسمي:
مستودعات النص البرمجي:
الحصول على المساعدة
مجموعة عربية على تلغرام:
ديسكورد كيوي
دعم العربية
دعم العربية في كيوي ناقص لكن يمكن توفيره باستخدام arabic_reshaper و python-bidi
وهذا مثال لدعم ادخال النص باللغة العربية
هناك دعم تجريبي باستخدام حرف باز لكن يحتاج لدفع المطورين لدمجه بعد تجربته