برنامج قائمة مهام بايثون للمبتدئين بالكود | بايثون بالمثال 18

إنشاء برنامج قائمة مهام بسيطة في بايثون للمبتدئين

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

سنخزن المهام داخل list، وتمثل كل مهمة بقاموس dict يحفظ عنوان المهمة وحالة اكتمالها. وسنستخدم while لعرض القائمة الرئيسية، وinput() لقراءة اختيار المستخدم، وappend() لإضافة المهام، وpop() لحذفها بعد التحقق من رقم المهمة.

إذا كنت تبحث عن كود To Do List للمبتدئين، فستجد هنا الكود الكامل أولًا ثم شرحًا خطوة بخطوة لكل جزء. هذا الإصدار لا يحفظ المهام بعد إغلاق البرنامج؛ حفظ البيانات في ملف سيكون تطويرًا لاحقًا للمشروع.

{alertInfo} الإجابة المختصرة: يمكن بناء قائمة مهام في بايثون باستخدام list لتخزين المهام، وdict لحفظ عنوان كل مهمة وحالتها، وحلقة while لتكرار قائمة الخيارات، ثم append() للإضافة وpop() للحذف.

{getToc} $title={محتوى المقال}

برنامج قائمة مهام بايثون: ماذا سنبني؟

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

===== قائمة المهام =====
1. عرض المهام
2. إضافة مهمة
3. تحديد مهمة كمكتملة
4. حذف مهمة
5. خروج

اختر رقم العملية:
الخيار ما الذي يفعله؟ المفهوم المستخدم
عرض المهام يعرض المهام مع رقم وحالة كل مهمة for وenumerate()
إضافة مهمة يضيف مهمة جديدة بعد التأكد أنها ليست فارغة append()
تحديد مهمة كمكتملة يغير حالة المهمة إلى مكتملة dict
حذف مهمة يحذف المهمة بعد التحقق من رقمها pop()
الخروج ينهي الحلقة والبرنامج break
فكرة برنامج قائمة المهام في بايثون باستخدام قائمة لتخزين المهام

الكود الكامل لبرنامج قائمة المهام

ضع الكود التالي في ملف باسم todo_list.py. هذه هي النسخة الكاملة التي سنشرح أجزاءها بعد ذلك:

def show_tasks(tasks):
    if not tasks:
        print("لا توجد مهام حتى الآن.")
        return

    print("\nقائمة المهام:")

    for index, task in enumerate(tasks, start=1):
        status = "تمت" if task["done"] else "لم تكتمل"
        print(f"{index}. {task['title']} - {status}")


def add_task(tasks):
    title = input("اكتب عنوان المهمة: ").strip()

    if title == "":
        print("لا يمكن إضافة مهمة فارغة.")
        return

    task = {
        "title": title,
        "done": False
    }

    tasks.append(task)
    print("تمت إضافة المهمة بنجاح.")


def complete_task(tasks):
    show_tasks(tasks)

    if not tasks:
        return

    try:
        task_number = int(input("اكتب رقم المهمة المكتملة: "))

        if 1 <= task_number <= len(tasks):
            tasks[task_number - 1]["done"] = True
            print("تم تحديد المهمة كمكتملة.")
        else:
            print("رقم المهمة غير موجود.")

    except ValueError:
        print("الرجاء إدخال رقم صحيح.")


def delete_task(tasks):
    show_tasks(tasks)

    if not tasks:
        return

    try:
        task_number = int(input("اكتب رقم المهمة التي تريد حذفها: "))

        if 1 <= task_number <= len(tasks):
            deleted_task = tasks.pop(task_number - 1)
            print(f"تم حذف المهمة: {deleted_task['title']}")
        else:
            print("رقم المهمة غير موجود.")

    except ValueError:
        print("الرجاء إدخال رقم صحيح.")


def show_menu():
    print("\n===== قائمة المهام =====")
    print("1. عرض المهام")
    print("2. إضافة مهمة")
    print("3. تحديد مهمة كمكتملة")
    print("4. حذف مهمة")
    print("5. خروج")


tasks = []

while True:
    show_menu()
    choice = input("اختر رقم العملية: ")

    if choice == "1":
        show_tasks(tasks)
    elif choice == "2":
        add_task(tasks)
    elif choice == "3":
        complete_task(tasks)
    elif choice == "4":
        delete_task(tasks)
    elif choice == "5":
        print("تم إغلاق البرنامج.")
        break
    else:
        print("اختيار غير صحيح. حاول مرة أخرى.")
{alertSuccess} الكود يتحقق من رقم المهمة قبل تعديلها أو حذفها، ويتعامل مع إدخال نص بدل رقم باستخدام try وexcept ValueError، لذلك لا يؤدي الرقم غير الموجود مباشرة إلى IndexError.

شرح الكود خطوة بخطوة

1. إنشاء قائمة لتخزين المهام

نبدأ بقائمة فارغة اسمها tasks. كل مهمة ستكون قاموسًا يحتوي على عنوان المهمة وحالتها:

tasks = []

task = {
    "title": "تعلم أساسيات بايثون",
    "done": False
}

المفتاح title يخزن نص المهمة، بينما done يحدد هل اكتملت المهمة أم لا. إذا كنت تحتاج مراجعة البنية نفسها، راجع شرح القوائم Lists وشرح القواميس Dictionary.

2. عرض المهام مع ترقيم صحيح

تعرض الدالة show_tasks() جميع المهام، وتبدأ الترقيم من 1 باستخدام enumerate(..., start=1) حتى يرى المستخدم أرقامًا طبيعية بدل فهارس القائمة التي تبدأ من 0.

