تطوير تطبيقات الجوال باستخدام لغة بايثون

تطوير تطبيقات الجوال هو عملية بناء تطبيق للأجهزة المحمولة، مثل الهواتف الذكية والأجهزة اللوحية. عموماً، يُعد تطوير تطبيقات الجوال أصعب من تطوير تطبيقات الويب، لأنها تتطلب تصميماً خاصاً لكل منصة، بينما تتشارك تطبيقات الويب في استخدام أكواد مشتركة بين مختلف الأجهزة.

يستخدم كل نظام تشغيل لغة برمجة خاصة به لتطوير التطبيقات الأصلية (التطبيقات المصممة بتقنية مخصصة لمنصة معينة). على سبيل المثال، يستخدم نظام أندرويد لغة جافا، بينما يستخدم نظام iOS لغة سويفت. عادةً، يُفضل استخدام التقنية المخصصة للتطبيقات التي تتطلب أداءً عاليًا، مثل الألعاب أو الرسوم المتحركة المعقدة. في المقابل، تستخدم التطبيقات الهجينة لغات برمجة متعددة المنصات (مثل بايثون) يمكن تشغيلها على أنظمة تشغيل متعددة.

يُعدّ تطوير تطبيقات الهواتف المحمولة ذا أهمية بالغة للذكاء الاصطناعي، إذ يُتيح دمج التقنيات الحديثة في الحياة اليومية. وقد اكتسبت نماذج التعلم الآلي شعبية واسعة بفضل توفيرها في تطبيقات سهلة الاستخدام على الهواتف، ما يُسهّل الوصول إليها في أي وقت ومن أي مكان.

من خلال هذا البرنامج التعليمي، سأشرح كيفية إنشاء تطبيق جوال متعدد المنصات باستخدام لغة بايثون.

الإعداد

سأستخدم إطار عمل Kivy، وهو الأكثر استخدامًا في تطوير تطبيقات الجوال ضمن مجتمع بايثون. Kivy عبارة عن حزمة مفتوحة المصدر لتطبيقات الجوال، بينما KivyMD هي المكتبة التي تستفيد من تصميم Material Design من جوجل، مما يجعل استخدام هذا الإطار أسهل بكثير (على غرار Bootstrap لتطوير مواقع الويب).

## for development
pip install kivy==2.0.0
pip install kivymd==0.104.2

## for deployment
pip install Cython==0.29.27
pip install kivy-ios==1.2.1

أول شيء يجب فعله هو إنشاء ملفين:

  • ملف main.py (يجب أن يكون اسمه هكذا) والذي سيحتوي على كود بايثون الخاص بالتطبيق، أي الواجهة الخلفية بشكل أساسي.
  • ملف components.kv (يمكنك تسميته باسم مختلف) والذي يحتوي على جميع أكواد Kivy المستخدمة لتصميم التطبيق، ويمكنك اعتباره الواجهة الأمامية.

ثم، في ملف main.py نقوم باستيراد الحزمة لتهيئة تطبيق فارغ:

from kivymd.app import MDApp

class App(MDApp):
   def build(self):        
       self.theme_cls.theme_style = "Light"        
       return 0

if __name__ == "__main__":    
   App().run()

قبل أن نبدأ، سأصف بإيجاز التطبيق الذي أعمل على تطويره. إنه تطبيق بسيط يساعد على الحفظ: يُدخل المستخدم زوجًا من الكلمات (مثل كلمة إنجليزية وما يقابلها في لغة أخرى، أو تاريخًا وحدثًا تاريخيًا مرتبطًا به). بعد ذلك، يمكن للمستخدم لعب اللعبة بمحاولة تذكر المعلومات المُرتبة عشوائيًا. في الواقع، أستخدمه لحفظ مفردات اللغة الصينية.

كما ترون في الصورة، سأقوم بتضمين ما يلي:

  • شاشة تمهيدية لعرض الشعار
  • شاشة رئيسية يمكنها إعادة التوجيه إلى الشاشات الأخرى
  • شاشة لحفظ الكلمات
  • شاشة لعرض وحذف المعلومات المخزنة
  • شاشة للعب اللعبة.

