يناير 30، 2009

سلسلة البرمجة الرسومية بواسطة باي كيوت PyQt4 للمبتدئين 02

في أول تدوينة قمنا بإنشاء الواجهة الرسومية لآلتنا الحاسبة بإستخدام Qt Designer (مصمم الواجهات لـ كيوت) ثم قمنا بحفضها تحت إسم PyCalc.ui

إن قمت بفتح ملف الواجهة بواسطة notepad مثلا سترى أن الواجهة حفظت على شكل نصي تراتبي.

لإستخدام تلك الواجهة مع بايثون هنالك طريقتين على حد علمي:
1. القيام بعملية تحويل (compiling) لملف الواجهة حتى يصبح قابل للإستخدام مع بايثون.
2. إستخدام و ربط ملف الواجهة بطريقة ديناميكية. و أنا سأستخدم هذه الأخيرة للمرونتها.

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

أولا، خصص مجلد خاص بالعمل تضع فيه ملف PyCalc.ui و باقي الملفات التي سنظيفها لحقا داخله.

ثانيا يجب أن تنتبه إلى الطريقة التي كتبت بها الشفرة المصدرية Source Code خصوصا الفرق بين الحروف الصغيرة و الكبيرة (q ليست Q) و الفرق بين النقطة (.) و الفاصلة (,)
أيضا يجب عليك أن تفهم أن بايثون يستخدم مفتاح (tab) للتمييز بين أجزاء الشفرة على عكس اللغات الأخرى التي قد تستخدم {} أو begin و end


من هنا تبدأ الرحلة (لا تنسى أن تضع قطعة شوكلاتة في فمك قبل أن تبدأ) :)

سيكون هذفنا هو ربط واجهة الآلة الحاسبة مع بايثون و إظهارها للمستخدم.

1. قم بتشغيل محرر IDLE الذي تم تثبيته مع بايثون و قم بتحرير ملف جديد File->New Window

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

سنحتاج في هذه المرحلة إلى وحدة sys و PyQt4 (لاحظ الفرق في الكتابة بين الحروف الصغيرة و الكبيرة)

من أجل ذلك سنقوم بعملية الإستراد لهذه الوحدات بواسطة

import sys
from PyQt4 import QtCore, QtGui, uic


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

نعم، هذه الطريقة موجودة و تسمى بالأقسام بحيث نعتبر برنامجنا كقسم يمكن إستخدامه في برانامج آخر، و الذي قد يصبح قسم في برنامج آخر ذات يوم. هذا النوع من البرمجة يسمى بالبرمجة الموجهة نحو أو المعتمدة على الكائنات (Object-Oriented Programming) أو (OOP)

مفهوم الأقسام أكبر من الشرح الذي قدمته لكن هذا كل ما نحتاج إلى معرفته الآن.

ستكون الشفرة المصدرية كما يلي:
class CalcApp(QtGui.QDialog):
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        uic.loadUi("PyCalc.ui", self)

بحيث نعتبر أن برنامج الآلة الحاسبة سيكون قسم تحت إسم CalcApp (السطر 1) و الذي سيقوم بتحميل ملف الواجهة الرسومية PyCalc.ui (السطر 4) فور تشغيل القسم. بالنسبة للسطر 2 و 3 يمكن إعتبارها صالحة للإستعداد المبدئي لعرض الواجهة و تهيئة البرنامج لذلك.

غير أن قسم CalcApp لا يعمل من تلقاء نفسه بل يحتاج لمن يستدعيه حتى يعمل و هذا ما سنراه بعد قليل.

إذا قلنا أنه يتم الإستعداد للتهيئة و بدأ برنامج أو قسم ما، فهنا يمكن أن نفهم أنه يجب تحديد إسم القسم الذي نريد أن نهيئه. فماذا إن كنا نريد أن نهيئ نفس القسم الذي نعمل عليه؟ هنا نستخدم كلمة self للتعبير عن القسم الذي نعمل عليه، بحيث يغنينا هذا عن ذكر الإسم كل مرة و نكتفي بدكر self=نفسك.

و كيف بعدها نميز بين الشفرة المصدرية التي ستتكلف بإعداد/تهيئة القسم عن باقي الشفرة المصدرية التي سنضيفها لحقا؟ لهذا وجدة __init__ التي يتم إستخدامها لتهية الأقسام.

كما سبق و أن أشرنا أنه من الممكن أن يحتوي قسم على قسم أخر عندما قدمنا مثال برنامج المحاسبة الذي يستخدم الآلة الحاسبة لإجراء عملية حسابية ما. فكيف ننادي على قسم الآلة الحاسبة لإجراء حساب معين و نحن نعمل أو متواجدين في برنامج المحاسبة؟ للقيام بدلك نستخدم رمز (.) النقطة للفصل بين الأقسام مثل QtGui.QWidget.__init__ بحيث نستدعي __init__ التي تتواجد بقسم QWidget الذي بدوره يتواجد بقسم QtGui

جيد، الآن حان الوقت لكتابة الشفرة المصدرية المسؤولة عن إستدعاء قسم CalcApp ثم إظهار الواجهة الرسومية للآلة الحاسبة. ستكون الشفرة على ما يلي:

app = QtGui.QApplication(sys.argv)

widget = CalcApp()
widget.show()

sys.exit(app.exec_())


السطر الأول و الرابع مكلفين بتهيئة الواجهة الرسومية كيوت Qt و إغلاق البرنامج بشكل صحيح عند الإنتهاء منه.
السطر الثاني يستدعي قسم CalcApp و سننسبه إلى widget حتى نستطيع التحكم فيه.
السطر الثالث نطلب من widget التي تمثل قسم CalcApp أن تقوم بعرض الواجهة الرسومية على المستخدم.

سيكون شكل الشفرة المصدرية عند الإنتهاء على هذا الشكل:

import sys
from PyQt4 import QtCore, QtGui, uic

class CalcApp(QtGui.QDialog):
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        uic.loadUi("PyCalc.ui", self)


app = QtGui.QApplication(sys.argv)

widget = CalcApp()
widget.show()

sys.exit(app.exec_())

قم بحفظه تحت إسم PyCalc.py ثم قم بتشغيله من خلال قائمة run->run module أو بالضغط مباشرة على مفتاح F5.
بالتوفيق :)

ليست هناك تعليقات:

إرسال تعليق