سلام به همه
گفته شده که یاد گیری بر هر کسی واجبه و از طرفی کسی که چیزی رو یاد گرفت باید زکاتش رو بده
حالا ما (من بعلاوه هر کسی که دوست داره) می خوایم PyQt یاد بگیریم هرکسی هست یا علی
جلسه اول:
در این نوشتار مبنا را بر این گذاردیم تا که خواننده با زبان برنامه سازی پایتون به صورت مقدماتی آشناست همچنین مبنا بر آن است که وی محیط های نگاره ای(گرافیکی GUI) را باز می شناسد و با تفاوت اجزای گرافیکی همچون دکمه ها، رادیو باتوم ها، چک باکس ها، تکس ادیت ها و … آشناست (به یاد lomion)
این رو به عنوان ساده ترین برنامه ممکن در نظر بگیرید
#!/usr/bin/env python
import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
hello = QtGui.QPushButton("Hello world!")
hello.resize(100, 30)
hello.show()
sys.exit(app.exec_())
خوب بذارین ببینیم چی داریم:خط اول که مشخصه چیه
خط دوم هم نیاز به توضیح نداره
توی خط سوم از مجموعه PyQt4 قسمت QtGui رو به برنامه وارد کردیم که بیشتر اجزای گرافیکی توی همین مجموعه هستند البته تا اونجا که من می دونم همه اونها همین جا باید باشن ولی چون اطلاع کاملی ندارم چیزی نمی گم
هر برنامه PyQt نیاز به یک شی از نوع QtGui.QApplication داره که در واقع همون برنامه ماست در خط چهارم چنین شی رو با آرگومانهای ورودی به خود برنامه ساختیم
تو خط پنجم یه دکمه ساختیم به نام hello که نوشته روی اون Hello world هست
حالا یه سری خصوصیات به دکمه می دیم از جمله اندازه و مهمتر از اون خصوصیت نمایشیه که می گیم این دکمه قابل نمایش باشه یعنی مخفی نباشه
و در پایان هم برنامه رو با خروجی app که قبلا ساختیم و ارسال دادن اون به خروجی برنامه می بندیم.
یه فرم با یه دکمه با ابعادی که مشخص شده و نوشته ای که توی برنامه برای اون در نظر گرفته شده که هیچ کاری هم انجام نمی ده!
حالا می خواهیم یه تابع ساده به این دکمه مرتبط کنیم چطوری؟؟ آها!! اینجاست
توی کتابخونه qt دو تا دونه مفهوم داریم که خیلی مهم هستند:
۱-signal
۲-slot
البته چیزای دیگه ای هم مثل event ها هستند ولی اونا رو بعد توضیح می دم
حالا اگر بخوام توضیح بدم اینطوری می شه : signal مثل یه هورمونه که تو بدن ترشح می شه این هورمون رو بلافاصله خون به تمام قسمت های بدن می رسونه ولی حالا چه اتفاقی می افته ؟؟ هیچی چون گیرنده ای برای این هورمون وجود نداره و مثل این می مونه که اصلا هورمونی ترشح نشده!!
خوب که چی؟ آهان!! اینجاست : ما بایستی گیرنده هایی برای این هورمون طراحی کنیم یا گیرنده هایی رو به این هورمون متصل کنیم که این گیرنده ها همون slot هستند
جالب شد نه؟؟!!
حالا برگردیم به برنامه
#!/usr/bin/env python
import sys
from PyQt4 import QtGui, QtCore
app = QtGui.QApplication(sys.argv)
hello = QtGui.QPushButton("Hello world!")
hello.resize(100, 30)
hello.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
QtCore.QObject.connect(hello, QtCore.SIGNAL("clicked()"), app,
QtCore.SLOT("quit()"))
hello.show()
sys.exit(app.exec_())
قسمت های تکراری رو دیگه توضیح نمی دیم و می مونه بقیه
ما از pyqt قسمت qtcore رو هم به برنامه اصافه کردیم که signal ها و slot ها اونجا تعریف می شن . البته توجه داشته باشید که تابع connect رو widget ها هم (البته تا اونجا که من می دونم) دارن و شما می تونستید برای این تابع از دکمه استفاده کنید یعنی
hello.connect(hello, QtCore.SIGNAL("clicked()"), app, QtCore.SLOT("quit()"))
البته قسمت دیگه ای هم وجود داره که می شه گفت اضافه هست البته توی برنامه های کوچیک که به مرور باهاشون آشنا می شید
حالا چی داریم؟ ما با این کار اون گیرنده هورمون توی بدن رو مشخص کردیم و اصطلاحا اونها رو به هم متصل کردیم
چطوری؟؟
گفتیم که یکی از غدد بدن هست به نام hello که این غده یه هورمون ترشح می کنه به نام clicked توجه کنید که ممکنه خیلی از غدد بدن این هورمون رو ترشح کنن ولی ما بایستی فقط به هورمونی که از این غده ترشح می شه جواب بدیم
توی آرگومان دوم نوع هورمون رو مشخص کردیم که گفته شد
توی آرگومان سوم گفتیم که گیرنده هورمون کیه که همون app هست. البته این یه خورده اخطیاریه توجه کنید که فقط یه خورده
توی آرگمان چهارم هم عملی که در قبال گرفتن این پیام انجام می شه رو توضیح دادیم که همون خروجه
توی یه خط هم نوی قلم رو مشخص کردیم که نیاز به توضیح نداره
فکر نمی کنم شما بخواین برنامه ای بسازید که فقط یه دکمه توش باشه پس لازمه که طرح بندی ها رو یاد بگیریم چطوری؟
می گم الان اینو داشته باشید:
#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window.resize(200, 120)
hello = QtGui.QPushButton("hello word!", window)
hello.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
hello.setGeometry(10, 40, 180, 40)
QtCore.QObject.connect(hello, QtCore.SIGNAL("clicked()"),
app, QtCore.SLOT("quit()"))
window.show()
sys.exit(app.exec_())
این برنامه اولین قدم بذای طرح بندیه . چطوری حالا می گم:
ما اینجا بر خلاف قبل که دکه وابسطه به هیج کجا نبود یه ویدگت ساختیم به نام window و دکمه رو به اون متصل کردیم
حالا با نمایش window کل اجزای متصل به اون هم نمایش داده می شه و کارایی از این قبیل، تنها چیزی که شاید نیاز به توضیح داشته باشه اینکه که موقع ساخت دکمه اون رو به پنجره اصلی یعنی window متصل کردیم که البته این یه کم غیر معموله و بیشتر با استفاده از توابع layout این کار رو انجام می دن که توضیح می دم
از همینجا تاکید می کنم که توی هر برنامه سازی گرافیکی layout نقش بسیار مهمی داره در نتیجه من تذکر می دم که هر چیزی رو که دوست داشتید سرسری بگیرید layout رو سرسری نگیرید و اون رو به نحو شایسته یاد بگیرید. گرچه با QtDesigner می تونید طرح بندی کنید ولی من خودم خوشم نیومد (کد بی مصرف زیادی تولید میکنه) گرچه آینده اونو هم توضیح می دم
پایان جلسه اول
بعدا در مورد مجوز این نوشته هم فکر می کنم الان بی مجوزه
تا یادم نرفته با نظرات مفید خودتون ما رو به نوشتن دلگرم فرمایید (شد مثل وبلاگا)