مرحبًا بكم في دليلنا الشامل لتطوير تطبيقات الجوال باستخدام بايثون Python! في هذا المقال، سنغطي كل شيء من أساسيات البرمجة ببايثون إلى أطر تطوير تطبيقات الجوال المتقدمة. سواء كنت مبتدئًا أو مطورًا ذا خبرة، فإن هذا الدليل سيوفر لك رؤى قيمة وأمثلة عملية لمساعدتك في إنشاء تطبيقات الجوال الخاصة بك.
جدول المحتويات
- مقدمة في بايثون
- إعداد بايثون
- البنية الأساسية وأنواع البيانات
- الهياكل التحكمية
- الدوال
- الهياكل البيانية المتقدمة
- التعامل مع الأخطاء
- الوحدات والحزم
- المزخرفات (Decorators)
- المولّدات (Generators)
- المكتبات والأطر المفيدة
- التزامن والتوازي
- المفاهيم المتقدمة في بايثون
- الاختبار
- تطوير الويب باستخدام Flask وDjango
- التحليل البياني المتقدم باستخدام Pandas
- تصوير البيانات باستخدام Matplotlib وSeaborn
- تطوير تطبيقات الجوال باستخدام بايثون
- مشروع عملي: تطبيق قائمة المهام
- موارد إضافية
- الخاتمة
١. مقدمة في بايثون
بايثون هي لغة برمجة عالية المستوى ومفسرة، معروفة بقراءتها السهلة وبساطتها. تُستخدم على نطاق واسع في تطوير الويب، تحليل البيانات، الحوسبة العلمية، الذكاء الاصطناعي، وتطوير تطبيقات الجوال.
٢. إعداد بايثون
أولاً، تحتاج إلى تثبيت بايثون على جهاز الكمبيوتر الخاص بك. يمكنك تنزيلها من الموقع الرسمي لبايثون. بعد التثبيت، يمكنك استخدام بيئة تطوير متكاملة (IDE) مثل PyCharm، VSCode، أو Jupyter Notebook لكتابة وتشغيل كود بايثون.
٣. البنية الأساسية وأنواع البيانات
تعلم الأساسيات المتعلقة ببنية بايثون وأنواع البيانات الأساسية، بما في ذلك الأعداد الصحيحة (integers)، الأعداد العشرية (floats)، السلاسل النصية (strings)، والقيم البوليانية (booleans).
برنامج “Hello World”
print("Hello, World!")
المتغيرات وأنواع البيانات
# عدد صحيح
a = 10
# عدد عشري
b = 3.14
# سلسلة نصية
c = "Hello, Python"
# قيمة بوليانية
d = True
التعليقات
# هذه تعليق سطر واحد
"""
هذه تعليق
متعدد الأسطر
"""
تمارين
تمرين: طباعة تفاصيلك
اكتب سكريبت بايثون يطبع اسمك، عمرك، ومدينة إقامتك.
الإجابة:
name = "أحمد"
age = 25
city = "الدوحة"
print(f"اسمي {name}، عمري {age} عامًا، وأعيش في {city}.")
تمرين: التجربة مع أنواع البيانات
جرب أنواع البيانات المختلفة واطبع قيمها.
الإجابة:
integer_value = 42
float_value = 3.14159
string_value = "مرحبًا بالعالم!"
boolean_value = True
print(integer_value)
print(float_value)
print(string_value)
print(boolean_value)
٤. هياكل التحكم Control Structures
تُستخدم هياكل التحكم للتحكم في تدفق التنفيذ في البرنامج.
العبارات الشرطية Conditional Statements
x = 10
if x > 5:
print("x أكبر من 5")
elif x == 5:
print("x يساوي 5")
else:
print("x أقل من 5")
الحلقات Loops
# حلقة for
for i in range(5):
print(i)
# حلقة while
i = 0
while i < 5:
print(i)
i += 1
تمارين
تمرين: تحقق من الرقم
اكتب برنامج بايثون يتحقق مما إذا كان الرقم موجبًا، سالبًا، أو صفرًا.
الإجابة:
number = int(input("أدخل رقمًا: "))
if number > 0:
print("الرقم موجب.")
elif number < 0:
print("الرقم سالب.")
else:
print("الرقم صفر.")
تمرين: طباعة الأرقام
أنشئ حلقة تطبع الأرقام من 1 إلى 20.
الإجابة:
for i in range(1, 21):
print(i)
٥. الدوال Functions
تساعدك الدوال في تنظيم الكود الخاص بك إلى كتل قابلة لإعادة الاستخدام.
تعريف الدوال
def greet(name):
return f"مرحبًا، {name}"
print(greet("علي"))
تمارين
تمرين: دالة حساب المضروب
اكتب دالة تحسب المضروب (factorial) لرقم.
الإجابة:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # الناتج: 120
تمرين: دالة تحقق من الكلمة العكسية
أنشئ دالة تتحقق مما إذا كانت السلسلة النصية (string) كلمة عكسية (palindrome).
الإجابة:
def is_palindrome(s):
return s == s[::-1]
print(is_palindrome("radar")) # الناتج: True
print(is_palindrome("hello")) # الناتج: False
٦. الهياكل البيانية المتقدمة
تعلم عن تراكيب البيانات المتقدمة مثل فهم القوائم (list comprehensions) والقواميس (dictionary comprehensions).
فهم القوائم
# إنشاء قائمة للمربعات
squares = [x ** 2 for x in range(10)]
print(squares)
فهم القواميس
# إنشاء قاموس يحتوي على الأرقام ومربعاتها
squares_dict = {x: x ** 2 for x in range(10)}
print(squares_dict)
تمارين
تمرين: الأرقام الزوجية
استخدم فهم القوائم لإنشاء قائمة تحتوي على الأرقام الزوجية من 1 إلى 20.
الإجابة:
even_numbers = [x for x in range(1, 21) if x % 2 == 0]
print(even_numbers)
تمرين: قاموس المكعبات
أنشئ قاموسًا يربط الأرقام بمكعباتها.
الإجابة:
cubes_dict = {x: x ** 3 for x in range(1, 11)}
print(cubes_dict)
٧. التعامل مع الأخطاء Error Handling
يتم التعامل مع الأخطاء في بايثون باستخدام كتل try
وexcept
.
كتل Try-Except Blocks
try:
result = 10 / 0
except ZeroDivisionError:
print("لا يمكنك القسمة على صفر!")
الاستثناءات المخصصة Custom Exceptions
class CustomError(Exception):
pass
try:
raise CustomError("هذا خطأ مخصص")
except CustomError as e:
print(e)
تمارين
تمرين: خطأ قراءة الملفات
اكتب برنامجًا يتعامل مع أخطاء قراءة الملفات.
الإجابة:
try:
with open("non_existent_file.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("لم يتم العثور على الملف!")
تمرين: خطأ مخصص
أنشئ خطأ مخصص للمدخلات غير الصالحة في دالة.
الإجابة:
class InvalidInputError(Exception):
pass
def check_positive(number):
if number < 0:
raise InvalidInputError("الأرقام السالبة غير مسموحة.")
return number
try:
print(check_positive(-5))
except InvalidInputError as e:
print(e)
٨. الوحدات والحزم Modules and Packages
تعلم كيفية إنشاء واستخدام الوحدات والحزم في بايثون.
إنشاء الوحدات
# my_module.py
def greet(name):
return f"مرحبًا، {name}"
# main.py
import my_module
print(my_module.greet("علي"))
إنشاء الحزم
# my_package/__init__.py
# my_package/module1.py
# my_package/module2.py
تمارين
تمرين: وحدة حساب المساحات
أنشئ وحدة تحتوي على دالة تحسب مساحة الأشكال المختلفة.
الإجابة:
# shapes.py
def area_of_circle(radius):
return 3.14159 * radius ** 2
def area_of_rectangle(length, width):
return length * width
# main.py
import shapes
print(shapes.area_of_circle(5)) # الناتج: 78.53975
print(shapes.area_of_rectangle(4, 6)) # الناتج: 24
تمرين: تنظيم الكود في حزم
نظم الكود الخاص بك في حزم واستوردها في السكريبت الرئيسي.
الإجابة:
# my_package/__init__.py
# my_package/module1.py
def greet(name):
return f"مرحبًا، {name}"
# my_package/module2.py
def farewell(name):
return f"وداعًا، {name}"
# main.py
from my_package import module1, module2
print(module1.greet("علي"))
print(module2.farewell("خالد"))
٩. المزخرفات (Decorators)
المزخرفات هي أداة قوية لتعديل سلوك الدوال أو الفئات.
المزخرفات في الدوال
def my_decorator(func):
def wrapper():
print("شيء يحدث قبل استدعاء الدالة.")
func()
print("شيء يحدث بعد استدعاء الدالة.")
return wrapper
@my_decorator
def say_hello():
print("مرحبًا!")
say_hello()
المزخرفات في الفئات
def add_methods(cls):
cls.new_method = lambda self: print("تمت إضافة طريقة جديدة")
return cls
@add_methods
class MyClass:
pass
obj = MyClass()
obj.new_method()
تمارين
تمرين: مسجل وقت التنفيذ
أنشئ مزخرفًا يسجل وقت تنفيذ دالة.
الإجابة:
import time
def time_logger(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"وقت التنفيذ: {end_time - start_time} ثوانٍ")
return result
return wrapper
@time_logger
def slow_function():
time.sleep(2)
print("اكتملت الدالة")
slow_function()
تمرين: إضافة طريقة للفئة
نفذ مزخرفًا يضيف طريقة جديدة إلى الفئة.
الإجابة:
def add_greeting(cls):
cls.greet = lambda self: print("مرحبًا بالعالم!")
return cls
@add_greeting
class MyClass:
pass
obj = MyClass()
obj.greet()
١٠. المولّدات (Generators)
المولّدات تسمح لك بالتنقل بين البيانات دون تخزين المجموعة بأكملها في الذاكرة.
def my_generator():
for i in range(10):
yield i
for value in my_generator():
print(value)
تمارين
تمرين: مولد الأعداد الزوجية
اكتب دالة مولدة تُرجع الأعداد الزوجية حتى حد معين.
الإجابة:
def even_numbers(limit):
for i in range(limit + 1):
if i % 2 == 0:
yield i
for num in even_numbers(10):
print(num)
تمرين: قارئ الملفات سطرًا بسطر
استخدم مولدًا لقراءة الملفات الكبيرة سطرًا بسطر.
الإجابة:
def read_lines(file_path):
with open(file_path, "r") as file:
for line in file:
yield line.strip()
for line in read_lines("large_file.txt"):
print(line)
١١. المكتبات والأطر المفيدة
استكشف المكتبات مثل NumPy، Pandas، Matplotlib، Flask، وDjango.
NumPy
import numpy as np
array = np.array([1, 2, 3, 4, 5])
print(array.mean())
Pandas
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)
Matplotlib
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]
plt.plot(x, y)
plt.xlabel('المحور السيني')
plt.ylabel('المحور الصادي')
plt.title('رسم بياني عينة')
plt.show()
Flask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "مرحبًا، Flask!"
if __name__ == '__main__':
app.run(debug=True)
Django
# هذا مثال على عرض بسيط في Django
from django.http import HttpResponse
def home(request):
return HttpResponse("مرحبًا، Django!")
تمارين
تمرين: عمليات NumPy
أنشئ مصفوفة NumPy ونفذ عمليات حسابية أساسية.
الإجابة:
import numpy as np
array = np.array([1, 2, 3, 4, 5])
print(array + 10)
print(array * 2)
print(array.mean())
تمرين: تحميل CSV باستخدام Pandas
حمّل ملف CSV باستخدام Pandas ونفذ تحليلًا للبيانات.
الإجابة:
import pandas as pd
df = pd.read_csv("data.csv")
print(df.head())
print(df.describe())
تمرين: رسم بياني باستخدام Matplotlib
أنشئ رسمًا بيانيًا بسيطًا باستخدام Matplotlib.
الإجابة:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.plot(x, y, marker='o')
plt.xlabel('المحور السيني')
plt.ylabel('المحور الصادي')
plt.title('مثال على رسم بياني')
plt.grid(True)
plt.show()
تمرين: تطبيق ويب باستخدام Flask
أنشئ تطبيق ويب بسيط باستخدام Flask.
الإجابة:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "مرحبًا بكم في تطبيق Flask!"
@app.route('/about')
def about():
return "هذه صفحة حول."
if __name__ == '__main__':
app.run(debug=True)
تمرين: مشروع Django
أنشئ مشروع Django بسيط وأضف عروض جديدة.
الإجابة:
# تثبيت Django
pip install django
# إنشاء مشروع Django جديد
django-admin startproject myproject
# إنشاء تطبيق جديد
cd myproject
python manage.py startapp myapp
# إضافة 'myapp' إلى INSTALLED_APPS في settings.py
# إنشاء عرض في myapp/views.py
from django.http import HttpResponse
def home(request):
return HttpResponse("مرحبًا، Django!")
def contact(request):
return HttpResponse("تواصل معنا عبر contact@example.com")
# إضافة العرض إلى myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home),
path('contact/', views.contact),
]
# تضمين myapp.urls في myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
# تشغيل الخادم
python manage.py runserver
١٢. التزامن والتوازي Concurrency and Parallelism
تعلم عن تنفيذ التزامن والتوازي باستخدام threading وmultiprocessing.
threading
import threading
def print_numbers():
for i in range(10):
print(i)
thread = threading.Thread(target=print_numbers)
thread.start()
multiprocessing
import multiprocessing
def print_numbers():
for i in range(10):
print(i)
process = multiprocessing.Process(target=print_numbers)
process.start()
تمارين
تمرين: البرمجة متعددة الخيوط
أنشئ برنامجًا متعدد الخيوط يطبع الأرقام بالتوازي.
الإجابة:
import threading
def print_numbers():
for i in range(5):
print(f"الخيط {threading.current_thread().name}: {i}")
threads = []
for i in range(3):
thread = threading.Thread(target=print_numbers, name=f"Thread-{i}")
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
تمرين: المهام متعددة العمليات
نفذ برنامجًا متعدد العمليات للقيام بالمهام الحسابية.
الإجابة:
import multiprocessing
def compute_square(n):
print(f"مربع {n} هو {n * n}")
numbers = [1, 2, 3, 4, 5]
processes = []
for number in numbers:
process = multiprocessing.Process(target=compute_square, args=(number,))
processes.append(process)
process.start()
for process in processes:
process.join()
١٣. المفاهيم المتقدمة في بايثون
استكشف مفاهيم مثل مديري السياق (context managers) وتلميحات الأنواع (type hinting).
مديري السياق
with open("example.txt", "w") as file:
file.write("مرحبًا بالعالم!")
تلميحات الأنواع
def greeting(name: str) -> str:
return f"مرحبًا، {name}"
print(greeting("علي"))
تمارين
تمرين: مدير سياق مخصص
أنشئ مدير سياق مخصص باستخدام __enter__
و __exit__
.
الإجابة:
class CustomContextManager:
def __enter__(self):
print("دخول السياق")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("خروج من السياق")
with CustomContextManager():
print("داخل السياق")
تمرين: إضافة تلميحات الأنواع
أضف تلميحات الأنواع إلى الدوال والفئات الخاصة بك.
الإجابة:
def add(a: int, b: int) -> int:
return a + b
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def greet(self) -> str:
return f"مرحبًا، اسمي {self.name} وعمري {self.age} عامًا."
person = Person("علي", 30)
print(person.greet())
١٤. الاختبار
تعلم كيفية كتابة اختبارات الوحدة باستخدام unittest
و pytest
.
اختبار الوحدة باستخدام unittest
import unittest
def add(a, b):
return a + b
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
if __name__ == '__main__':
unittest.main()
اختبار الوحدة باستخدام pytest
# احفظ هذا في ملف باسم test_example.py
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0
# شغل الاختبارات باستخدام: pytest test_example.py
تمارين
تمرين: اختبارات الوحدة باستخدام unittest
اكتب اختبارات الوحدة للدوال الخاصة بك باستخدام unittest
.
الإجابة:
import unittest
def multiply(a, b):
return a * b
class TestMath(unittest.TestCase):
def test_multiply(self):
self.assertEqual(multiply(2, 3), 6)
self.assertEqual(multiply(-1, 1), -1)
self.assertEqual(multiply(0, 5), 0)
if __name__ == '__main__':
unittest.main()
تمرين: الاختبارات المتعددة باستخدام pytest
استخدم pytest
لإنشاء اختبارات متعددة.
الإجابة:
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(2, 3, 5),
(3, 4, 7),
])
def test_add(a, b, expected):
assert add(a, b) == expected
# شغل الاختبارات باستخدام: pytest test_example.py
١٥. تطوير الويب باستخدام Flask وDjango
أنشئ تطبيقات ويب باستخدام Flask وDjango.
Flask – واجهة برمجة التطبيقات REST
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api', methods=['GET'])
def get_data():
return jsonify({"message": "مرحبًا بالعالم!"})
@app.route('/api', methods=['POST'])
def post_data():
data = request.json
return jsonify(data), 201
if __name__ == '__main__':
app.run(debug=True)
إعداد Django الأساسي
# تثبيت Django
pip install django
# إنشاء مشروع Django جديد
django-admin startproject myproject
# إنشاء تطبيق جديد
cd myproject
python manage.py startapp myapp
# إضافة 'myapp' إلى INSTALLED_APPS في settings.py
# إنشاء عرض في myapp/views.py
from django.http import HttpResponse
def home(request):
return HttpResponse("مرحبًا، Django!")
def about(request):
return HttpResponse("حول هذا الموقع")
# إضافة العرض إلى myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home),
path('about/', views.about),
]
# تضمين myapp.urls في myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
# تشغيل الخادم
python manage.py runserver
تمارين
تمرين: واجهة برمجة التطبيقات REST باستخدام Flask
أنشئ واجهة برمجة تطبيقات بسيطة باستخدام Flask.
الإجابة:
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api/greet', methods=['GET'])
def greet():
name = request.args.get('name', 'العالم')
return jsonify({"message": f"مرحبًا، {name}!"})
if __name__ == '__main__':
app.run(debug=True)
تمرين: عروض Django
أنشئ موقعًا بسيطًا باستخدام Django وأضف عروض جديدة.
الإجابة:
# تثبيت Django
pip install django
# إنشاء مشروع Django جديد
django-admin startproject myproject
# إنشاء تطبيق جديد
cd myproject
python manage.py startapp myapp
# إضافة 'myapp' إلى INSTALLED_APPS في settings.py
# إنشاء عرض في myapp/views.py
from django.http import HttpResponse
def home(request):
return HttpResponse("مرحبًا، Django!")
def contact(request):
return HttpResponse("تواصل معنا عبر contact@example.com")
# إضافة العرض إلى myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home),
path('contact/', views.contact),
]
# تضمين myapp.urls في myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
# تشغيل الخادم
python manage.py runserver
١٦. التحليل البياني المتقدم باستخدام Pandas
قم بإجراء التحليل البياني المتقدم باستخدام Pandas.
التجميع والتجميع
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
'Score': [85, 92, 78, 95, 85]}
df = pd.DataFrame(data)
# التجميع حسب الاسم وحساب متوسط الدرجات
grouped = df.groupby('Name').mean()
print(grouped)
دمج DataFrames
data1 = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df1 = pd.DataFrame(data1)
data2 = {'Name': ['Alice', 'Bob', 'David'],
'Salary': [70000, 80000,
90000]}
df2 = pd.DataFrame(data2)
merged = pd.merge(df1, df2, on='Name', how='outer')
print(merged)
تمارين
تمرين: التجميع والتجميع
حمّل مجموعة بيانات ونفذ التجميع والتجميع.
الإجابة:
import pandas as pd
data = {'Department': ['المبيعات', 'الموارد البشرية', 'تكنولوجيا المعلومات', 'المبيعات', 'تكنولوجيا المعلومات'],
'Employee': ['علي', 'أحمد', 'خالد', 'سعيد', 'ماجد'],
'Salary': [50000, 60000, 70000, 55000, 65000]}
df = pd.DataFrame(data)
# التجميع حسب القسم وحساب متوسط الرواتب
grouped = df.groupby('Department')['Salary'].mean()
print(grouped)
تمرين: دمج DataFrames
دمج اثنين من DataFrames ونفذ تحليل البيانات.
الإجابة:
data1 = {'Employee': ['علي', 'أحمد', 'خالد'],
'Department': ['المبيعات', 'الموارد البشرية', 'تكنولوجيا المعلومات']}
df1 = pd.DataFrame(data1)
data2 = {'Employee': ['علي', 'خالد', 'ماجد'],
'Project': ['المشروع أ', 'المشروع ب', 'المشروع ج']}
df2 = pd.DataFrame(data2)
merged = pd.merge(df1, df2, on='Employee', how='outer')
print(merged)
١٧. تصوير البيانات باستخدام Matplotlib وSeaborn
قم بتصوير البيانات باستخدام Matplotlib وSeaborn.
Matplotlib
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]
plt.plot(x, y, marker='o')
plt.xlabel('المحور السيني')
plt.ylabel('المحور الصادي')
plt.title('رسم بياني عينة')
plt.show()
Seaborn
import seaborn as sns
import pandas as pd
data = {'X': [1, 2, 3, 4, 5], 'Y': [10, 20, 25, 30, 35]}
df = pd.DataFrame(data)
sns.lineplot(x='X', y='Y', data=df)
plt.title('مثال على رسم بياني باستخدام Seaborn')
plt.show()
تمارين
تمرين: رسم بياني باستخدام Matplotlib
أنشئ رسمًا بيانيًا باستخدام Matplotlib.
الإجابة:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.plot(x, y, marker='o')
plt.xlabel('المحور السيني')
plt.ylabel('المحور الصادي')
plt.title('مثال على رسم بياني')
plt.grid(True)
plt.show()
تمرين: تصوير البيانات باستخدام Seaborn
استخدم Seaborn لتصوير مجموعة بيانات.
الإجابة:
import seaborn as sns
import pandas as pd
data = {'Category': ['A', 'B', 'C', 'A', 'B', 'C'],
'Values': [10, 20, 15, 25, 30, 35]}
df = pd.DataFrame(data)
sns.barplot(x='Category', y='Values', data=df)
plt.title('مثال على رسم بياني باستخدام Seaborn')
plt.show()
١٨. تطوير تطبيقات الجوال باستخدام بايثون
استكشف الأطر المختلفة لتطوير تطبيقات الجوال باستخدام بايثون، مثل Kivy، BeeWare، وPython-for-Android.
Kivy
Kivy هي مكتبة بايثون مفتوحة المصدر لتطوير التطبيقات متعددة اللمس. تعمل على لينكس، ويندوز، OS X، أندرويد، و iOS.
تطبيق Kivy الأساسي
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text="مرحبًا، Kivy!")
if __name__ == '__main__':
MyApp().run()
BeeWare
BeeWare تسمح لك بكتابة تطبيقات أصلية باستخدام بايثون لنظام iOS، أندرويد، وغيرها من الأنظمة.
تطبيق BeeWare الأساسي
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class MyApp(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN))
name_label = toga.Label('اسمك: ', style=Pack(padding=(0, 5)))
self.name_input = toga.TextInput(style=Pack(flex=1))
greet_button = toga.Button(
'تحية',
on_press=self.say_hello,
style=Pack(padding=5)
)
main_box.add(name_label)
main_box.add(self.name_input)
main_box.add(greet_button)
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
def say_hello(self, widget):
print(f"مرحبًا، {self.name_input.value}!")
def main():
return MyApp()
if __name__ == '__main__':
main().main_loop()
Python-for-Android (p4a)
Python-for-Android هي أداة لإنشاء ملفات APK مستقلة لنظام أندرويد.
إنشاء APK
p4a create --dist_name=myapp --bootstrap=sdl2 --requirements=kivy --package=org.example.myapp --name "MyApp" --version=0.1
cd myapp
p4a apk --dist_name=myapp --release --signkey=~/path/to/your.keystore
KivyMD
KivyMD هي مجموعة من عناصر تصميم المواد لاستخدامها مع Kivy.
تطبيق KivyMD الأساسي
from kivymd.app import MDApp
from kivymd.uix.label import MDLabel
class MyApp(MDApp):
def build(self):
return MDLabel(text="مرحبًا، KivyMD!", halign="center")
if __name__ == '__main__':
MyApp().run()
تمارين
تمرين: تطبيق جوال باستخدام Kivy
أنشئ تطبيق جوال أساسي باستخدام Kivy.
الإجابة:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
class MyApp(App):
def build(self):
layout = BoxLayout(orientation='vertical')
self.label = Label(text="اضغط على الزر")
button = Button(text="اضغط علي", on_press=self.on_button_press)
layout.add_widget(self.label)
layout.add_widget(button)
return layout
def on_button_press(self, instance):
self.label.text = "تم الضغط على الزر!"
if __name__ == '__main__':
MyApp().run()
تمرين: تطبيق BeeWare
طور تطبيقًا بسيطًا باستخدام BeeWare وقم بتشغيله على جهازك الجوال.
الإجابة:
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class MyApp(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN))
self.label = toga.Label('اضغط على الزر', style=Pack(padding=(0, 5)))
button = toga.Button('اضغط علي', on_press=self.on_button_press, style=Pack(padding=5))
main_box.add(self.label)
main_box.add(button)
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
def on_button_press(self, widget):
self.label.text = "تم الضغط على الزر!"
def main():
return MyApp()
if __name__ == '__main__':
main().main_loop()
تمرين: حزمة APK باستخدام Python-for-Android
استخدم Python-for-Android لحزم تطبيق Kivy في APK.
الإجابة:
# تأكد من تثبيت التبعيات اللازمة
pip install python-for-android
# إنشاء دليل تطبيق Kivy وملف main.py
mkdir mykivyapp
cd mykivyapp
echo "from kivy.app import App\nfrom kivy.uix.label import Label\n\nclass MyApp(App):\n def build(self):\n return Label(text='مرحبًا، Kivy!')\n\nif __name__ == '__main__':\n MyApp().run()" > main.py
# بناء APK
p4a create --dist_name=mykivyapp --bootstrap=sdl2 --requirements=kivy --package=org.example.mykivyapp --name "MyKivyApp" --version=0.1
cd mykivyapp
p4a apk --dist_name=mykivyapp --release
--signkey=~/path/to/your.keystore
١٩. مشروع عملي: تطبيق قائمة المهام
دعونا نضع كل شيء معًا وننشئ مشروعًا كاملًا: تطبيق قائمة المهام باستخدام Kivy وSQLite.
تثبيت التبعيات
pip install kivy sqlite3
الكود الرئيسي للتطبيق
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
import sqlite3
class ToDoApp(App):
def build(self):
self.conn = sqlite3.connect('todos.db')
self.create_table()
self.layout = BoxLayout(orientation='vertical')
self.task_input = TextInput(hint_text='أدخل مهمة')
self.layout.add_widget(self.task_input)
self.add_button = Button(text='إضافة مهمة', on_press=self.add_task)
self.layout.add_widget(self.add_button)
self.tasks_layout = BoxLayout(orientation='vertical')
self.layout.add_widget(self.tasks_layout)
self.display_tasks()
return self.layout
def create_table(self):
with self.conn:
self.conn.execute('CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, task TEXT)')
def add_task(self, instance):
task = self.task_input.text
if task:
with self.conn:
self.conn.execute('INSERT INTO tasks (task) VALUES (?)', (task,))
self.task_input.text = ''
self.display_tasks()
def display_tasks(self):
self.tasks_layout.clear_widgets()
cursor = self.conn.execute('SELECT * FROM tasks')
for row in cursor:
task_label = Label(text=row[1])
self.tasks_layout.add_widget(task_label)
def on_stop(self):
self.conn.close()
if __name__ == '__main__':
ToDoApp().run()
تمارين
تمرين: تمديد تطبيق قائمة المهام
مدد تطبيق قائمة المهام ليشمل وظيفة الحذف والتحديث.
الإجابة:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
import sqlite3
class ToDoApp(App):
def build(self):
self.conn = sqlite3.connect('todos.db')
self.create_table()
self.layout = BoxLayout(orientation='vertical')
self.task_input = TextInput(hint_text='أدخل مهمة')
self.layout.add_widget(self.task_input)
self.add_button = Button(text='إضافة مهمة', on_press=self.add_task)
self.layout.add_widget(self.add_button)
self.tasks_layout = GridLayout(cols=3)
self.layout.add_widget(self.tasks_layout)
self.display_tasks()
return self.layout
def create_table(self):
with self.conn:
self.conn.execute('CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, task TEXT)')
def add_task(self, instance):
task = self.task_input.text
if task:
with self.conn:
self.conn.execute('INSERT INTO tasks (task) VALUES (?)', (task,))
self.task_input.text = ''
self.display_tasks()
def delete_task(self, task_id):
with self.conn:
self.conn.execute('DELETE FROM tasks WHERE id = ?', (task_id,))
self.display_tasks()
def update_task(self, task_id, new_task):
with self.conn:
self.conn.execute('UPDATE tasks SET task = ? WHERE id = ?', (new_task, task_id))
self.display_tasks()
def display_tasks(self):
self.tasks_layout.clear_widgets()
cursor = self.conn.execute('SELECT * FROM tasks')
for row in cursor:
task_id, task_text = row
task_label = Label(text=task_text)
delete_button = Button(text='حذف', on_press=lambda instance, task_id=task_id: self.delete_task(task_id))
update_button = Button(text='تحديث', on_press=lambda instance, task_id=task_id: self.update_task(task_id, self.task_input.text))
self.tasks_layout.add_widget(task_label)
self.tasks_layout.add_widget(delete_button)
self.tasks_layout.add_widget(update_button)
def on_stop(self):
self.conn.close()
if __name__ == '__main__':
ToDoApp().run()
تمرين: تحديد المهام كمكتملة
أضف خاصية لتحديد المهام كمكتملة.
الإجابة:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.properties import BooleanProperty
import sqlite3
class ToDoApp(App):
def build(self):
self.conn = sqlite3.connect('todos.db')
self.create_table()
self.layout = BoxLayout(orientation='vertical')
self.task_input = TextInput(hint_text='أدخل مهمة')
self.layout.add_widget(self.task_input)
self.add_button = Button(text='إضافة مهمة', on_press=self.add_task)
self.layout.add_widget(self.add_button)
self.tasks_layout = GridLayout(cols=4)
self.layout.add_widget(self.tasks_layout)
self.display_tasks()
return self.layout
def create_table(self):
with self.conn:
self.conn.execute('CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, task TEXT, completed BOOLEAN)')
def add_task(self, instance):
task = self.task_input.text
if task:
with self.conn:
self.conn.execute('INSERT INTO tasks (task, completed) VALUES (?, ?)', (task, False))
self.task_input.text = ''
self.display_tasks()
def delete_task(self, task_id):
with self.conn:
self.conn.execute('DELETE FROM tasks WHERE id = ?', (task_id,))
self.display_tasks()
def update_task(self, task_id, new_task):
with self.conn:
self.conn.execute('UPDATE tasks SET task = ? WHERE id = ?', (new_task, task_id))
self.display_tasks()
def toggle_task_completion(self, task_id, current_state):
with self.conn:
self.conn.execute('UPDATE tasks SET completed = ? WHERE id = ?', (not current_state, task_id))
self.display_tasks()
def display_tasks(self):
self.tasks_layout.clear_widgets()
cursor = self.conn.execute('SELECT * FROM tasks')
for row in cursor:
task_id, task_text, completed = row
task_label = Label(text=task_text, color=(0, 1, 0, 1) if completed else (1, 0, 0, 1))
delete_button = Button(text='حذف', on_press=lambda instance, task_id=task_id: self.delete_task(task_id))
update_button = Button(text='تحديث', on_press=lambda instance, task_id=task_id: self.update_task(task_id, self.task_input.text))
toggle_button = Button(text='اكتملت' if not completed else 'غير مكتملة', on_press=lambda instance, task_id=task_id, current_state=completed: self.toggle_task_completion(task_id, current_state))
self.tasks_layout.add_widget(task_label)
self.tasks_layout.add_widget(delete_button)
self.tasks_layout.add_widget(update_button)
self.tasks_layout.add_widget(toggle_button)
def on_stop(self):
self.conn.close()
if __name__ == '__main__':
ToDoApp().run()
٢٠. موارد إضافية
إليك بعض الموارد الإضافية المجانية لمساعدتك في تعلم وممارسة بايثون وتطوير تطبيقات الجوال:
دورات عبر الإنترنت
- Coursera: Python for Everybody – مجاني للمراجعة.
- edX: Introduction to Computer Science using Python – مجاني للمراجعة.
- Khan Academy: Intro to Python – مجاني للوصول.
كتب ودروس
- Automate the Boring Stuff with Python بواسطة Al Sweigart – مجاني للقراءة عبر الإنترنت.
- W3Schools Python Tutorial – درس مجاني على الإنترنت.
- Real Python – دروس ومقالات مجانية.
أدوات
- PyCharm Community Edition – بيئة تطوير متكاملة مجانية لبايثون.
- Visual Studio Code – محرر كود مجاني مع دعم بايثون.
- Jupyter Notebook – أداة مجانية للعلم التفاعلي والحوسبة العلمية.
منصات للممارسة
- LeetCode – تحديات برمجة مجانية ومشاكل للممارسة.
- HackerRank – تحديات برمجة مجانية ومش
اكل للممارسة.
- Codewars – تحديات برمجة مجانية ومشاكل للممارسة.
٢١. الخاتمة
نأمل أن يكون هذا الدليل قد قدم لك رؤى قيمة حول تطوير تطبيقات الجوال باستخدام بايثون. في نيو ويفز لتطوير تطبيقات الجوال، نحن متخصصون في إنشاء تطبيقات الجوال عالية الجودة المصممة خصيصًا لتلبية احتياجاتك. اتصل بنا عبر WhatsApp https://wa.me/97460077635، أو اتصل على +97455574988، أو راسلنا عبر البريد الإلكتروني info@new-waves.net لمناقشة احتياجاتك في تطوير التطبيقات.
باتباع هذه الخطوات واستخدام الكود المقدم، يمكنك البدء في تطوير تطبيقات الجوال باستخدام بايثون. نتمنى لك برمجة سعيدة!