ما تحتاج معرفته قبل القراءة هو : python threading , PyQt
ان بايثون لا تسمح بتغيير او تحديث او تعديل واجهة المستخدم للبرنامج خارج ال main thread او العملية الأساسية للبرنامج ..
اي لا تستطيع تعديل نص في نافذة برنامجك من عملية خارجية thread عن طريق موديول threading
لذلك نستخدم كلاس QThread القادم مع موديول PyQt4 النستخدمة لتشكيل واجهة المستخدم.....
و نرسل اشارات SIGNAL و نربطها مع الكائن في واجهة المستخدم
مثال :
#! /usr/bin/python# -*- coding : utf-8 -*-from PyQt4 import QtGui, QtCoreimport time, sysgui=QtGui.QApplication.processEvents #خاصية تستخدم ﻷمر البرنامج بتحديث واجهة المستخدم حتى لا يتجمد و لا يستجيب للأوامرclass display():#أولا نقوم بتعريف كلاس فيه كائنات واجهة المستخدمtexttoset="" #متغيرapp=QtGui.QApplication(sys.argv) #نصنع كائن QApplication ضروري لبدء واجهة المستخدمdialog=QtGui.QDialog() #نصنع كائن مربع حوارdialog.resize(200, 150) #نحدد حجمهdialog.setMaximumSize(200, 150) #نحدد أكبر حجم مسموح به لمربع الحوارdialog.setMinimumSize(200, 150) #نحدد أصغر حجم مسموح به لمربع الحوارdialog.setWindowTitle("new dialog") #نحدد عنوان مربع الحوارlabel=QtGui.QLabel(dialog) #نصنع كائن نص داخل مربع الحوارlabel.setText("am a text label") #نحدد النصlabel.setGeometry(1, 20,200, 50)#نحدد القياسات x,y,width,highbutton=QtGui.QPushButton(dialog)#نصنع كائن زرbutton.setText("click me !")#نحدد النص لهbutton.setGeometry(1, 60, 200, 50)#نحدد القياساتdef changetext(self, value):#نعرف خاصية تغير النصif value==True:text=str(self.texttoset)#للتأكد بأنه سيكون نصself.label.setText(text)#نحدد النصui=display()#نصنع كائن يرث خصائص الكلاس display#الان نصنع QThread كلاسclass mythread(QtCore.QThread):#الكلاس يرث خصائصه من كلاس #QtCore.QThread#هذه الثريد ستغير النص من "i have changed by a QThread" الى "back all over again for the x time" و عند الانتهاء الى "QThread has finished" عشر مرات
def __init__(self):QtCore.QThread.__init__(self)#نصنع الكلاسdef run(self):#خاصية موروثة من كلاس QtCore.QThread فيها الأوامر التي ستنفذها العملية threadx=0while x<=10:s=str(x)display.texttoset="i have changed by a QThread"#نحدد النص الذي سنضعهself.emit(QtCore.SIGNAL("anysignalname(bool)"), True) #نرسل اشارة اسمها "anysignalname" تحمل متغير من نوع بوول يحمل قيمتين اما True او Falsetime.sleep(1)#توقف البرنامج لمدة 1 ثانيةgui()#حدث وواجهة المستخدمdisplay.texttoset="back all over again for "+s+" time"#نحدد النص مرة أخرىself.emit(QtCore.SIGNAL("anysignalname(bool)"), True) #نرسل الاشارة مرة اخرىtime.sleep(1)#توقف البرنامج لمدة ثانية واحدةgui()#حدث واجهة المستخدمx=x+1 #نزيد قيمة اكسdisplay.texttoset="QThread has finished!!"#نحدد النص عند الانتهاءself.emit(QtCore.SIGNAL("anysignalname(bool)"), True) #نرسل الاشارة مرة أخرىtime.sleep(1)#توقف البرنامج لمدة ثانية واحدةgui()#نحدث واجهة المستخدمthread1=mythread()#نصنع كائن يرث من كلاس mythreaddef start():thread1.start()def connecter():#خاصية ستصل الاشارات بالكائناتQtCore.QObject.connect(ui.button, QtCore.SIGNAL("clicked()"), start)#نصل كائن الزر بالخاصية startQtCore.QObject.connect(thread1, QtCore.SIGNAL("anysignalname(bool)"), ui.changetext)#نصل الكائن thread1 مع خاصية changetext التي ستغير النصui.dialog.show()#نظهر مربع الحوارconnecter()#نستدعي خاصية وصل الاشاراتui.app.exec_()#نبدأ بالعملية الأساسية
هذا البرنامج سيصنع مربع حوار فيه نص و زر اذا ضغطنا الزر سيتغير النص 10 مرات عن طريق عملية خارجية
ليست هناك تعليقات:
إرسال تعليق
لديك شيء لتقوله؟
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.