بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
السلام عليكم ورحمة الله وبركاته
مدخل بسيط لتبدأ تعلم pygobject بشكل بسيط أي لإنشاء برامج رسومية من خلال Gtk+ لاكن من خلال لغة البرمجة بايثون .
هدف الشرح أن يكون بداية ولا أعلم ولا اعد أني ساكتب غيره قد أكتب وقد لا أكتب ,بالنسبة لمتطلبات الشرح يجب من يقرأ الموضوع أن يكون تعلم بايثون بالفعل خاصة الكلاسات والورائة لاكن ساحاول توضيح بعض الأمور عند الضرورة ,الشرح سيكون بالصور أضع الصورة وأسفلها الشرح وسيكون من خلال بايثون إصدار ثلاثة.
-أولا تثبيت pygobject على فيدورا أما باقي التوزيعات غالبا إسم الحزمة لن يختلف او قد يختلف قليلا لا اعلم إبحثو في مدير الحزم عن كلمة pygobject.
sudo dnf install python3-gobject
الأن الشرح :
2-قمت بالإخبار اني أريد إستخدام Gtk بإصدار ثلاثة .
3-قمت بإستدعاء Module أو وحدة Gtk هذه الوحدة توفر متغيرات ودوال
وبعض الاشياء المهمة والأهم كلاسات أي أصناف جاهزة بإعدادات إفتراضية ممكن تغيرها
هذه الأصناف لها خواص وأفعال و...إلخ امثلة عن هذه الأصناف نافذة البرنامج window
الأزرار button و...إلخ ملاحظة يجب أن نراعي حالت الأحرف أثناء الشرح يعني Gtk و ليس gtk.
4-قمت بإنشاء object أو كائن من صنف نافذة window طبعا هذا الصنف مازال بالإعدادات الإفتراضية.
5-طلبت من هذا الكائن إظهار نفسه وإظهار كل شيء داخله طبعا إن وجدو مثل الأزرار و ...إلخ .
6-قمت بإستدعاء دالة Gtk.main وهي بشكل بسيط هذه هي دورة حياة البرنامح يتم رسم كل شيء مطلوب
مثلا النافذة و...إلخ ولا يخرج البرنامج بعدها بل يتم الدخول في حلقة بإنتظار مدخلات المستخدم مثلا الضغط على الزر الفلاني و...إلخ .
نلاحظ عند الضغط على شكل ال X للخروج من البرنامج إختفت النافذة لاكن في الحقيقة البرنامج
أو دورة حياة البرنامج مازالت تعمل يعني البرنامج لم يتم الخروج منه بشكل صحيح لهذا إحتجت لقتله بالقوة من خال Kill وهو شيء خاص بنظام لينكس ولا دخل له بموضوعنا .
الان للخروج من البرنامج بشكل صحيح نضيف هذا السطر وشرحه هو إذا قام أحد بالضغط على X
وتسمى delete-event إذا حصل هذا الأمر نفذ دالة Gtk.main_quit وهي دالة توفرها وحدة Gtk
وهي لعكس مفعول Gtk.main أي لإنهائها طبعا ممكن وضع أي دالة أخرى مكانها
مثلا ممكن إنشاء دالة خاصة بنا نضع فيها بعض الأشياء التي نريد تنفيذها قبل خروج البرنامج
ثم اخر الدالة نضع ()Gtk.main_quit نلاحظ أنها دالة عادية لاكن عندما نضعها في connect لا نضيف الأقواص لها أو لغيرها من الدوال.
لكل فئة في Gtk خواص أو ما يسمى Properties وأفعال method يمكن تغير هذه الخواص بشكل مباشر
وممكن من خلال ال Method ومنها set وget .مثال عن هذه الخواص tille أي نضع عنوان للنافذة
ممكن وضع هذا العناون من خلال set ثم علامة _ ثم إسم الخاصية وممكن إستبدال set ب get للإستعلام .
الان العمل من خلال ما يسمى البرمجة الكائنية في الحقيقحة لها عشرات الترجمات كل واحد فاتح على حسابو على العموم من المفروض أن من يتابع يعرف ماذا أعني .
قمت بإنشاء كلاس أو صنف جديد يرث صنف Gtk.Window ثم وضعت في دالة البناء أو ال constructor انه هذا الصنف يجب إعطائه قيمة عند إنشائه أكرر يجب على من يقرأ أن يكون يعرف عن ماذا أتكلم ,نلاحظ كيف يمكننا إعطائه خواص مباشرتا من دون إستخدام set وكيف ممكن إستخدام set.
(لا تهتمو أني على السرعة كاتب my fist promrag :D )
أمور إضاقية ليست مهمة لنا الان لاكن لاحظو كيف يمكن إنشاء دالة تقوم بتشغيل دورة حياة البرنامج وإظهار النافذة وكيف يمكن إستدعائها بأكثر من طريقة .
خاصية أخرى وهي موقع النافذة عندما يتم إظهارها من هذه المواقع MOUSE اي مكان مأشر الفأرة كيف حصلت على هذه المعلومات بكل بساطة من وثائق Gtk+ الرسمية على الرغم انها وثائق للغة C لاكن يمكن التوفيق بين الإثنين حيث ان الإختلافات طفيفة يكفي ان تعرفو كيف تعمل الامور على العموم الصور في الاسفل تشرح هذه الأشياء .
نلاحظ إسم الخاصية ونوع القيمة التي سنعطيها إياها قد يكون نوع نصي مثل خاصية title أو نوع رقمي مثل خواص عرض النافذة وإرتفاعها وقد يكون True او False وقد يكون النوع هو صنف أخر وقد يكون أشياء أخرى .
نضغط على القيمة التي تأخذها هذه الخاصية حتى نقرأ عنها قليلا.
وتسمى delete-event إذا حصل هذا الأمر نفذ دالة Gtk.main_quit وهي دالة توفرها وحدة Gtk
وهي لعكس مفعول Gtk.main أي لإنهائها طبعا ممكن وضع أي دالة أخرى مكانها
مثلا ممكن إنشاء دالة خاصة بنا نضع فيها بعض الأشياء التي نريد تنفيذها قبل خروج البرنامج
ثم اخر الدالة نضع ()Gtk.main_quit نلاحظ أنها دالة عادية لاكن عندما نضعها في connect لا نضيف الأقواص لها أو لغيرها من الدوال.
لكل فئة في Gtk خواص أو ما يسمى Properties وأفعال method يمكن تغير هذه الخواص بشكل مباشر
وممكن من خلال ال Method ومنها set وget .مثال عن هذه الخواص tille أي نضع عنوان للنافذة
ممكن وضع هذا العناون من خلال set ثم علامة _ ثم إسم الخاصية وممكن إستبدال set ب get للإستعلام .
الان العمل من خلال ما يسمى البرمجة الكائنية في الحقيقحة لها عشرات الترجمات كل واحد فاتح على حسابو على العموم من المفروض أن من يتابع يعرف ماذا أعني .
قمت بإنشاء كلاس أو صنف جديد يرث صنف Gtk.Window ثم وضعت في دالة البناء أو ال constructor انه هذا الصنف يجب إعطائه قيمة عند إنشائه أكرر يجب على من يقرأ أن يكون يعرف عن ماذا أتكلم ,نلاحظ كيف يمكننا إعطائه خواص مباشرتا من دون إستخدام set وكيف ممكن إستخدام set.
(لا تهتمو أني على السرعة كاتب my fist promrag :D )
أمور إضاقية ليست مهمة لنا الان لاكن لاحظو كيف يمكن إنشاء دالة تقوم بتشغيل دورة حياة البرنامج وإظهار النافذة وكيف يمكن إستدعائها بأكثر من طريقة .
خاصية أخرى وهي موقع النافذة عندما يتم إظهارها من هذه المواقع MOUSE اي مكان مأشر الفأرة كيف حصلت على هذه المعلومات بكل بساطة من وثائق Gtk+ الرسمية على الرغم انها وثائق للغة C لاكن يمكن التوفيق بين الإثنين حيث ان الإختلافات طفيفة يكفي ان تعرفو كيف تعمل الامور على العموم الصور في الاسفل تشرح هذه الأشياء .
نلاحظ إسم الخاصية ونوع القيمة التي سنعطيها إياها قد يكون نوع نصي مثل خاصية title أو نوع رقمي مثل خواص عرض النافذة وإرتفاعها وقد يكون True او False وقد يكون النوع هو صنف أخر وقد يكون أشياء أخرى .
نضغط على القيمة التي تأخذها هذه الخاصية حتى نقرأ عنها قليلا.
نلاحظ GtkWindowType وفي الأسفل NONE و CENTER وMOUSE و ...إلخ الان ترجمة هذا في بايثون هو كالتالي مثلا Gtk.WindowType.CENTER .
نلاحظ أيضا كيف ممكن إعطاء قيمة هذه الخاصية بشكل مباشر ملاحظة مهمة في وثائق لغة C الخاصية إسمها window-position في بايثون نستبدل علامة الناقص بعلامة _ لتصبح هكذا window_position .
خاصية deletable وهي تأخذ قيمة True او False وهي لإظهار أو إلغاء إظهار علامة X لإغلاق النافذة .
أخيرا أتمنى ان يكون الموضوع مفيد شرح هذه الأمور من خلال الكتابة أمر صعب جدا لاكني حاولت قدر الإمكان تبسيط الأمور الذي يهمكم هو الوثائق الرسمية والخواص والأفعال للأصناف لهذا شرحت كيف يمكن الإستفادة من وثائق موجهة للغة C .
تعديل يوجد مرجع ل Pygobject من دون المرجع الخاص ل Gtk بلغة C .
https://lazka.github.io/pgi-docs/
وأيضا ملاحظة Gtk.WindowType وما شابهها قد تكون Enum او Flag وممكن أيضا إختيارها على الرقم المحدد شيء كهذا.
Gtk.WindowType(2)
نلاحظ في الصورة في الأسفل ان النافذة Window ترث Gtk.Bin وهي تمثل شيء مثل مستوعب لا يساع إلا عنصر واحد وممكن إدخال هذا العنصر من خلال وظيقة add .
أضفت زر button إلى النافذة window من خلال وظيفة add نلاحظ ان الزر ملء النافذة بالكامل.
إذا حاولت إضافة زر ثاني لن يتم إضافته وساحصل على الخطأ ونلاحظ أيضا معلومة جديدة كيف ممكن أن أغير أو أستعلم عن قيمة properties ما من دون إستخدام get و set .
فإذا ما هو الحل ؟
الحل هو إضافة شيء ما يرث Gtk.Container وهو أيضا شيء مثل مستوعب لاكن ممكن أن أضيف له أكثر من عنصر وحتى ممكن ان أضيف له أكثر من Container أخر أو حتى Bin أخر مثال كما في الأسفل عن Vbox و هي كصندوق يرتب الأشياء بشكل عامودي VERTICAL .
نلاحظ أنه يرث Gtk.Container مع الملاحظة Vbox هي أيضا ترث Gtk.Box الذي ممكن إستخدامه أيضا لاكن نحتاج أن نمرر له هل نريد أن ترتب العناصر داخله بشكل أفقي او عامودي كما في الأسفل .
Gtk.Box.new(orientation=Gtk.Orientation.HORIZONTAL)
وتساوي Gtk.HBox
Gtk.Box.new(orientation=Gtk.Orientation.VERTICAL)
وتساوي Gtk.VBox
ممكن إستخدام أي طريقة هم فقط وفرو subclass لل box توفر تحديد الإتجاه مع الملاحظة Gtk.Orientaion أيضا من النوع Enum وممكن تحديدها من خلال الرقم كما نلاحظ في الرابط في الأسفل.