مقدمه
پس اگر میخواهیم کاربران برنامهای که نوشتیم، فقط برنامهنویسان نباشند و افراد عادی هم بتوانند از آن استفاده کنند و راضی باشند باید به شکل ظاهر آن توجه کنیم و آن را بصورت کاربر پسند و زیبا ایجاد کنیم. ماژولهای زیادی برای این کار وجود دارند مخصوصاً برای افرادی که از از زبان برنامه نویسی پایتون استفاده میکنند، یکی از این ماژولها همین موضوع بحث ما یعنی pyqt میباشد. حالا در ادامه به آموزش pyqt5 و توضیح در مورد آن میپردازیم.
pyqt5 توسط ریوربنک کامپیوتینگ (Riverbank Computing) به عنوان آخرین نسخه ابزار GUI (رابط کاربری گرافیکی) تولید شد. در حقیقت pyqt5 کتابخانهای است که به شما امکان میدهد از چارچوب Qt GUI Python استفاده کنید. به زبانی دیگر میتوان گفت که pyqt5 ترکیبی از کتابخانه QT و پایتون است که برای برنامهنویسان نرمافزار، که علاقهمند به تولید برنامههای گرافیکی هستند قابل استفاده است. حتی ایجاد یک installer برای برنامه شما را نیز پوشش میدهد.
PyQt با تمام سیستمهای عامل محبوبی که میشناسیم از قبیل ویندوز، لینوکس، mac سازگاری دارد و با استفاده از Python3 و Qt در ایجاد رابط کاربری گرافیکی در این سیستمعاملها، بکار میرود. این رابط گرافیکی دارای مجوز دوگانه است یعنی تحت لیسانس GPL و لیسانس تجاری در دسترس میباشد. PyQt5 در نسخههایی که پایتون قدیمیتر از ۲.۶ دارند پشتیبانی نمیشود.
ممکن است بعضی وقتها (Py)Qt4 را در وب پیدا کنید، ولی این نسخه یک نسخه قدیمی است و دیگر پشتیبانی نمیشود. برای اینکه از این آموزش pyqt5 بتوانید استفاده کنید بهتر است که آشنایی مقدماتی با اصطلاحات برنامهنویسی و زبان پایتون داشته باشید.
ماژولهای پرکاربرد PyQt API
PyQt API مجموعه ای از ماژولها است که شامل تعداد زیادی کلاس و توابع پایتون میباشد. در حالی که ماژول QtCore دارای عملکرد غیر GUI برای کار با فایل و دایرکتوری و غیره است، ماژول QtGui شامل تمام کنترلهای گرافیکی میباشد. علاوه بر این، ماژولهایی برای کار با XML (QtXml)، SVG (QtSvg) و SQL (QtSql) و غیره وجود دارند. در ادامه لیستی از ماژولهای پرکاربرد را باهم میبینیم:
- QtCore : کلاسهای اصلی که GUI نیستند و توسط ماژول های دیگر استفاده می شود.
- QtGui : اجزای رابط کاربری گرافیکی.
- QtMultimedia : کلاسهای برنامهنویسی چند رسانهای سطح پایین .
- QtNetwork : کلاسهای برنامهنویسی شبکه.
- QtOpenGL : کلاسهای پشتیبانی OpenGL.
- QtScript : کلاسهای ارزیابی اسکریپتهای Qt.
- QtSql : کلاسهای یکپارچه سازی پایگاه داده با استفاده از SQL.
- QtSvg : کلاسهای نمایش محتویات فایلهای SVG.
- QtWebKit : کلاسهای رندر و ویرایش HTML.
- QtXml : کلاسهای مدیریت XML.
- QtWidgets : کلاسهایی برای ایجاد رابطهای کاربری کلاسیک به سبک دسکتاپ (desktop-style).
- QtDesigner : کلاسهای توسعه Qt Designer.
مزیت ماژول pyqt5 نسبت به دیگر ماژولها
کلاسهای موجود در این ماژول به قدری زیاد است که همین میتواند دلیل خوبی برای استفاده این فریم وورک نسبت به سایرین باشد. اما designer برنامهای که برای طراحی، توسعه یافته است بهترین مزیت این ماژول محسوب میشود. PyQt با یک ابزار سازنده رابط کاربری گرافیکی به نام Qt Designer ارائه میشود. با استفاده از رابط drop & drag ساده آن، یک رابط کاربری گرافیکی را میتوان به سرعت بدون نیاز به نوشتن کد ساخت. با این حال، این Designer یک IDE مانند ویژوال استودیو نیست. از این رو، Qt Designer امکان اشکال زدایی و ساخت برنامه را ندارد.
PyQt5 از ترکیب زبان برنامهنویسی پایتون و فریمورک Qt بهره میبرد و امکان ساخت برنامههای با رابط کاربری زیبا و حرفهای را در پایتون فراهم میکند. در لینک زیر برای ارائه در این زمینه پاورپوینت PYQT5 در پایتون با پسوند pptx در ۲۰ اسلاید قرار داده شده است.
جدیدترینها در بحث آموزش pyqt5
همانطور که قبلا گفتیم pyqt5 در نسخههای قدیمیتر از نسخه ۲.۶ پایتون پشتیبانی نمیشود. همچنین PyQt5 از متد ()connect از کلاس QObject که برای اتصال بین سیگنال و slot بکار میرود پشتیبانی نمیکند. بنابراین کد زیر دیگر بکار نمیرود.
QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
و فقط syntax زیرتعریف شده است.
widget.signal.connect(slot_function)
کلاسهایی که در ماژول QtGui قبلی تعریف شده بودند اکنون در ماژولهای QtGui، QtPrintSupport و QtWidgets توزیع شدهاند. در کلاس جدید QFileDialog، متد ()getOpenFileNameAndFilter با ()getOpenFileName و متد ()getOpenFileNamesAndFilter با ()getOpenFileNames و ()getSaveFileNameAndFilter با ()getSaveFileName جایگزین شده است. ضمناً امضاهای قدیمیتر این روشها نیز تغییر کرده است. قابل ذکر است که pyqt5 قوانینی برای تعریف کلاس که خودش زیر کلاسی برای بیش از یک کلاس Qt باشد، ندارد.
ابزار pyuic5 (که برای تولید کد پایتون از فایل XML Designer است) از پرچم pyqt3-wrapper پشتیبانی نمیکند. pyrcc5 نیز از پرچمهای py2 و py3 پشتیبانی نمیکند. pyqt5 همیشه بصورت اتوماتیک تابع ()sip.setdestroyonexit را فراخوانی کرده و destructor زبان ++c مربوط به تمامی موارد پیچیده آن را، نیز فرا میخواند.
نصب pyqt5 در ویندوز
در این بخش از آموزش pyqt5 به نصب pyqt5 در ویندوز میپردازیم. قابل ذکر است که pyqt5 برای هر دو نسخه ۳۲ بیتی و ۶۴ بیتی که با پایتون ۳.۵ به بالاتر سازگاری دارند، وجود دارد. راهی که برای نصب آن توصیه میکنیم استفاده از روش نصب پکیج در پایتون بصورت pip میباشد.
pip3 install PyQt5
برای نصب ابزارهای توسعه از قبیل Qt Designer برای پشتیبانی از pyqt5 دستور زیر را استفاده میکنیم.
pip3 install pyqt5-tools
در ادامه آموزش pyqt5 بهتر است قبل از هر کاری با مراحل ایجاد یک برنامه رابط کاربری گرافیکی ساده با استفاده از PyQt آشنا شویم این مراحل شامل گامهای زیر است:
- ماژولهای QtCore، QtGui و QtWidgets را از بسته (package) PyQt5 وارد میکنیم.
- یک شیء برنامه از کلاس QApplication ایجاد میکنیم..
- یک شیء QWidget، پنجره سطح بالایی را ایجاد می کند. شیء QLabel را در آن اضافه میکنیم..
- عنوان برچسب را به عنوان “Hello World” تنظیم میکنیم.
- موقعیت و اندازه پنجره را با متد ()setGeometry تعریف میکنیم.
- حلقه اصلی برنامه را از طریق متد ()_app.exec وارد میکنیم.
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * def window(): app = QApplication(sys.argv) w = QWidget() b = QLabel(w) b.setText("Hello World!") w.setGeometry(100,100,200,50) b.move(50,20) w.setWindowTitle("PyQt5") w.show() sys.exit(app.exec_()) if __name__ == '__main__': window()
همچنین امکان توسعه یک solution شیء گرا از کد بالا وجود دارد. برای اینکار مراحل زیر را انجام میدهیم:
- ماژولهای QtCore، QtGui و QtWidgets را از بسته PyQt5 وارد میکنیم.
- یک شیء برنامه از کلاس QApplication ایجاد میکنیم.
- کلاس پنجره را بر اساس کلاس QWidget اعلام میکنیم
- یک شیء QLabel اضافه میکنیم و عنوان برچسب را به عنوان “Hello world” تنظیم میکنیم.
- اندازه و موقعیت پنجره را با متد ()setGeometry تعریف میکنیم.
- حلقه اصلی برنامه را با روش ()_app.exec وارد میکنیم.
[/vc_column_text][vc_column_text]در ادامه کد کامل solution شیءگرا آمده است:
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class window(QWidget): def __init__(self, parent = None): super(window, self).__init__(parent) self.resize(200,50) self.setWindowTitle("PyQt5") self.label = QLabel(self) self.label.setText("Hello World") font = QFont() font.setFamily("Arial") font.setPointSize(16) self.label.setFont(font) self.label.move(50,20) def main(): app = QApplication(sys.argv) ex = window() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
خروجی برنامه به شکل زیر است:
استفاده از Qt Designer
pyqt installer یا نصب کننده pyqt همراه با یک سازنده رابط کاربری گرافیکی بنام Qt Designer ارائه میشود. با استفاده از رابط و محیط drop & drag آن میتوان به سادگی یک رابط کاربری گرافیکی را بدون احتیاج به نوشتن کد ایجاد کرد. خوب الان برنامه Qt Designer را که بخشی از ابزارهای توسعه بوده و در پوشه اسکریپتهای محیط مجازی نصب میشود را شروع میکنیم. اگر بالاتر دستور pip install pyqt5-tools درست نصب شده باشد در قسمت Start ویندوز اگر designer را جستجو کنید برایتان ظاهر خواهد شد.
کافیست کلیک کنید وارد آن شوید. محیط آن به شکل زیر است.
سپس می توانید ویجتهای مورد نیاز را از کادر ویجت در سمت چپ بکشید و رها کنید. همچنین میتوانید به ویژگیهای ویجت که روی فرم گذاشته شده است، مقدار اختصاص دهید.
فرم طراحی شده با عنوان test.ui ذخیره می شود. این فایل که یک رابط کاربری است، شامل نمایش XML از ویجتها و ویژگیهای مربوط به آنها در طراحی است که این طرح با استفاده از ابزار خط فرمان pyuic5 به معادل پایتون آن ترجمه میشود. این ابزار یک بسته برای ماژول uic از مجموعه QT toolkit است. نحوه استفاده از pyuic5 بهصورت زیر است:
pyuic5 -x test.ui -o test.py
در دستور بالا، سوئیچ -x مقدار کمی کد اضافی را به اسکریپت پایتون تولید شده (از XML) اضافه میکند تا به یک برنامه مستقلی که خود خود به خود اجرا شود، تبدیل شود.
if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) Dialog = QtGui.QDialog() ui = Ui_Dialog() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec_())
اسکریپت پایتون بعد از اجرا کادر محاورهای زیر را نمایش میدهد.
python test.py
حالا کاربر در فیلدهای مورد نظر میتواند مقادیری را وارد کند ولی با کلیک بر روی دکمه add هیچ عملی اتفاق نمیافتد زیرا به هیچ عملکردی مرتبط نشده است.
برخلاف یک برنامه مبتنی بر کنسول که بهصورت متوالی اجرا میشود. برنامه براساس رابط کاربری گرافیکی مبتنی بر رویداد است. توابع و متدها در پاسخ به اقدامات کاربر مثل کلیک کردن، انتخاب گزینه یا کلیک ماوس و غیره اجرا میشوند. که این موارد در واقع رویدادها هستند.
ابزارکها (widgets) به عنوان منابع چنین رویدادهایی در ساخت رابط کاربری گرافیکی به کار میروند. که هر ابزارک از کلاس QObject مشتق شده است و به گونههای طراحی شده است که در پاسخ به یک یا چند رویداد “سیگنال” منتشر کند. البته این سیگنال به تنهایی کار خاصی انجام نمیدهد مگر اینکه به یک Slot متصل شده باشد. این slot میتواند هر تابع پایتونی با قابلیت فراخوانی باشد. در ادامه آموزش pyqt5 به استفاده از این مفاهیم میپردازیم.
استفاده از ویرایشگر سیگنال/اسلات Qt Designer
برای شروع، یک فرم ساده با کنترل LineEdit و PushButton طراحی می کنیم.
فرم به نحوی طراحی شده است که با کلیک بر روی دکمه محتوای نوشته شده در QLineEdit پاک شود. ابزارک QLineEdit دارای متدی به نام ()clear است. بنابراین، سیگنال کلیک مربوط به دکمه باید به متد ()clear مربوط به کادر متن متصل شود. برای شروع، Edit signals/slots را از منوی Edit انتخاب کنید (یا F4 را فشار دهید). سپس دکمه را با ماوس هایلایت کرده و مکان نما را به سمت textbox بکشید.
هنگامی که ماوس آزاد می شود، یک کادر که سیگنالهای دکمه و متدهای slot را نشان میدهد، نمایش داده میشود. سیگنال کلیک و متد ()clear را انتخاب میکنیم.
پنجره Signal/Slot Editor در پایین سمت راست، نتیجه را نشان می دهد. همانطور که در کد زیر نشان داده شده است، کدهای UI و Build و Python را از فایل Ui ذخیره میکنیم.
pyuic5 -x signalslot.ui -o signalslot.py
کد پایتون تولید شده با عبارت زیر، ارتباط بین سیگنال و slot را خواهد داشت.
self.pushButton.clicked.connect(self.lineEdit.clear)
signalslot.py را اجرا میکنیم و متنی را در LineEdit وارد میکنیم. در صورت فشار دادن دکمه، متن پاک میشود.
ساخت ارتباط signal – slot
به جای استفاده از Designer، میتوانید مستقیماً با دنبال کردن syntax زیر، اتصال signal – slot را برقرار کنید.
widget.signal.connect(slot_function)
فرض کنید با کلیک روی یک دکمه، تابعی فراخوانی شود. حالا سیگنال کلیک شده باید به یک تابع قابل فراخوانی متصل شود. در هر یک از تکنیک های زیر می توان این کار را انجام داد. در ادامه آموزش pyqt5 یک مثال را بررسی میکنیم.
button.clicked.connect(slot_function)
مثالی از فراخوانی توابع
در مثال زیر، دو شیء QPushButton (button1 و button2) در پنجره QDialog اضافه شده است. ما می خواهیم با کلیک بر روی button1 و button2 توابع ()button1_clicked و ()button2_clicked را فراخوانی میکنیم. هنگامی که روی button1 کلیک میشود، سیگنال ()clicked به تابع ()button1_clicked متصل میشود.
bottun1.clicked.connect(bottun1_clicked())
و هنگامی که روی button2 کلیک میشود، سیگنال ()clicked به تابع ()button2_clicked متصل میشود.
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * def window(): app = QApplication(sys.argv) win = QDialog() Button1 = QPushButton(win) Button1.setText("Button1") Button1.move(50,20) Button1.clicked.connect(Button1_clicked) Button2 = QPushButton(win) Button2 .setText("Button2") Button2 .move(50,50) Button2 .clicked.connect(Button2_clicked) win.setGeometry(100,100,200,100) win.setWindowTitle("PyQt5") win.show() sys.exit(app.exec_()) def Button1_clicked(): print ("Button 1 clicked") def Button2_clicked(): print ("Button 2 clicked") if __name__ == '__main__': window()
کد بالا خروجی زیر را دارد:
Button 1 clicked Button 2 clicked
سخن آخر در بحث آموزش pyqt5
در این مقاله به آموزش pyqt5 پرداختیم. pyqt5 ترکیبی از کتابخانه QT و پایتون است که به برنامهنویسان این امکان را میدهد تا با استفاده از آن برنامههای کاربردی با رابط گرافیکی کاربر پسند ارائه کنند. pyqt5 دارای کلاسهای بیشماری هست و مهمتر از همه با یک سازنده رابط کاربری گرافیکی (GUI) بنام QT Designer ارائه میشود که کاربرد را از زحمت کد نویسی راحت کرده و محیطی گرافیکی برای او فراهم میکند.
در این مقاله محیط QT Designer و نحوه کار با آن در حد آشنایی در اختیار علاقهمندان قرار داده شد و سعی کردیم که تا حدی شما را با pyqt5 و QT Designer آشنا کنیم. از اینکه تا انتهای مقاله ما را همراهی کردید از شما سپاسگزاریم. مشتاقانه منتظر نظرات و پیشنهادات شما عزیزان هستیم.
4 پاسخ
سلام برنامه جمع دو عدد را چطور در پایتون تکمیل کنیم. من متوجه نشدم.
بعد از این خط برنامه اجرا شد ولی جمع نکرد
تغییری باید داخل کد test.py اعمال بشه
به نظرتون من می تونم با این کتابخانه یک ماشین حساب مهندسی با پایتون طراحی کنم؟
سلام
بله با این کتابخانه تقریبا میتوان هر نوع طراحی گرافیکی از جمله ماشین حساب ساخت.
DLL load failed while importing QtCore: %1 is not a valid Win32 application. برای من همش این پیام میاد چجوری درست میشه