وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

کار با چارچوب PyQT پایتون

0 107
زمان لازم برای مطالعه: 17 دقیقه


معرفی

در این راهنما، روش استفاده از 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())

اجرای این کد یک برنامه ساده را مقداردهی اولیه می کند:

کار با چارچوب PyQT پایتون

بیایید خط به خط این مقداردهی اولیه را مرور کنیم.

اولا ما 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 عبارتند از:

  1. QVBoxLayout ویجت ها را به صورت عمودی مرتب می کند.
  2. QHBoxLayout ابزارک ها را به صورت افقی مرتب می کند.
  3. QGridLayout ویجت ها را در یک شبکه مرتب می کند.
  4. QFormLayout ویجت ها را در دو ستون مرتب می کند.

هنگام ایجاد برنامه‌های رابط کاربری گرافیکی با PyQt، اغلب از بیش از یکی از چهار مدیر طرح‌بندی همه منظوره، حتی در یک برنامه، برای انواع مختلف پنجره‌ها استفاده می‌کنید.

بیایید از مثال قبلی استفاده کنیم و با افزودن چندین ویجت مانند QPushButtons و مدیریت آنها از طریق یک 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())

پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:

مثال QVBoxLayout

این پنجره شامل 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())

پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:

مثال QHBoxLayout

این پنجره شامل 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())

پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:

مثال QGridLayout

این پنجره شامل 5 دکمه است که همانطور که در قسمت مشخص شده است مرتب شده اند addWidget() روش. خود متد 3 آرگومان را می پذیرد:

  1. ویجتی که باید در شبکه قرار گیرد.
  2. ردیفی که باید در آن قرار گیرد.
  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. با تغییر اندازه پنجره، خواهیم دید که هر دکمه به جای مرکز، در سمت چپ کادر خود تراز شده است:

کار با چارچوب PyQT پایتون

در حالی که اگر استفاده کردیم AlignCenter یا آن را به عنوان پیش فرض رها کنید:

کار با چارچوب PyQT پایتون

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())

پس از اجرای این کد، پنجره زیر را مشاهده می کنیم روی صفحه نمایش ما:

مثال QFormLayout

این پنجره شامل 2 برچسب و 2 است QLineEdit فیلدهای اضافه شده از طریق addRow() روش. addRow() 2 استدلال را می پذیرد:

  1. متن برچسب (رشته)
  2. ویجت ورودی (QWidget)

روش به طور خودکار ایجاد و اضافه می کند QLabel اعتراض با ما labelText به عنوان متن آن علاوه بر این، شما همچنین می توانید یک را اضافه کنید QLabel آرگومان به جای یک رشته، که تبدیل خودکار را رد می کند:

layout.addRow(QLabel('Nickname:'), QLineEdit())
layout.addRow(QLabel('Score:'), QLineEdit())

این نیز منجر به:

کار با چارچوب PyQT پایتون

اکنون که با 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())

این نتیجه در:

کار با چارچوب PyQT پایتون

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 ساخته شده است روی بالای QTableViewQTreeWidget ساخته شده است روی بالای 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید