از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
کار با چارچوب PyQT پایتون
سرفصلهای مطلب
معرفی
در این راهنما، روش استفاده از Python را بررسی خواهیم کرد PyQT چارچوبی برای توسعه الف رابط کاربری گرافیکی (GUI) برای یک برنامه دسکتاپ در پایتون
جایگزین های محبوب پایتون برای توسعه رابط کاربری گرافیکی عبارتند از Tkinter، کیوی، PySimpleGUI، و wxPython.
توجه داشته باشید: در هنگام نوشتن این آموزش، PyQt6 آخرین و پیشرفته ترین نسخه چارچوب PyQT پایتون و همچنین نسخه ای است که ما از آن استفاده خواهیم کرد.
ما مراحل نصب را انجام خواهیم داد process، و قبل از حرکت به جلو با عناصر کلیدی PyQT آشنا شوید مدیران چیدمان، ابزارک ها، سیگنال ها و شکاف ها و همچنین چگونه ابزارک های سبکو همچنین نگاهی به فایلهای UI، و روش ایجاد رابطهای کاربری از طریق یک رابط بصری کشیدن و رها کردن، که سپس میتوانیم export به اسکریپت های قابل اجرا پایتون:
نصب و راه اندازی
برای استفاده از PyQt فریم ورک ابتدا باید با استفاده از آن نصب کنیم pip مدیر بسته
اگر تو داری pip بر روی سیستم شما نصب شده است، اجازه دهید دستور زیر را برای نصب جدیدترین نسخه PyQt اجرا کنیم:
$ pip install pyqt6
باید pip install pyqt6
شکست، می توانید تغییرات نصب را بررسی کنید اینجا.
مقدمه ای بر PyQt
PyQt یک جعبه ابزار است که محصول آن است Qt کتابخانه و زبان برنامه نویسی پایتون از آنجایی که PyQt یکی از متداولترین فریمورکهای رابط کاربری گرافیکی برای پایتون است، هم تعداد زیادی مستندات به خوبی نوشته شده و هم یک جامعه بزرگ وجود دارد.
یکی از کلاس های اصلی PyQt است QWidget
کلاس – اجرای الف ویجت. ویجت ها اجزای رابط کاربری گرافیکی و بلوک های ساختمانی اصلی رابط های کاربری هستند. یک ویجت می تواند یک برچسب، دکمه، منو، جعبه ترکیبی، اسکرول، نوار ابزار، محاوره فایل و غیره باشد…
وجود دارد زیاد ابزارک ها و عادت کردن به آنها زمان می برد. ما با متداولترین ابزارکهایی آشنا میشویم که تقریباً در همه برنامههای PyQt وجود دارند.
ترتیب نسبی این ابزارک ها روی فریم یک برنامه توسط a دیکته و مدیریت می شود مدیر طرح. ما همچنین نگاهی به مدیران چیدمان موجود و روش تأثیر آنها بر موقعیت یابی اجزای رابط کاربری گرافیکی خواهیم داشت.
نقطه ورود هر برنامه PyQt این است QApplication
کلاس، که خود برنامه را نشان می دهد. تمام مقداردهی اولیه و “بوم” را که ما می کشیم مدیریت می کند روی.
توجه داشته باشید: همیشه فقط یکی هست QApplication
به عنوان مثال، بدون توجه به تعداد پنجره ها یا باکس های مدال در برنامه شما.
بیایید یک جهش کنیم و یک برنامه PyQt را مقداردهی اولیه کنیم و یک پنجره با یک بوم خالی را مقداردهی کنیم:
import sys
from PyQt6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
root = QWidget()
root.setWindowTitle('A Simple PyQt6 App')
root.setGeometry(100, 100, 280, 80)
root.show()
sys.exit(app.exec())
اجرای این کد یک برنامه ساده را مقداردهی اولیه می کند:
بیایید خط به خط این مقداردهی اولیه را مرور کنیم.
اولا ما import پایتون داخلی sys
ماژولی که توابعی را برای دستکاری در اختیار ما قرار می دهد محیط اجرای پایتون. در مورد ما، ما از این ماژول برای رسیدگی به وضعیت خروج از برنامه استفاده می کنیم – زمانی که کاربر به آن ضربه می زند “ایکس” دکمه:
import sys
سپس ما می توانیم import QApplication
(مبنا) و QWidget
(اجزای رابط کاربری گرافیکی) از PyQt6.QtWidgets
مدول:
from PyQt6.QtWidgets import QApplication, QWidget
بعد، این خط مورد نیاز QT است. PyQT را مقداردهی اولیه می کند. sys.argv حاوی لیستی از همه آرگومان های خط فرمان است که به برنامه ارسال شده است. هر برنامه رابط کاربری گرافیکی که ایجاد می کنید باید دقیقاً یک نمونه از QApplication داشته باشد.
در حال حاضر، از آن زمان QApplication
مسئول اولیه سازی اکثر عناصر درگیر در توسعه برنامه های PyQt است، ابتدا می خواهیم آن را نمونه سازی کنیم. سازنده a را می پذیرد sys.argv
استدلال از آنجایی که شما نیز می توانید وارد شوید command-line استدلال ها:
app = QApplication(sys.argv)
در حال حاضر QApplication
خودش در واقع هیچ ویندوزی ندارد. اجرای برنامه بدون پنجره یک نتیجه نامرئی برای ما ایجاد می کند. برای معرفی یک پنجره به ترکیب، ما یک را ایجاد می کنیم ویجت ریشهکه با نام a نیز شناخته می شود ویجت پنجره. در هر صورت، پایینترین ابزارک را نشان میدهد که اجزای دیگر را به آن اضافه میکنیم:
root = QWidget()
بیایید با استفاده از یک عنوان پنجره سفارشی تنظیم کنیم setWindowTitle()
:
root.setWindowTitle('A Simple PyQt6 App')
این setGeometry()
متد 4 آرگومان را می پذیرد: x_coordinate
، y_coordinate
، width
& height
. این x_coordinate
و y_coordinate
نقطه مبدا را تعریف کنید پنجره هنگام نمایش:
root.setGeometry(100, 100, 280, 80)
حال برای نمایش رابط کاربری گرافیکی ایجاد شده روی صفحه ای که ما آن را می نامیم show()
روش روی را root
:
root.show()
در نهایت برنامه را از طریق اجرا می کنیم app.exec()
و حلقه اصلی برنامه را اجرا کنید تا زمان کاربر آن را می بندد:
sys.exit(app.exec())
مدیران چیدمان
مدیران چیدمان PyQt روشی سازنده برای ترتیب دادن به ما ارائه دهید ابزارک های PyQt روی یک رابط کاربری گرافیکی هرچه ابزارک های خود را بهتر بچینیم، برنامه رابط کاربری گرافیکی ما می تواند صیقلی تر و حرفه ای تر به نظر برسد. داشتن فضاهای نامناسب و بزرگ بین دکمه ها بدون استفاده زیاد از فضا، چندان کاربر پسند نیست. برعکس این موضوع نیز صدق میکند – اگر دکمهها را خیلی نزدیک قرار دهیم، بهطور ناخوشایندی به راحتی میتوان آنها را اشتباه کلیک کرد.
محبوب ترین کلاس های PyQt Layout Manager عبارتند از:
- QVBoxLayout ویجت ها را به صورت عمودی مرتب می کند.
- QHBoxLayout ابزارک ها را به صورت افقی مرتب می کند.
- QGridLayout ویجت ها را در یک شبکه مرتب می کند.
- QFormLayout ویجت ها را در دو ستون مرتب می کند.
هنگام ایجاد برنامههای رابط کاربری گرافیکی با PyQt، اغلب از بیش از یکی از چهار مدیر طرحبندی همه منظوره، حتی در یک برنامه، برای انواع مختلف پنجرهها استفاده میکنید.
بیایید از مثال قبلی استفاده کنیم و با افزودن چندین ویجت مانند QPushButton
s و مدیریت آنها از طریق یک Layout Manager.
1. QVBoxLayout
آ مدیر چیدمان جعبه (هر دو QVBox یا QHBox) از تمام فضایی که از چیدمان والد یا ویجت خود می گیرد استفاده می کند و آن را به چندین کادر تقسیم می کند.
هر ویجت مدیریت شده توسط مدیر یک کادر را پر می کند.
QVBoxLayout
به ما امکان می دهد ابزارک های خود را به صورت عمودی مرتب کنیم. طرح بندی ابزارک ها را از بالا به پایین به ترتیب به خود اضافه می کند. بنابراین اولین ویجت اضافه شده در کد شما بالاترین ویجت و آخرین ویجت اضافه شده در کد شما پایین ترین ویجت در طرح بندی خواهد بود.
بیایید چندین دکمه را از طریق a به برنامه خود اضافه کنیم QVBoxLayout
:
import sys
from PyQt6.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
layout.addWidget(QPushButton('One'))
layout.addWidget(QPushButton('Two'))
layout.addWidget(QPushButton('Three'))
layout.addWidget(QPushButton('Four'))
layout.addWidget(QPushButton('Five'))
window.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
این پنجره شامل 5 دکمه است که به صورت عمودی و به صورت بالا به پایین مرتب شده اند. وقتی روی آنها کلیک می کنیم هیچ اتفاقی نمی افتد زیرا هنوز منطقی برای آنها اضافه نکرده ایم.
2. QHBoxLayout
QHBoxLayout
هست یک طرح بندی جعبه که به ما امکان می دهد ویجت های خود را به صورت افقی مرتب کنیم. طرح بندی ابزارک ها را از چپ به راست به خود اضافه می کند. بنابراین اولین ویجت اضافه شده در کد شما سمت چپ ترین ویجت و آخرین ویجت اضافه شده در کد شما سمت راست ترین ویجت در طرح بندی خواهد بود.
بیایید کادر عمودی را با یک کادر افقی تغییر دهیم:
import sys
from PyQt6.QtWidgets import QApplication, QPushButton, QHBoxLayout, QWidget
app = QApplication(sys.argv)
window = QWidget()
layout = QHBoxLayout(window)
layout.addWidget(QPushButton('One'))
layout.addWidget(QPushButton('Two'))
layout.addWidget(QPushButton('Three'))
layout.addWidget(QPushButton('Four'))
layout.addWidget(QPushButton('Five'))
window.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
این پنجره شامل 5 دکمه است که به صورت افقی و به صورت چپ به راست مرتب شده اند.
3. QGridLayout
آ QGridLayout
زمانی استفاده می شود که بخواهیم ویجت ها را در شبکه ای از سطرها و ستون ها مرتب کنیم. در این شبکه، با استفاده از مختصات، می توانیم موقعیت نسبی هر ویجت را به صورت زیر تعریف کنیم: (سطر ستون).
توجه داشته باشید: هر دو row
و column
باید اعداد صحیح باشند
QGridLayout
همچنین از تمام فضایی که از چیدمان والدین یا ویجت به دست می آورد استفاده می کند و آن را به چندین کادر تقسیم می کند. همانند Layout Managers قبلی، هر ویجت در جعبه خودش قرار می گیرد. تعداد جعبه ها به طور خودکار بسته به محاسبه می شود روی تعداد ویجت ها و مختصات آنها.
از a استفاده کنیم QGridLayout
به جای طرح کادر افقی:
import sys
from PyQt6.QtWidgets import QApplication, QPushButton, QGridLayout, QWidget
app = QApplication(sys.argv)
window = QWidget()
button1 = QPushButton('One')
button2 = QPushButton('Two')
button3 = QPushButton('Three')
button4 = QPushButton('Four')
button5 = QPushButton('Five')
layout = QGridLayout(window)
layout.addWidget(button1,0,0)
layout.addWidget(button2,1,0)
layout.addWidget(button3,2,0)
layout.addWidget(button4,0,1)
layout.addWidget(button5,0,2)
window.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
این پنجره شامل 5 دکمه است که همانطور که در قسمت مشخص شده است مرتب شده اند addWidget()
روش. خود متد 3 آرگومان را می پذیرد:
- ویجتی که باید در شبکه قرار گیرد.
- ردیفی که باید در آن قرار گیرد.
- ستونی که باید در آن قرار گیرد.
آرگومان چهارم اختیاری وجود دارد، alignment
، که گزینه تراز هر ویجت را در کادر خود تعریف می کند. مقدار پیش فرض (هست Qt.Alignment.AlignCenter
) به این معنی است که هر ویجت باید تمام کادر خود را از مرکز به بیرون پر کند. بیشتر روی را Qt
ماژول در بخش های بعدی
در نهایت، یک نیز وجود دارد columnSpan
و rowSpan
آرگومان، که مشخص می کند آیا ویجت چندین ردیف یا ستون را در بر می گیرد:
addWidget(Widget, fromRow, fromColumn, rowSpan, columnSpan, Qt.Alignment)
بیایید دهانه سطر و ستون و همچنین a را تنظیم کنیم Qt.Alignment
(قبل از PyQt6، این خواهد بود Qt.AlignLeft
):
from PyQt6.QtCore import Qt
layout.addWidget(button1, 0, 0, 1, 1, Qt.Alignment.AlignLeft)
layout.addWidget(button2, 1, 0, 1, 1, Qt.Alignment.AlignLeft)
layout.addWidget(button3, 2, 0, 1, 1, Qt.Alignment.AlignLeft)
layout.addWidget(button4, 0, 1, 1, 1, Qt.Alignment.AlignLeft)
layout.addWidget(button5, 0, 2, 1, 1, Qt.Alignment.AlignLeft)
تو می توانی AlignLeft
، AlignTop
، AlignBottom
، AlignRight
و AlignCenter
. با تغییر اندازه پنجره، خواهیم دید که هر دکمه به جای مرکز، در سمت چپ کادر خود تراز شده است:
در حالی که اگر استفاده کردیم AlignCenter
یا آن را به عنوان پیش فرض رها کنید:
4. QFormLayout
این QFormLayout
ایجاد طرح بندی فرم برای برنامه های دسکتاپ را آسان می کند. از دو ستون تشکیل شده است – یکی برای برچسب ها و دیگری برای ورودی ها.
به طور معمول، ویجت ورودی a است QLineEdit
، QSpinBox
، QComboBox
، یا ابزارک های ورودی مشابه. بیایید یک را ایجاد کنیم QFormLayout
:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QLineEdit
def addLabel(layout, text):
layout.addWidget(QLabel(text))
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
label = QLabel('Enter some text!')
layout.addWidget(label)
line_edit = QLineEdit()
layout.addWidget(line_edit)
qbtn= QPushButton('Add Label')
layout.addWidget(qbtn)
qbtn.clicked.connect(lambda:addLabel(layout, line_edit.text()))
window.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
این پنجره شامل 2 برچسب و 2 است QLineEdit
فیلدهای اضافه شده از طریق addRow()
روش. addRow()
2 استدلال را می پذیرد:
- متن برچسب (رشته)
- ویجت ورودی (QWidget)
روش به طور خودکار ایجاد و اضافه می کند QLabel
اعتراض با ما labelText به عنوان متن آن علاوه بر این، شما همچنین می توانید یک را اضافه کنید QLabel
آرگومان به جای یک رشته، که تبدیل خودکار را رد می کند:
layout.addRow(QLabel('Nickname:'), QLineEdit())
layout.addRow(QLabel('Score:'), QLineEdit())
این نیز منجر به:
اکنون که با Layout Managers که PyQt ارائه می دهد آشنا شدیم – بیایید به آن بپردازیم چی آنها مدیریت می کنند. ویجت ها مفهوم کلیدی Qt و در نتیجه PyQt هستند.
یک ویجت یک جزء گرافیکی از UI را منعکس می کند. یک رابط کاربری از چندین ویجت تشکیل شده است که در پنجره مرتب شده اند. هر ویجت شامل یک سری ویژگی ها و روش هایی است که به ما امکان می دهد ظاهر و رفتار آنها را مدل سازی کنیم.
PyQt6 در حال حاضر بیش از 40 ابزارک را ارائه می دهد و شما حتی می توانید ابزارک های سفارشی خود را ایجاد کنید.
از زمان PyQt5، کلاسهای پایه به ماژولهای مختلف تغییر شکل داده است. چند ماژول اساسی سطح بالا توسط PyQt6 استفاده می شود که عبارتند از:
Qt
: همه ماژول های ذکر شده در زیر را می توان به صورت بسته بندی شده در این ماژول پیدا کرد.QtCore
QtCore
ماژول شامل تمام ماژول های اصلی غیر گرافیکی است که توسط ماژول های دیگر استفاده می شود. سیگنال ها، شکاف هاو غیره در این ماژول پیاده سازی شده اند.QtWidgets
: این ماژول شامل اکثر موارد است ابزارک ها موجود در PyQt6.QtGui
:QtGui
گسترش می دهدQtCore
ماژول و شامل اجزای رابط کاربری گرافیکی است.QtSql
: این ماژول یکپارچه سازی پایگاه داده را برای پایگاه های داده SQL پیاده سازی می کند.QtMultimedia
: عملکرد چند رسانه ای سطح پایین را می توان در این ماژول یافت.QtNetwork
: کلاس های مورد استفاده برای پیاده سازی برنامه نویسی شبکه (Sockets، SSL Handling، Network sessions، DNS، …) را می توان در این ماژول یافت.
در این بخش به تمرکز خواهیم پرداخت روی را QtWidgets ماژول و ابزارک هایی که دارد روی-پیشنهاد.
1. برچسب ها
محبوب ترین ویجت، برچسب، بیشتر برای توضیح هدف یا استفاده از رابط کاربری گرافیکی شما مانند حاشیه نویسی یک فیلد استفاده می شود.
می توانیم با فراخوانی یک برچسب ایجاد کنیم QLabel
کلاس به خاطر داشته باشید که این ویجت هیچ گونه تعامل کاربر را ارائه نمی دهد.
ما می توانیم ظاهر بصری یک برچسب را به روش های مختلفی تغییر دهیم:
setAlignment()
عنوان را بر اساس ثابت های تراز تراز می کند، که می تواند موارد زیر باشد:Alignment.AlignLeft
Alignment.AlignRight
Alignment.AlignCenter
Alignment.AlignJustify
Text()
برای بازیابی عنوان یک برچسب استفاده می شود.setText()
به جای بازیابی عنوان، عنوان یک برچسب را تنظیم می کند.setIndent()
تورفتگی را تنظیم می کند.setWordWrap()
بسته به اینکه کلمات را در یک برچسب بپیچد یا نه روی گذشتboolean
.
اکنون، بیایید یک برنامه کوچک PyQt6 با استفاده از برچسب ها بسازیم تا اطلاعاتی در مورد بلژیک نمایش دهیم:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
from PyQt6.QtCore import Qt
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
firstLabel = QLabel('Countrycode: BE')
secondLabel = QLabel('Brussels waffles are the best food ever.')
layout.addWidget(firstLabel)
layout.addWidget(secondLabel, alignment = Qt.Alignment.AlignJustify)
layout.addWidget(QLabel('The Belgian flag consists of the colors black, yellow and red', wordWrap=True), alignment = Qt.Alignment.AlignLeft)
firstLabel.setText('Belgium is a country located in Europe')
firstLabel.setAlignment(Qt.Alignment.AlignRight)
window.show()
sys.exit(app.exec())
شما می توانید یک را ایجاد کنید QLabel
از قبل مانند با firstLabel
. سپس، حتی پس از افزودن آن به یک طرح بندی – می توانید آن را دستکاری کنید و متن، تراز و غیره را از طریق روش های تنظیم کننده آن تنظیم کنید. آخرین حالت ها طبق تعیین شده توسط تنظیم کننده ها ترسیم خواهد شد روی پنجره در پایان
اگر می خواهید از ایجاد اشیاء از قبل و فراخوانی بسیاری از روش ها اجتناب کنید – می توانید به سادگی یک ویجت ایجاد کنید و بلافاصله بعد از آن، در addWidget()
خود را صدا کند. ما تنظیم کرده ایم wordWrap
استدلال سوم QLabel
درست است، زیرا کمی طولانیتر از دو مورد دیگر است و ممکن است بخواهیم کلمات را در صورتی که طولانیتر از اندازه پنجره باشند، بپیچیم.
توجه داشته باشید: از آنجایی که PyQt6، Qt
بخشی از PyQt6.QtCore
، و Align_
گزینه ها بخشی از Alignment
کلاس – منجر به Qt.Alignment.Align_
تماس می گیرد. قبل از PyQt6، Qt
بخشی از PyQtX
ماژول، نه QtCore
ماژول، و Align_
گزینه ها بخشی از Qt
بنابراین تماس ها بیشتر شبیه به – Qt.Align_
بجای.
اگر این کد را اجرا کنیم، سه برچسب خود را می بینیم که مطابق با ما تراز شده اند Alignment
تنظیمات:
2. سیگنال ها و شکاف ها
سیگنال ها و اسلات ها در PyQt برای برقراری ارتباط بین اشیاء استفاده می شوند. این مکانیسم یکی از ویژگی های اصلی چارچوب Qt است.
به عنوان مثال، اگر کاربر روی a کلیک کند حذف دکمه، ما پنجره را می خواهیم delete()
تابعی که باید فراخوانی شود برای این، 2 ویجت باید با یکدیگر ارتباط برقرار کنند.
یک رویداد عملی خواهد بود که توسط کاربر در رابط کاربری گرافیکی ما انجام می شود.
وقتی رویدادی رخ می دهد، الف علامت توسط ویجت مربوطه منتشر می شود. ابزارک های موجود در Qt سیگنال های از پیش تعریف شده زیادی دارند، اما همیشه می توانید سیگنال های سفارشی اضافی ایجاد کنید.
آ اسلات تابعی است که در پاسخ به a فراخوانی می شود علامت. یک بار دیگر ابزارک های موجود در Qt دارای اسلات های از پیش تعریف شده زیادی هستند، اما ایجاد ابزارک خود بسیار معمول است.
مفیدترین ویژگی های سیگنال ها و اسلات ها عبارتند از:
- یک سیگنال را می توان به سیگنال دیگری متصل کرد
- یک سیگنال را می توان به یک یا چند اسلات متصل کرد
- یک اسلات ممکن است به یک یا چند سیگنال متصل شود
نحو کلی برای اتصال یک سیگنال به یک اسلات به شرح زیر است:
widget.signal.connect(slot_function)
این کد باعث اتصال slot_function
به Widget.signal
و هر زمان که سیگنال ساطع شود، slot_function()
تابع فراخوانی خواهد شد.
برای جلوگیری از رفتار غیرمنتظره، مهم است که هر تابع شکاف را با آن حاشیه نویسی کنید @pyqtSlot()
دکوراتور:
from PyQt6.QtCore import pyqtSlot
@pyqtSlot()
def hello_world():
print('Button is clicked, Hello World!')
حال، بیایید با قرار دادن یک دکمه که به سادگی یک پیام را به console:
import sys
from PyQt6.QtWidgets import QApplication, QPushButton
from PyQt6.QtCore import pyqtSlot
@pyqtSlot()
def hello_world():
print('You shall not pass!')
app = QApplication(sys.argv)
button = QPushButton('Click me')
button.clicked.connect(hello_world)
button.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
پس از اجرای این کد و کلیک روی دکمه، متن زیر را به خروجی می دهد console:
You shall not pass!
3. دکمه ها
اکنون که می توانیم سایر اجزای رابط کاربری گرافیکی را برچسب گذاری کنیم روی یک برنامه – بیایید نگاهی به اولین مؤلفه تعاملی بیندازیم – الف QButton
. دکمه ها منجر به نتایج می شوند – در مورد ما، می توان از آنها برای فراخوانی عملکردهای خاصی استفاده کرد. چند دکمه پیش فرض از پیش تعریف شده وجود دارد که هستند خوب، بله، نه، لغو، درخواست و بستنبا این حال، می توانید متن سفارشی را نیز اضافه کنید روی آنها
میتوانید کنترلکننده رویداد را به دکمهای متصل کنید که با فشار دادن یک دکمه، یک تابع یا هر کد دیگری را فعال میکند. بیایید یک دکمه ایجاد کنیم که به کاربر اجازه می دهد a را اضافه کند QLabel
به صفحه نمایش
هنگامی که کاربر مقداری متن را در یک وارد می کند QLineEdit
، و یک دکمه فشار داده شده است – ما داده ها را از a جمع آوری می کنیم QLineEdit
و از آن متن برای تنظیم متن جدید استفاده کنید QLabel
، که سپس به طرح اضافه می شود.
از آنجایی که دکمه ها انتظار دارند یک تابع قابل فراخوانی به عنوان کنترل کننده رویداد کلیک ارسال شود – ما یک تابع جدید تعریف می کنیم add_label()
که می توان از آن برای افزودن هر کدام استفاده کرد QLabel
به طرح مشخص شده:
def addLabel(layout, text):
layout.addWidget(QLabel(text))
حالا بیایید رابط کاربری گرافیکی خود را بنویسیم و این تابع را با متن ارائه شده توسط کاربر فراخوانی کنیم:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QLineEdit
def addLabel(layout, text):
layout.addWidget(QLabel(text))
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
label = QLabel('Enter some text!')
layout.addWidget(label)
line_edit = QLineEdit()
layout.addWidget(line_edit)
qbtn= QPushButton('Add Label')
layout.addWidget(qbtn)
qbtn.clicked.connect(lambda:addLabel(layout, line_edit.text()))
window.show()
sys.exit(app.exec())
هنگامی که این کد را اجرا می کنیم، می توانیم متنی را در آن بنویسیم QLineEdit
فیلد که به صورت الف به طرح اضافه می شود QLabel
یک بار فشار می دهیم روی برچسب اضافه کنید:
4. ویرایش های خط
نگاهی کوتاه به آن انداخته ایم QLineEdit
ویجت دو بار در حال حاضر – بیایید یک لحظه وقت بگذاریم تا ببینیم چه چیزی ارائه می دهد. همانطور که قبلا دیده شد، به کاربران اجازه می دهد تا یک خط متن را وارد کنند – اینها روش ابتدایی برای جمع آوری داده های کاربر هستند، چه برای افزودن یا ویرایش داده های موجود. ما البته می توانیم عملیات معمولی مانند کپی 🀄، چسباندن، لغو کردن، دوباره انجام دهید هنگام نوشتن متن درون آنها.
برخی از روش های رایجی که با آنها استفاده می کنید عبارتند از:
setAlignment()
یک بار دیگر، عنوان را مطابق با ثابت های تراز تراز می کندsetMaxLength()
حداکثر تعداد کاراکترهایی را تنظیم می کند که کاربر نمی تواند از آنها فراتر رودtext()
– متن را در a بازیابی می کندQLineEdit
setText()
– متن را به a تنظیم می کندQLineEdit
clear()
تمام محتویات را پاک می کندQLineEdit
بیایید مثال قبلی را بازنویسی کنیم، اما این بار قبلاً مقداری متن از پیش تعریف شده در a داریم QLineEdit
، یک موجود از قبل را تغییر دهید QLabel
به جای اضافه کردن مورد جدید – و به طور خلاصه کاربرد آن را بررسی کنید اسلات های PyQt، که در ادامه به تفصیل بیشتر پرداخته خواهد شد روی در راهنما
ما یک برنامه نقل قول ابتدایی ایجاد خواهیم کرد، که مجموعه ای از نقل قول های معروف را در خود جای داده و یک مورد تصادفی به شما می دهد. روی تقاضا می توانید با افزودن یک لیست جدید و کلیک کردن، این لیست را گسترش دهید اضافه کردن نقل قول، که پس از تصمیم گیری برای دریافت یک مورد تصادفی جدید از طریق، در مجموعه نقل قول گنجانده می شود نقل قول تصادفی دریافت کنید:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QLineEdit
from PyQt6.QtCore import pyqtSlot
import random
@pyqtSlot()
def randomQuote():
quoteLabel.setText(random.choice(quotes))
@pyqtSlot()
def addQuote():
quotes.append(newQuoteLineEdit.text())
newQuoteLineEdit.clear()
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
quotes = ('Do or do not, there is no try.', 'The meaning of life is 42')
quoteLabel = QLabel(random.choice(quotes))
newQuoteLineEdit = QLineEdit('Add new quote...')
addQuoteButton = QPushButton('Add New Quote')
getQuoteButton = QPushButton('Get Random Quote')
layout.addWidget(newQuoteLineEdit)
layout.addWidget(quoteLabel)
layout.addWidget(addQuoteButton)
layout.addWidget(getQuoteButton)
getQuoteButton.clicked.connect(randomQuote)
addQuoteButton.clicked.connect(addQuote)
window.show()
sys.exit(app.exec())
این نتیجه در:
5. جعبه های ترکیبی
جعبه های ترکیبی به کاربران اجازه می دهد تا از لیستی از گزینه ها انتخاب کنند – شبیه به <select>
تگ در HTML اینها را می توان از طریق QComboBox
ویجت. اساسی QComboBox
یک ویجت فقط خواندنی است، به این معنی که کاربر باید منحصراً از لیست از پیش تعریف شده انتخاب کند و نمی تواند گزینه های خود را اضافه کند. با این حال، آنها همچنین می توانند قابل ویرایش باشند – که به کاربر اجازه می دهد تا در صورتی که هیچ کدام با نیازهای او مطابقت نداشت، گزینه جدیدی اضافه کند.
در زیر متداول ترین روش های استفاده شده از کلاس QComboBox آورده شده است:
addItem()
یک رشته به مجموعه اضافه می کندaddItems()
هر یک از رشته های موجود در لیست داده شده را به مجموعه اضافه می کندClear()
برای حذف تمام موارد موجود در مجموعه استفاده می شودcount()
برای بازیابی تعداد آیتم های مجموعه استفاده می شودcurrentText()
برای بازیابی متن مورد انتخاب شده فعلی استفاده می شودitemText()
یک را می پذیردindex
آرگومان و متن آن آیتم را برمی گرداندcurrentIndex()
نمایه مورد انتخاب شده فعلی را برمی گرداند
بیایید یک برنامه سفارش کوچک ایجاد کنیم، که در آن کاربر یک مورد را از یک منو انتخاب می کند و یک نظر برای رستوران وارد می کند. سپس، هنگامی که یک دکمه کلیک می شود – این ترتیب به کاربر نشان داده می شود:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QLineEdit, QComboBox
from PyQt6.QtCore import pyqtSlot
@pyqtSlot()
def placeOrder():
order_format = "Placed order for {} with comment '{}'"
layout.addWidget(QLabel(order_format.format(comboBox.currentText(), commentLineEdit.text())))
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
label1 = QLabel('Pick one of the following options:')
comboBox = QComboBox()
comboBox.addItems(('Pasta', 'Pizza', 'Lasagna'))
layout.addWidget(label1)
layout.addWidget(comboBox)
commentLineEdit = QLineEdit('Comment for the restaurant...')
placeOrderButton = QPushButton('Place order')
layout.addWidget(commentLineEdit)
layout.addWidget(placeOrderButton)
placeOrderButton.clicked.connect(placeOrder)
window.show()
sys.exit(app.exec())
حالا بیایید سفارشی ثبت کنیم و درخواستی را به آن پیوست کنیم:
6. دکمه های رادیویی و چک باکس ها
دکمههای رادیویی و چکباکسها عمدتاً برای یک هدف استفاده میشوند – به کسی اجازه میدهند یک گزینه را از بین چندین گزینه انتخاب کنند. تنها تفاوت این است – جعبههای رادیویی زمانی استفاده میشوند که میخواهیم کاربر را به انتخاب یک گزینه محدود کنیم، در حالی که چک باکسها زمانی استفاده میشوند که میخواهیم به کاربر اجازه دهیم چندین گزینه را انتخاب کند.
به عنوان مثال، ممکن است کاربر را مجبور کنیم که بین مشتری جدید یا قدیمی بودن (نمیتواند همزمان هر دو باشد) یکی را انتخاب کند، اما به او اجازه میدهیم چندین سرویس را انتخاب کند که میخواهد در آن ثبتنام کند.
اینها به عنوان اجرا می شوند QRadioButton
و QCheckBox
، به طور طبیعی ما میتوانیم بررسی کنیم که آیا آنها علامت زده شدهاند، آنها را علامتدار یا بدون علامت تنظیم کنیم، متن آنها را تنظیم کنیم و همچنین متن برچسبهای آنها را بازیابی کنیم:
setChecked()
دکمه رادیویی یا چک باکس را بررسی می کندsetText()
برچسب مرتبط با دکمه یا چک باکس را تنظیم می کندtext()
برچسب دکمه/چک باکس را بازیابی می کندisChecked()
بررسی می کند که آیا دکمه/چک باکس انتخاب شده است یا خیر
بیایید یک برنامه ساده ایجاد کنیم که به کاربران امکان می دهد بین چند سرویسی که یک کارواش خیالی ارائه می دهد انتخاب کنند:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QRadioButton, QCheckBox
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
label_customer = QLabel('Pick one of the following options:')
qradioButton = QRadioButton('Old Customer')
qradioButton2 = QRadioButton('New Customer')
qradioButton2.setChecked(True)
layout.addWidget(label_customer)
layout.addWidget(qradioButton)
layout.addWidget(qradioButton2)
label_service = QLabel("Pick the services you'd like:")
qCheckBox = QCheckBox('Car Wash')
qCheckBox2 = QCheckBox('Car Polish')
qCheckBox3 = QCheckBox('Vacuuming')
layout.addWidget(label_service)
layout.addWidget(qCheckBox)
layout.addWidget(qCheckBox2)
layout.addWidget(qCheckBox3)
window.show()
sys.exit(app.exec())
این به ما یک برنامه نظرسنجی مانند می دهد که به ما امکان می دهد مشتری قدیمی یا جدید باشیم و به ما امکان می دهد بین خدماتی که کارواش ارائه می دهد انتخاب کنیم:
7. نمایش داده ها با استفاده از ویجت جدول
QTableWidget
ویجتی است که بدون پرداختن به پیکربندی زیاد، به ما اجازه میدهد تا جداول اکسل مانند عالی را در PyQt ایجاد کنیم، که در آنها میتوانیم دادهها را نمایش دهیم.
هر جدول یک جدول مبتنی بر آیتم با سطر و ستون است.
به خاطر داشته باشید که با استفاده از a QTableWidget
تنها راه نمایش اطلاعات در جداول نیست. مدل های داده را می توان با استفاده از ایجاد و نمایش داد QTableView
ویجت نیز. اگرچه، QTableWidget
ذاتاً از a استفاده می کند QTableView
در زیر هود برای ایجاد یک جدول، بنابراین ما از رویکرد سطح بالاتر استفاده از جدول از همان ابتدا استفاده خواهیم کرد.
با توجه به ماهیت ستون-ردی جداول – ما می توانیم به راحتی دیکشنری هایی ایجاد کنیم تا داده ها یا حتی لیست هایی از لیست ها را نگهداری کنیم. هنگام ایجاد جدول، می خواهیم تعداد ستون و ردیف را تنظیم کنیم قبل از هر داده ای را به آن اضافه کنید و سپس آن را از طریق حلقه ها پر کنید:
setRowCount()
تعداد ردیف ها را تنظیم می کندsetColumnCount()
تعداد ستون ها را تنظیم می کندsetHorizontalHeaderLabels()
برچسب های هدرهای افقی را تنظیم می کند
حال، بیایید یک برنامه کاربردی ساده ایجاد کنیم که حاوی جدولی با چندین کشور شمال اروپا و پایتخت آنها باشد:
import sys
from PyQt6.QtWidgets import (QApplication, QTableWidget, QTableWidgetItem)
from PyQt6.QtGui import QColor
nordic_countries = (('Norway', 'Oslo', 'Yes'),
('Iceland', 'Reykjavik', 'Yes'),
('Denmark', 'Copenhagen', 'Yes'),
('Belgium', 'Brussels','No'))
app = QApplication(sys.argv)
table = QTableWidget()
table.setRowCount(len(nordic_countries))
table.setColumnCount(len(nordic_countries(0)))
table.setHorizontalHeaderLabels(('Country', 'Capital', 'Scandinavian?'))
for i, (country, capital, scandinavian_bool) in enumerate(nordic_countries):
item_country = QTableWidgetItem(country)
item_capital = QTableWidgetItem(capital)
item_scandinavian_bool = QTableWidgetItem(scandinavian_bool)
table.setItem(i, 0, item_country)
table.setItem(i, 1, item_capital)
table.setItem(i, 2, item_scandinavian_bool)
table.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
8. نمایش داده ها با استفاده از ویجت درخت
ابزارک های درختی برای نمایش ساختارهای درخت مانند مانند سلسله مراتب فایل ها یا فهرست های فرعی مربوط به لیست های خاصی از عناصر واقعا مفید هستند. برای تطبیق با این نوع ویجت، PyQt ارائه می دهد QTreeWidget
.
مشابه روش QTableWidget
ساخته شده است روی بالای QTableView
– QTreeWidget
ساخته شده است روی بالای QTreeView
.
درخت شامل سرصفحه ها و موارد. سرصفحه ها نام ستون ها هستند. هر آیتم می تواند چندین آیتم به آن اختصاص داده شود. برای مثال، یک آیتم میتواند یک فهرست باشد، در حالی که آیتمهای خودش فایلهای درون آن فهرست هستند – یا یک آیتم میتواند یک کار باشد، و آیتمهای آن افرادی هستند که به آن کار اختصاص داده شدهاند.
برخی از روشهای رایجی که برای کار با ابزارک درختی استفاده میکنیم عبارتند از:
setHeaderLabels()
نام ستون را برای ویجت درختی تنظیم می کندclear()
برای پاک کردن تمام داده ها از درختeditItem()
برای ویرایش یک مورد خاص در درختaddTopLevelItem()
برای افزودن یک مورد سطح بالاaddTopLevelItems()
برای افزودن لیستی از موارد سطح بالا
هر مورد را می توان به یک جزء والد اختصاص داد. برای یک آیتم سطح بالا، میتوانیم آن را به آن اختصاص دهیم QTreeWidget
خود، در حالی که برای آیتم های سطح پایین تر – می توانیم آنها را به آیتم های سطح بالای موجود نسبت دهیم. با این کار میتوانید تا جایی که میخواهید پایین بروید، هرچند، داشتن سطوح زیاد میتواند برای کاربر گیجکننده باشد.
بیایید پیش برویم و یک لیست خرید سریع تهیه کنیم – با Food
و Furniture
به عنوان اقلام سطح بالا (دسته های اقلامی که می خواهیم بخریم) و فرزندان آنها خود اقلام واقعی خواهند بود:
import sys
from PyQt6 import QtWidgets
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(window)
tree_widget = QtWidgets.QTreeWidget()
tree_widget.setHeaderLabels(('Items', 'Total Cost'))
foodList = QtWidgets.QTreeWidgetItem(tree_widget, ('Food', '€ 15'))
QtWidgets.QTreeWidgetItem(foodList, ('Apples', '€ 6'))
QtWidgets.QTreeWidgetItem(foodList, ('Pears', '€ 4'))
QtWidgets.QTreeWidgetItem(foodList, ('Oranges', '€ 5'))
furnitureList = QtWidgets.QTreeWidgetItem(tree_widget, ('Furniture', '€ 225'))
QtWidgets.QTreeWidgetItem(furnitureList, ('Table', '€ 150'))
QtWidgets.QTreeWidgetItem(furnitureList, ('Chairs', '€ 75'))
layout.addWidget(tree_widget)
window.show()
sys.exit(app.exec())
پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:
نتیجه
در این راهنما، ما به PyQt پریده ایم – پوشش پایتون برای کتابخانه محبوب Qt.
ما نگاهی به برخی از مفاهیم کلیدی کتابخانه انداختهایم و از طریق Layout Managers به کار با آن پرداختهایم، با ابزارکها آشنا شدهایم و چندین برنامه نمایشی واقعا ساده ایجاد کردهایم که نشان میدهد چگونه میتوانید از آنها استفاده کنید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-10 18:39:04