لذا، يمكننا كتابتها جميعًا في ملف components.kv:

من أجل تضمين ملف Kivy في التطبيق، نحتاج إلى تحميله من ملف main.py باستخدام فئة builder، بينما تقوم فئة screen بربط الشاشات بين الملفين.

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

class App(MDApp):
   def build(self):        
       self.theme_cls.theme_style = "Light"        
       return Builder.load_file("components.kv")

class IntroScreen(Screen):    
   pass 

class HomeScreen(Screen):    
   pass 

class PlayScreen(Screen):
   pass  
 
class SaveScreen(Screen):    
   pass 

class EditScreen(Screen):
   pass

if __name__ == "__main__":    
   App().run()

يرجى ملاحظة أنه حتى لو كان التطبيق بسيطًا، فإنه يحتوي على ميزة معقدة نوعًا ما: إدارة قواعد البيانات عبر الهاتف المحمول. لهذا السبب سنستخدم أيضًا حزمة بايثون الأصلية لقواعد البيانات.

import sqlite3

التطوير – الأساسيات

سنبدأ بالتحضير من خلال شاشة المقدمة: فهي تحتوي ببساطة على شعار صورة، وبعض التسميات النصية، وزر للانتقال إلى شاشة أخرى.

أعتبر ذلك سهلاً لأنه لا يتطلب أي كود بايثون، ويمكن معالجته بواسطة ملف components.kv. يجب ربط تغيير الشاشة الذي يتم تشغيله بواسطة الزر بالجذر على النحو التالي:

وينطبق الأمر نفسه على الشاشة الرئيسية: بما أنها مجرد إعادة توجيه، يمكن إدارتها بالكامل باستخدام كود Kivy. كل ما عليك فعله هو تحديد أن الشاشة يجب أن تحتوي على أيقونة واحدة وثلاثة أزرار.

ربما لاحظت وجود أيقونة “الرئيسية” أعلى الشاشة. يُرجى ملاحظة الفرق بين الأيقونة العادية وزر الأيقونة: فالأخير قابل للضغط. في هذه الشاشة، هي مجرد أيقونة عادية، أما في الشاشات الأخرى، فستكون زر أيقونة يُستخدم للعودة إلى الشاشة الرئيسية من أي شاشة أخرى في التطبيق.

عند استخدام أيقونة، يجب تحديد الوسم (مثلاً، كلمة “home” تعرض صورة منزل صغير). أجد هذا الكود مفيدًا جدًا، ما عليك سوى تشغيله وسيعرض جميع الأيقونات المتاحة.

التطوير – المتقدم

لنرتقِ بمستوى أدائنا ونتعامل مع قاعدة البيانات من خلال شاشة الحفظ. يجب أن تسمح هذه الشاشة للمستخدم بحفظ كلمات مختلفة لفئات مختلفة (أي لدراسة لغات متعددة). وهذا يعني:

  • اختيار فئة موجودة (مثل الصينية)، ثم الاستعلام عن الفئات الموجودة
  • إنشاء فئة جديدة (مثل الفرنسية)
  • مدخلان نصيان (أي كلمة وترجمتها)
  • زر لحفظ النموذج، وبالتالي كتابة صف جديد في قاعدة البيانات.

عند تشغيل التطبيق لأول مرة، يجب إنشاء قاعدة البيانات. يمكننا القيام بذلك في الدالة الرئيسية للتطبيق. ولتسهيل الأمر، سأضيف دالة أخرى تستعلم عن قاعدة البيانات باستخدام أي استعلام SQL تُمرره.

class App(MDApp):

   def query_db(self, q, data=False):        
       conn = sqlite3.connect("db.db")        
       db = conn.cursor()        
       db.execute(q)        
       if data is True:            
           lst_tuples_rows = db.fetchall()        
       conn.commit()        
       conn.close()        
       return lst_tuples_rows if data is True else None

   def build(self):        
       self.theme_cls.theme_style = "Light"
       q = "CREATE TABLE if not exists SAVED (category text, left
            text, right text, unique (category,left,right))"      
       self.query_db(q)
       return Builder.load_file("components.kv")

