![wxPython: بناء تطبيقات سطح المكتب بلغة Python wxPython: بناء تطبيقات سطح المكتب بلغة Python، نظرة عامة على wxPython وميزاتها، مقارنة wxPython بأطر عمل GUI الأخرى،Tkinter،Kivy،PyQt،المقالات المقترحة حول wxPython،مقدمة إلى wxPython: بناء تطبيقات سطح المكتب بلغة Python،نظرة عامة على wxPython وميزاتها،مقارنة wxPython بأطر عمل GUI الأخرى،إعداد بيئة التطوير وبدء مشروع جديد،إنشاء نافذة بسيطة باستخدام wxPython،شرح أساسيات إنشاء النوافذ والإطارات،إضافة عناصر التحكم الأساسية (أزرار، تسميات، مربعات نصوص)،التعامل مع الأحداث (النقر، الكتابة، إلخ)،تخطيط واجهات المستخدم في wxPython،استخدام أدوات التخطيط (Sizers) لتنظيم العناصر،إنشاء واجهات مستخدم مرنة وقابلة للتكيف،مثال عملي لتخطيط واجهة مستخدم معقدة،التعامل مع الأحداث في wxPython،شرح مفهوم الأحداث وأنواعها المختلفة،ربط الأحداث بوظائف معالجة الأحداث،مثال عملي لتطبيق معالجة الأحداث،إنشاء عناصر تحكم مخصصة في wxPython،شرح كيفية إنشاء عناصر تحكم مخصصة لتلبية احتياجاتك،مثال عملي لإنشاء عنصر تحكم مخصص،استخدام wxPython مع قواعد البيانات نربط wxPython بقواعد البيانات (SQLite, MySQL, PostgreSQL)،عرض البيانات من قاعدة البيانات في واجهة المستخدم،مثال عملي لتطبيق يعرض بيانات من قاعدة بيانات،إنشاء تطبيقات متعددة النوافذ في wxPython،شرح كيفية إنشاء تطبيقات بأكثر من نافذة،التواصل بين النوافذ المختلفة،مثال عملي لتطبيق متعدد النوافذ،wxPython و multithreading،شرح كيفية استخدام wxPython مع multithreading لتجنب تجميد الواجهة،مثال عملي لتطبيق يستخدم multithreading،wxPython و Pygame: إنشاء ألعاب سطح مكتب،شرح كيفية دمج wxPython مع Pygame لإنشاء ألعاب سطح مكتب،مثال عملي لعبة بسيطة باستخدام wxPython و Pygame،نشر تطبيقات wxPython،شرح كيفية تجميع تطبيقات wxPython لنظام التشغيل Windows و macOS و Linux،استخدام أدوات التجميع المناسبة،wxPython: Building Desktop Applications in Python،wxPython Building Desktop Apps in Python،](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYYptaggGMPDQqQlfuXGIfNJS-Kj93fuW4zGKx_GPNmqK0eyFFW2_ShXsiMK_aO3BTSVM_c6qhO5IyCLjbnEoU2Yn_16JbfgLSCURakJigd5WZHNuzCcGvt2LO9Z1Q0koDoIaj-6pHVjx1pDc5KMSA0XH3i2ZkQ7DAejyjEdc05ou_PCp2W6MI7xCVjpws/s16000/wxPython-Building-Desktop-Apps-in-Python.webp)
wxPython: بناء تطبيقات سطح المكتب بلغة Python
الجزء الاول :
wxPython هي مكتبة Python قوية تُستخدم لإنشاء تطبيقات سطح
مكتب ذات واجهات مستخدم رسومية (GUI) عبر منصات التشغيل المختلفة، مثل
Windows و macOS و Linux ، تعتمد wxPython على مكتبة wxWidgets
المكتوبة بلغة ++C، مما يمنحها أداءً عاليًا ومظهرًا أصيلًا على كل منصة.
لماذا تختار wxPython؟
- مجانية ومفتوحة المصدر: wxPython مجانية ومتاحة للاستخدام والتعديل والتوزيع.
- عبر المنصات: تعمل تطبيقات wxPython على مجموعة متنوعة من
أنظمة التشغيل دون الحاجة إلى تغييرات كبيرة في الكود.
- مظهر أصيل: تتميز تطبيقات wxPython بمظهر وملمس أصيلين على كل منصة، مما يوفر تجربة مستخدم طبيعية.
- مجموعة واسعة من الميزات: توفر wxPython مجموعة واسعة من الأدوات والعناصر لبناء واجهات مستخدم غنية.
مقارنة wxPython بأطر عمل GUI الأخرى
توجد العديد من أطر عمل GUI الأخرى المتاحة لـ Python، مثل
Tkinter و PyQt و Kivy. لكل منها نقاط قوة وضعف :
- Tkinter: هي مكتبة GUI مدمجة مع Python، ولكنها قد تكون محدودة في بعض الميزات والمظهر.
- PyQt: هي مكتبة قوية ومرنة، ولكنها تتطلب ترخيصًا تجاريًا لبعض الاستخدامات.
- Kivy: هي مكتبة حديثة تركز على إنشاء تطبيقات متعددة اللمس، ولكنها
قد لا تكون الخيار الأفضل لتطبيقات سطح المكتب التقليدية.
تعتبر wxPython خيارًا جيدًا للمطورين الذين يبحثون عن مكتبة GUI قوية
ومجانية ومفتوحة المصدر وذات مظهر أصيل عبر المنصات.
**إعداد بيئة التطوير
للبدء في استخدام wxPython، تحتاج إلى تثبيت Python و wxPython على جهازك.
يمكنك تنزيل Python من الموقع الرسمي
لتثبيت wxPython، يمكنك استخدام أداة pip:
pip install wxPython
** إنشاء مشروع جديد
بعد تثبيت wxPython، يمكنك البدء في إنشاء مشروع جديد.
إليك مثال بسيط لإنشاء نافذة فارغة:
import wx
app = wx.App()
frame = wx.Frame(None, title="مرحبا بالعالم")
frame.Show()
app.MainLoop()
يشرح هذا الكود الأساسيات :
- ()wx.App: إنشاء تطبيق wxPython.
- ()wx.Frame: إنشاء إطار (نافذة).
- ()frame.Show: عرض النافذة.
- ()app.MainLoop: بدء حلقة الأحداث الرئيسية للتطبيق.
هذا مثال بسيط، ولكن يمكن استخدامه كنقطة انطلاق لإنشاء تطبيقات wxPython أكثر تعقيدًا.
إنشاء نافذة بسيطة باستخدام wxPython
في هذا المقال، سنتعلم كيفية إنشاء نافذة بسيطة باستخدام wxPython.
سنشرح أساسيات إنشاء النوافذ والإطارات، وإضافة عناصر التحكم الأساسية، والتعامل مع الأحداث.
** إنشاء نافذة وإطار
الخطوة الأولى هي إنشاء تطبيق wxPython ونافذة (إطار) باستخدام الكود التالي:
import wx
app = wx.App()
frame = wx.Frame(None, title="نافذة بسيطة")
frame.Show()
app.MainLoop()
- wx.App(): إنشاء تطبيق wxPython.
- wx.Frame(): إنشاء إطار (نافذة). الوسيط الأول هو الأصل (لا يوجد أصل في هذه الحالة)،
والوسيط الثاني هو العنوان.
- frame.Show(): عرض النافذة.
- app.MainLoop(): بدء حلقة الأحداث الرئيسية للتطبيق.
** إضافة عناصر التحكم
بعد إنشاء النافذة، يمكنك إضافة عناصر التحكم المختلفة إليها، مثل الأزرار والتسميات
ومربعات النصوص. إليك مثال لإضافة زر:
import wx
app = wx.App()
frame = wx.Frame(None, title="نافذة مع زر")
button = wx.Button(frame, label="اضغطني")
frame.Show()
app.MainLoop()
- wx.Button(): إنشاء زر. الوسيط الأول هو الأصل (النافذة)، والوسيط الثاني هو التسمية.
** التعامل مع الأحداث
لجعل عناصر التحكم تفاعلية، تحتاج إلى التعامل مع الأحداث المرتبطة بها، مثل النقر على الزر.
إليك مثال لكيفية عرض رسالة عند النقر على الزر:
import wx
def on_button_click(event):
wx.MessageBox("مرحبا!")
app = wx.App()
frame = wx.Frame(None, title="نافذة مع زر")
button = wx.Button(frame, label="اضغطني")
button.Bind(wx.EVT_BUTTON, on_button_click)
frame.Show()
app.MainLoop()
- button.Bind(): ربط حدث wx.EVT_BUTTON (النقر على الزر) بوظيفة on_button_click.
** مثال كامل **
إليك مثال كامل يوضح كيفية إنشاء نافذة مع زر يعرض رسالة عند النقر عليه:
import wx
def on_button_click(event):
wx.MessageBox("مرحبا!")
app = wx.App()
frame = wx.Frame(None, title="نافذة بسيطة")
button = wx.Button(frame, label="اضغطني")
button.Bind(wx.EVT_BUTTON, on_button_click)
frame.Show()
app.MainLoop()
ملاحظات
يمكنك إضافة المزيد من عناصر التحكم وتخصيصها حسب حاجتك.
يمكنك التعامل مع أنواع مختلفة من الأحداث، مثل الكتابة في مربع نص أو تحريك الفأرة.
wxPython توفر مجموعة واسعة من الأدوات لتصميم واجهات المستخدم التفاعلية.
في المقال التالي، سنتعلم كيفية تخطيط واجهات المستخدم باستخدام أدوات التخطيط (Sizers).
تخطيط واجهات المستخدم في wxPython
يُعد تخطيط واجهات المستخدم جزءًا هامًا من تطوير التطبيقات، حيث يضمن
تنظيم العناصر بشكل جيد وجذاب، ويجعل التطبيق سهل الاستخدام.
توفر wxPython أدوات قوية لتخطيط واجهات المستخدم، مثل Sizers،
التي تسمح بإنشاء واجهات مرنة وقابلة للتكيف مع أحجام الشاشات المختلفة.
ما هي Sizers؟
Sizers هي أدوات تخطيط ذكية في wxPython، تعمل على ترتيب وتوزيع
العناصر داخل النافذة أو الإطار بشكل تلقائي. تعتمد Sizers على مفهوم "الحجم المفضل"
لكل عنصر، حيث تخبر العناصر Sizers بحجمها المثالي،
وتقوم Sizers بترتيبها وتوزيعها بناءً على هذه المعلومات.
أنواع Sizers
توفر wxPython عدة أنواع من Sizers، كل منها متخصص في نوع معين من التخطيط:
- wx.BoxSizer: يرتب العناصر في صف واحد أفقيًا أو عمود واحد رأسيًا.
- wx.GridSizer: يرتب العناصر في شبكة ثنائية الأبعاد.
- wx.FlexGridSizer: يشبه GridSizer، ولكنه يوفر مرونة أكبر في تحديد أحجام العناصر.
- wx.GridBagSizer: يوفر تحكمًا دقيقًا في موضع وحجم كل عنصر في الشبكة.
- wx.StaticBoxSizer: يضيف مربعًا ثابتًا حول مجموعة من العناصر.
استخدام Sizers
لاستخدام Sizer، عليك القيام بالخطوات التالية:
- إنشاء Sizer: قم بإنشاء كائن من نوع Sizer المناسب.
- إضافة العناصر: أضف العناصر التي تريد ترتيبها إلى Sizer باستخدام دالة Add().
- تحديد الخصائص: حدد خصائص التوزيع والمحاذاة لكل عنصر داخل Sizer.
- تعيين Sizer للإطار: قم بتعيين Sizer للإطار أو النافذة التي ترغب في تخطيطها.
** مثال عملي **
لنفترض أننا نريد إنشاء نافذة تحتوي على زرين، أحدهما على اليسار والآخر على اليمين.
يمكننا استخدام wx.BoxSizer لتحقيق ذلك:
import wx
app = wx.App()
frame = wx.Frame(None, title="تخطيط باستخدام BoxSizer")
panel = wx.Panel(frame)
sizer = wx.BoxSizer(wx.HORIZONTAL)
button1 = wx.Button(panel, label="زر 1")
button2 = wx.Button(panel, label="زر 2")
sizer.Add(button1, 0, wx.ALL, 10)
sizer.Add(button2, 0, wx.ALL, 10)
panel.SetSizer(sizer)
frame.Show()
app.MainLoop()
في هذا المثال، قمنا بإنشاء wx.BoxSizer أفقي، وأضفنا إليه الزرين.
ثم قمنا بتعيين هذا الـ Sizer للوحة (Panel) التي تحتوي على العناصر.
* نصائح
ابدأ بتصميم بسيط، ثم قم بإضافة المزيد من العناصر تدريجيًا.
جرّب أنواع Sizers المختلفة، واختر النوع الأنسب لتصميمك.
استخدم خصائص التوزيع والمحاذاة لضبط مظهر واجهة المستخدم.
لا تتردد في استخدام Sizers متداخلة لإنشاء تخطيطات معقدة.
باستخدام Sizers، يمكنك إنشاء واجهات مستخدم جذابة ومرنة، تتكيف مع
أحجام الشاشات المختلفة، وتوفر تجربة مستخدم ممتازة.
التعامل مع الأحداث في wxPython
تُعتبر الأحداث جزءًا أساسيًا من أي تطبيق تفاعلي، حيث تمثل استجابة المستخدم
لأفعال معينة، مثل النقر على زر، أو الكتابة في مربع نص، أو تحريك الفأرة.
توفر wxPython آلية قوية للتعامل مع الأحداث، مما يتيح لك إنشاء تطبيقات ديناميكية وفعالة.
ما هي الأحداث؟
الأحداث هي إشارات يتم إرسالها بواسطة عناصر التحكم في واجهة المستخدم
للإبلاغ عن وقوع حدث معين. لكل نوع من الأحداث رقم تعريف خاص به،
ويتم تمرير معلومات حول الحدث إلى وظيفة معالجة الأحداث المرتبطة به.
ربط الأحداث بوظائف معالجة الأحداث
للاستجابة لحدث معين، عليك ربطه بوظيفة معالجة الأحداث المناسبة.
يتم ذلك باستخدام دالة Bind() الخاصة بعنصر التحكم :
control.Bind(event_type, event_handler)
- control: عنصر التحكم الذي يرتبط به الحدث.
- event_type: نوع الحدث، مثل wx.EVT_BUTTON للنقر على زر.
- event_handler: وظيفة معالجة الأحداث التي سيتم استدعاؤها عند وقوع الحدث.
أنواع الأحداث الشائعة
تتضمن wxPython مجموعة واسعة من أنواع الأحداث، ولكن بعضها أكثر شيوعًا من غيرها:
- wx.EVT_BUTTON: يتم إرساله عند النقر على زر.
- wx.EVT_TEXT: يتم إرساله عند تغيير النص في مربع نص.
- wx.EVT_MOUSE_MOTION: يتم إرساله عند تحريك الفأرة.
- wx.EVT_CLOSE: يتم إرساله عند إغلاق النافذة.
** مثال عملي **
لنفترض أننا نريد إنشاء نافذة تحتوي على زر، وعند النقر عليه، يتم عرض رسالة.
يمكننا تحقيق ذلك باستخدام الكود التالي:
import wx
def on_button_click(event):
wx.MessageBox("مرحبا!")
app = wx.App()
frame = wx.Frame(None, title="التعامل مع الأحداث")
button = wx.Button(frame, label="اضغطني")
button.Bind(wx.EVT_BUTTON, on_button_click)
frame.Show()
app.MainLoop()
في هذا المثال، قمنا بربط حدث wx.EVT_BUTTON الخاص بالزر بوظيفة
on_button_click()، التي تعرض رسالة عند استدعائها.
*ملاحظات
يمكن ربط حدث واحد بأكثر من وظيفة معالجة أحداث.
يمكن استخدام دالة event.Skip() للسماح بتمرير الحدث إلى معالج آخر.
توفر wxPython مجموعة واسعة من الأدوات لتطوير تطبيقات تفاعلية وفعالة.
باستخدام آلية الأحداث في wxPython، يمكنك إنشاء تطبيقات تستجيب
لأفعال المستخدم المختلفة، وتوفر تجربة مستخدم غنية وديناميكية.
في المقال التالي، سنتعلم كيفية إنشاء عناصر تحكم مخصصة في wxPython.
إنشاء عناصر تحكم مخصصة في wxPython
قد تحتاج في بعض الأحيان إلى إنشاء عناصر تحكم مخصصة في wxPython
لتلبية احتياجات تصميم أو وظائف معينة غير متوفرة في عناصر التحكم القياسية.
سنتعلم كيفية إنشاء عناصر تحكم مخصصة بسيطة، تشبه الشريط المنزلق الأفقي،
مع إمكانية التحكم في مظهره ووظائفه.
* الخطوات الأساسية
- إنشاء فئة مخصصة: قم بإنشاء فئة جديدة ترث من wx.Control.
- تحديد الأحداث: حدد الأحداث التي سيتم إطلاقها بواسطة عنصر التحكم المخصص، مثل تغيير القيمة.
- الرسم: قم بتOverride دالة OnPaint() لرسم عنصر التحكم المخصص على الشاشة.
- التعامل مع الأحداث: قم بتOverride دوال معالجة الأحداث للتعامل مع تفاعلات المستخدم، مثل النقر والسحب.
- تحديد الخصائص: حدد الخصائص التي يمكن التحكم بها من الخارج، مثل القيمة والمدى.
* مثال عملي: شريط منزلق أفقي مخصص
import wx
class MySlider(wx.Control):
def __init__(self, parent, id, value=0, min_value=0, max_value=100):
wx.Control.__init__(self, parent, id)
self.value = value
self.min_value = min_value
self.max_value = max_value
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
def OnPaint(self, event):
dc = wx.PaintDC(self)
width, height = self.GetSize()
# رسم الخلفية
dc.SetBackground(wx.Brush(wx.Colour(200, 200, 200)))
dc.Clear()
# رسم الشريط
track_width = width - 20
track_height = 10
track_x = 10
track_y = (height - track_height) // 2
dc.SetPen(wx.Pen(wx.Colour(150, 150, 150)))
dc.DrawRectangle(track_x, track_y, track_width, track_height)
# رسم المؤشر
cursor_width = 10
cursor_height = 20
cursor_x = track_x + int((self.value - self.min_value) / (self.max_value - self.min_value) * track_width) - cursor_width // 2
cursor_y = (height - cursor_height) // 2
dc.SetBrush(wx.Brush(wx.Colour(100, 100, 100)))
dc.DrawRectangle(cursor_x, cursor_y, cursor_width, cursor_height)
def OnMouse(self, event):
if event.LeftIsDown():
width, height = self.GetSize()
track_width = width - 20
track_x = 10
mouse_x = event.GetX()
new_value = int((mouse_x - track_x) / track_width * (self.max_value - self.min_value) + self.min_value)
self.value = max(self.min_value, min(self.max_value, new_value))
self.Refresh()
# إطلاق حدث تغيير القيمة
evt = wx.CommandEvent(wx.wxEVT_COMMAND_SLIDER_UPDATED, self.GetId())
evt.SetEventObject(self)
self.GetEventHandler().ProcessEvent(evt)
# استخدام الشريط المنزلق المخصص
class MyFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(300, 200))
panel = wx.Panel(self)
slider = MySlider(panel, id=wx.ID_ANY, value=50, min_value=0, max_value=100)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(slider, 0, wx.ALL | wx.EXPAND, 10)
panel.SetSizer(sizer)
self.Bind(wx.EVT_COMMAND_SLIDER_UPDATED, self.OnSliderChange, slider)
def OnSliderChange(self, event):
slider = event.GetEventObject()
print("القيمة الجديدة:", slider.value)
app = wx.App()
frame = MyFrame(None, "شريط منزلق مخصص")
frame.Show()
app.MainLoop()
* شرح الكود
- MySlider: فئة مخصصة ترث من wx.Control لإنشاء شريط منزلق أفقي.
- OnPaint: دالة لرسم الشريط المنزلق والمؤشر.
- OnMouse: دالة للتعامل مع النقر والسحب لتغيير قيمة الشريط المنزلق.
- wx.CommandEvent: إنشاء حدث مخصص ليتم إطلاقه عند تغيير قيمة الشريط المنزلق.
ملاحظات
يمكن تخصيص مظهر ووظائف الشريط المنزلق بشكل أكبر.
يمكن إضافة خصائص أخرى، مثل اتجاه الشريط المنزلق.
يمكن استخدام هذا المثال كنقطة انطلاق لإنشاء عناصر تحكم مخصصة أكثر تعقيدًا.
في المقال التالي، سنتعلم كيفية استخدام wxPython مع قواعد البيانات.