def show_tasks(tasks):
    if not tasks:
        print("لا توجد مهام حتى الآن.")
        return

    for index, task in enumerate(tasks, start=1):
        status = "تمت" if task["done"] else "لم تكتمل"
        print(f"{index}. {task['title']} - {status}")

3. إضافة مهمة باستخدام append()

تقرأ الدالة add_task() عنوان المهمة عبر input()، ثم تستخدم strip() لإزالة المسافات الزائدة ومنع إضافة مهمة فارغة:

def add_task(tasks):
    title = input("اكتب عنوان المهمة: ").strip()

    if title == "":
        print("لا يمكن إضافة مهمة فارغة.")
        return

    tasks.append({
        "title": title,
        "done": False
    })
إضافة المهام وعرضها باستخدام list و for loop في بايثون

4. تحديد مهمة كمكتملة

بعد عرض المهام، يكتب المستخدم رقم المهمة. نحول الإدخال إلى عدد صحيح باستخدام int()، ثم نتحقق أن الرقم يقع بين 1 وعدد المهام قبل الوصول إلى القائمة:

if 1 <= task_number <= len(tasks):
    tasks[task_number - 1]["done"] = True
else:
    print("رقم المهمة غير موجود.")
{alertInfo} نستخدم task_number - 1 لأن المستخدم يرى المهمة الأولى بالرقم 1، بينما أول فهرس داخل القائمة في بايثون هو 0.

5. حذف مهمة بأمان باستخدام pop()

الحذف يستخدم الفكرة نفسها. لا نستدعي pop() إلا بعد التأكد أن رقم المهمة موجود:

if 1 <= task_number <= len(tasks):
    deleted_task = tasks.pop(task_number - 1)
    print(f"تم حذف المهمة: {deleted_task['title']}")
else:
    print("رقم المهمة غير موجود.")

استخدام التحقق قبل pop() مهم؛ لأن محاولة الوصول إلى فهرس غير موجود قد تسبب خطأ. أما في هذا البرنامج فالأرقام خارج المجال تحصل على رسالة واضحة بدل محاولة الحذف.

تحديد مهمة كمكتملة أو حذفها من قائمة المهام في بايثون

6. التعامل مع int() والإدخال غير الصحيح

الدالة input() تعيد نصًا، لذلك عند إدخال رقم مهمة نستخدم int(). وإذا كتب المستخدم نصًا مثل abc فإن int() ترفع ValueError، ولهذا أحطنا التحويل بـtry وexcept:

try:
    task_number = int(input("اكتب رقم المهمة: "))
except ValueError:
    print("الرجاء إدخال رقم صحيح.")

7. القائمة الرئيسية وحلقة while

تستمر حلقة while True في عرض الخيارات حتى يختار المستخدم الرقم 5. نستخدم if / elif / else لتحديد العملية المطلوبة، وbreak للخروج:

while True:
    show_menu()
    choice = input("اختر رقم العملية: ")

    if choice == "1":
        show_tasks(tasks)
    elif choice == "2":
        add_task(tasks)
    elif choice == "3":
        complete_task(tasks)
    elif choice == "4":
        delete_task(tasks)
    elif choice == "5":
        break
    else:
        print("اختيار غير صحيح. حاول مرة أخرى.")

إذا كنت تحتاج مراجعة هذه المفاهيم منفردة، راجع شرح if وelse وشرح الحلقات وشرح الدوال Functions.

إنشاء قائمة خيارات باستخدام while و input في برنامج مهام بايثون

تشغيل برنامج قائمة المهام وتجربته

بعد حفظ الملف باسم todo_list.py، شغله من الطرفية:

python todo_list.py

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

أخطاء شائعة في مشروع قائمة المهام

نسيان تحويل رقم المهمة إلى int()

إذا استخدمت قيمة input() مباشرة في عمليات حسابية أو في حساب الفهرس فستبقى القيمة نصًا. لذلك يحول البرنامج رقم المهمة باستخدام int() داخل try.

استخدام رقم المهمة مباشرة كفهرس

المستخدم يرى الترقيم من 1، لكن القائمة تبدأ من الفهرس 0. لذلك المهمة رقم 1 تقابل tasks[0]، ولهذا نستخدم task_number - 1.

الحذف بدون التحقق من حدود القائمة

استخدام pop() مع فهرس غير موجود قد يسبب خطأ. الكود الحالي يمنع ذلك بالشرط 1 <= task_number <= len(tasks) قبل الحذف.

إضافة مهمة فارغة

استخدام strip() ثم التحقق من النص يمنع إدخال مهمة لا تحتوي إلا على مسافات.

كيف تطور مشروع To Do List بعد ذلك؟

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

  • حفظ المهام في JSON حتى تبقى بعد إغلاق البرنامج.
  • إضافة تاريخ أو أولوية لكل مهمة.
  • إضافة خيار لتعديل عنوان مهمة.
  • تصفية المهام إلى مكتملة وغير مكتملة.
  • إنشاء واجهة رسومية لاحقًا بعد إتقان النسخة النصية.
{alertWarning} مهم: الإصدار الحالي يخزن المهام في الذاكرة فقط، لذلك تختفي عند إغلاق البرنامج. إذا أردت بقاءها، فالتطوير المناسب هو حفظ القائمة في ملف مثل JSON ثم قراءتها عند تشغيل البرنامج.

روابط مفيدة مرتبطة بالمشروع

الخلاصة والخطوة التالية

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

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

إرسال تعليق

أحدث أقدم