يكمن التحدي في أيقونة قاعدة البيانات التي، عند الضغط عليها، تعرض جميع الفئات الموجودة وتتيح اختيار فئة واحدة. في ملف components.kv، ضمن شاشة الحفظ (المسماة “save”)، نضيف زر أيقونة (يسمى “category_dropdown_save”)، والذي عند الضغط عليه، يُشغّل دالة ()dropdown_save الخاصة بلغة بايثون من التطبيق الرئيسي.

تم تعريف هذه الدالة في ملف main.py وتعيد قائمة منسدلة بحيث يتم تعيين عنصر عند الضغط عليه إلى متغير يسمى “category”.

يربط سطر الكود الأخير متغير الفئة بالتسمية التي تظهر في واجهة المستخدم. يستدعي مدير الشاشة الشاشة باستخدام الدالة ()get_screen ويحدد العنصر بواسطة المعرّف (id).

عندما يدخل المستخدم إلى شاشة الحفظ، يجب أن تكون قيمة متغير الفئة فارغة (null) حتى يتم اختيار فئة. يمكننا تحديد خصائص الشاشة عند الدخول والخروج منها. لذا، سأضيف دالة في فئة الشاشة لتفريغ متغير التطبيق (App).

class SaveScreen(Screen):    
   def on_enter(self):        
       App.category = ''

بمجرد اختيار الفئة، يمكن للمستخدم إدخال النصوص الأخرى المطلوبة لحفظ النموذج (عن طريق الضغط على الزر).

للتأكد من أن الدالة لا تحفظ البيانات إذا كان أحد المدخلات فارغًا، سأستخدم مربع حوار.

from kivymd.uix.dialog import MDDialog

class App(MDApp):    
  dialog = None     
  
  def alert_dialog(self, txt):        
     if not self.dialog:            
        self.dialog = MDDialog(text=txt)        
     self.dialog.open()        
     self.dialog = None

  def save(self):
     self.category = self.root.get_screen('save').ids.category.text  
          if self.category == '' else self.category            
     left = self.root.get_screen('save').ids.left_input.text            
     right = self.root.get_screen('save').ids.right_input.text            
     if "" in [self.category.strip(), left.strip(), right.strip()]:                
          self.alert_dialog("Fields are required")            
     else:                
          q = f"INSERT INTO SAVED VALUES('{self.category}',
                '{left}','{right}')"                
          self.query_db(q)                
          self.alert_dialog("Saved")                  
          self.root.get_screen('save').ids.left_input.text = ''                
          self.root.get_screen('save').ids.right_input.text = ''                
          self.category = ''

بعد قراءة ما سبق، أنا واثق من قدرتك على مراجعة الكود بالكامل وفهم ما يجري. منطق الشاشات الأخرى مشابه إلى حد كبير.

الاختبار

يمكنك اختبار التطبيق على محاكي نظام التشغيل iOS على جهاز MacBook، والذي يحاكي بيئة iPhone دون الحاجة إلى جهاز iOS فعلي.

يلزم تثبيت Xcode. ابدأ بفتح الطرفية وتشغيل الأوامر التالية (سيستغرق الأمر الأخير حوالي 30 دقيقة):

brew install autoconf automake libtool pkg-config

brew link libtool

toolchain build kivy

الآن حدد اسم تطبيقك واستخدمه لإنشاء المستودع، ثم افتح ملف .xcodeproj:

toolchain create yourappname ~/some/path/directory

open yourappname-ios/yourappname.xcodeproj

وأخيرًا، إذا كنت تعمل مع نظام iOS وتريد اختبار تطبيق على هاتفك ثم نشره على متجر التطبيقات، فإن Apple تتطلب منك دفع رسوم للحصول على حساب مطور.

كانت هذه المقالة بمثابة دليل إرشادي لشرح كيفية تصميم وبناء تطبيق جوال متعدد المنصات باستخدام لغة بايثون. استخدمتُ مكتبة Kivy لتصميم واجهة المستخدم، وشرحتُ كيفية جعلها متوافقة مع أجهزة iOS. الآن، يمكنك إنشاء تطبيقاتك الخاصة باستخدام بايثون وKivy.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading