ابحث في المدونة

الأربعاء، 12 فبراير 2020

برمجة تطبيق بواجهة رسومية يقوم بأخذ قيم نصية من المستخدم وعرضها بالترتيب الأبجدي على text box عن طريق لغة بايثون

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

فكرة الكود هي رسم واجهة مستخدم GUI تحتوي على زرين ومربع تحرير text box 
يقوم الزر المسمى add بعرض نافذة حوارية تطلب من المستخدم إدخال نص معين
هذا النص الذي يدخله المستخدم يتم إدراجه في مصفوفة array 
يمكن للمستخدم الضغط على الزر عدة مرات لإدراج نصوص أخرى
يتم وضع كل نص كعنصر على المصفوفة , ثم يقوم البرنامج بترتيبها ترتيبًا أبجديًا.
ثم يقوم البرنامج بتحويل المصفوفة إلى نص string عادي ويضع كل عنصر في سطر جديد ويعرضه في مربع التحرير text box
وهناك زر آخر اسمه cleer يقوم بتفريغ محتوى المربع النصي.
المستفاد من الكود هو معرفة عدة نقاط بقضية التعامل مع المصفوفات , وكيفية تحويلها إلى نص عادي وفصل العناصر في سطر جديد , وأيضًا معرفة وظيفة الترتيب الأبجدي للعناصر في المصفوفات.

استخدمنا مكتبة wx لإنشاء الواجهات الرسومية 
إن كانت المكتبة غير مثبتة لديك فيمكنك القيام بالخطوات التالية لتثبيتها على بيئة بايثون الخاصة بك.
1. افتح قائمة ابدأ واكتب كلمة cmd واضغط enter.
2. اكتب الكود التالي:
pip install wxpython


3. انتظر قليلًا ليتم تنزيل المكتبة وتثبيتها على الجهاز.
4. بعد الفروغ من تثبيت المكتبة ؛ يمكنك إغلاق نافذة موجه الأوامر لإكمال الخطوات.


سأضع لكم الكود وأترك لكم حرية قراءته وتجربته والتعديل عليه.
وبلا شك أن ذلك سيعود على المتعلم بالنفع والفائدة.



import wx #استدعاء مكتبة wx
app = wx.App()  # إنشاء كائن wx , حيث أنه لا يمكن إنشاء أي نافذة رسومية gui عبر مكتبة wx دون إنشاء هذا الكائن
class MyProgram(wx.Frame):  #بدء الكلاس الرئيسي للبرنامج. أطلقنا على الكلاس اسم MyProgram , كما أن هذا الكلاس يرث من الكلاس المسؤول عن إنشاء النوافذ من مكتبة wx واسمه Frame
 blanc = []  #متغير اسمه blanc أسندنا إليه كائن من نوع list ونلاحظ أن ال list المسندة لا تحتوي على أي عناصر. والغاية من ذلك هو استخدام الكائن في وقت لاحق
 def __init__(self):  #دالة البناء للكلاس , ولم نعطها أي معاملات سوى المعامل self. وفي الحقيقة فإن هذا المعامل إلزامي طالما أن الدالة تم أنشاؤها داخل كلاس.
  wx.Frame.__init__(self,parent=None,title="app window",name="app window",size=(500,500)) #هذا الكود يندرج تحت مفهوم إعادة تعريف الدوال داخل الكلاسات , وهنا قمنا بإعادة تعريف دالة البناء الخاصة بكلاس الأب wx.Frame والتي تحمل بعض المعاملات المسبقة كعنوان النافذة title واسم النافذة name والنافذة الحاوية للنافذة وهي بطبيعة الحال None أي لا توجد نافذة حاوية للنافذة الرئيسية للبرنامج
  self.Centre() #وضع النافذة في وسط الشاشة
  p = wx.Panel(self) #إنشاء لائحة استعدادًا لوضع العناصر عليها
  self.edit1 = wx.TextCtrl(p,-1,name="content",style=wx.TE_MULTILINE+wx.TE_READONLY,size=(100,100),pos=(30,30)) #مربع تحرير متعدد الأسطر وللقراءة فقط. وتلاحظون أن المتغير الذي أسند عليه مربع التحرير قد سبقناه بعبارة self. والغرض من ذلك هو جعل هذا الحيز عامًا يمكن استخدامه واستدعائه على كافة دوال الكلاس
  addBTN = wx.Button(p,-1,label="add",size=(50,50),pos=(30,140)) #زر جديد باسم add
  addBTN.Bind(wx.EVT_BUTTON,self.onAdd) #ربط الزر بدالة onAdd التي تتنفذ بمجرد وقوع حدث الضغط على الزر
  cleerBTN = wx.Button(p,-1,label="cleer",size=(50,50),pos=(130,140)) #زر باسم cleer
  cleerBTN.Bind(wx.EVT_BUTTON,self.onCleer) #ربط الزر cleer بدالة onCleer
  self.Show() #عرض النافذة
 def onAdd(self,event):  #بدء دالة onAdd المربوطة بالزر add. ونجد أنها تحمل معاملين اثنين. الأول self وهو ضروري لربط الدالة بالكلاس , والثاني هو event وهو ضروري أيضًا لتمرير حدث الضغط على الزر.
  txt = wx.GetTextFromUser("encert your text here","your text",parent=self)  #طلبنا من المستخدم أن يدخل نصًا ووضعنا النص على متغير باسم txt
  if txt == "": #إذا لم يدخل المستخدم شيئًا
   pass  #فلا تقم بعمل أي إجراء
  else: #وإلا
   self.blanc.append(txt) #أضف النص المدخل إلى الlist الذي أسميناه blanc والذي كان فارغًا في البداية
  self.blanc.sort() #رتب عناصر القائمة ترتيبًا أبجديًا
  self.edit1.SetValue("\n".join(self.blanc)) #تعيين محتوى مربع التحرير. وسيكون محتوى المربع هنا عناصر القائمة blanc بعد أن حولناها إلى string وجعلنا كل عنصر في سطر جديد
 def onCleer(self,event): #تعريف دالة تفريغ مربع التحرير المرتبطة بالزر cleer
  if self.blanc == []: #إذا كانت القائمة blanc فارغة
   pass #فلا تقم بأي إجراء
  else: #وإلا
   self.blanc = []  #إعادة تعيين قيمة الlist بجعلها قائمة فارغة
   self.edit1.SetValue("")  #تفريغ مربع التحرير
   wx.MessageBox("the text field was cleared successfully","success") #إظهار رسالة حوارية تفيد بنجاح العملية
MyProgram() #تنفيذ الكلاس
app.MainLoop() #استخدام الحلقة التكرارية المستمرة. حيث أن هذه الحلقة تنتظر من المستخدم أن يقوم هو بإغلاق النافذة, يعني ذلك أننا لو لم نستخدم السطر السابق فإن النافذة ستظهر وتختفي في غضون ثواني معدودة. فهذا السطر إذًا يبقي النافذة مفتوحة استعدادًا لتلقي أوامر المستخدم.

هناك تعليق واحد:

قل شيئًا