FA-TOOLS — Header Component
آموزش pyqt5

آموزش PyQt5: ساخت نرم‌افزارهای دسکتاپ با پایتون از صفر تا پیشرفته

کتابخانه PyQt5 یکی از قدرتمندترین فریم‌ورک‌های توسعه نرم‌افزارهای دسکتاپ در پایتون است که امکان ساخت برنامه‌های چندپلتفرمی با رابط کاربری گرافیکی (GUI) و کارایی بالا را فراهم می‌کند. با یادگیری PyQt5 می‌توانید ایده‌های خود را به برنامه‌هایی قابل اجرا در windows، macOS و Linux تبدیل کنید. در این مقاله جامع، مفاهیم کلیدی، معماری سیگنال و اسلات، مدیریت چیدمان، بهینه‌سازی عملکرد با QThread و نکات عمیق فنی را به‌صورت کاملاً کاربردی یاد می‌گیرید.

فهرست مطالب

  • ۱. PyQt5 چیست و چرا باید آن را انتخاب کنیم؟
  • ۲. راهنمای گام‌به‌گام نصب PyQt5 و ابزارهای جانبی
  • ۳. ساخت اولین پنجره کاربردی و بررسی ساختار کد
  • ۴. معماری سیگنال و اسلات (Signal & Slot)
  • ۵. مدیریت چیدمان (Layout Management)
  • ۶. شخصی‌سازی ظاهر برنامه با QSS
  • ۷. ۳ نکته کلیدی و تجربه عملی در برنامه‌نویسی PyQt5
  • ۸. کار با Qt Designer برای طراحی سریع بدون کدنویسی
  • ۹. پرسش‌های متداول
  • ۱۰. عیب‌یابی سریع خطاهای رایج

خلاصه سریع و مهم‌ترین نکات این مقاله:

  • پایدارترین ابزار پایتون برای ساخت برنامه دسکتاپ بر پایه فریم‌ورک قدرتمند Qt5.
  • پشتیبانی کامل از معماری رویدادمحور با الگوی سیگنال و اسلات.
  • قابلیت جداسازی ظاهر و منطق برنامه با ابزار visual به نام Qt Designer.
  • امکان استفاده از QThread جهت جلوگیری از Freeze شدن رابط کاربری در پردازش‌های سنگین.

۱. PyQt5 چیست و چرا باید آن را انتخاب کنیم؟

۱. PyQt5 چیست و چرا باید آن را انتخاب کنیم؟
PyQt5 مجموعه پیوندهای پایتون (Python bindings) برای فریم‌ورک Qt5 شرکت C++ Qt Company است. این ابزار به برنامه‌نویسان اجازه می‌دهد تا اپلیکیشن‌های گرافیکی کامل، چندپلتفرمی و با عملکرد نزدیک به زبان‌های نیتیو ایجاد کنند.

توسعه دهندگانی که قصد دارند ابزارهای مدیریتی، داشبوردهای داده یا برنامه‌های دسکتاپ بسازند، معمولاً بین کتابخانه‌های مختلف پایتون تردید دارند. PyQt5 به دلیل دارا بودن بیش از ۶۰۰ کلاس آماده، کنترل کامل روی ویجت‌ها، پشتیبانی از یونیکد و چیدمان‌های انعطاف‌پذیر، برتری چشمگیری نسبت به کتابخانه‌های ساده‌تری مانند Tkinter دارد.

ویژگی مقایسه PyQt5 با Tkinter
پیچیدگی و یادگیری PyQt5 منحنی یادگیری متوسط دارد، در حالی که Tkinter بسیار ساده است.
تنوع ویجت‌ها و ظاهر PyQt5 شامل ویجت‌های بسیار مدرن، جدول‌های پیشرفته و قابلیت استایل‌دهی کامل است.
طراحی بصری (Visual) دارای ابزار Qt Designer برای کشیدن و رها کردن عناصر (Drag & Drop).
کارایی در برنامه‌های بزرگ به دلیل استفاده از هسته C++، سرعت و مدیریت حافظه فوق‌العاده‌ای در مقیاس بالا دارد.

۲. راهنمای گام‌به‌گام نصب PyQt5 و ابزارهای جانبی

۲. راهنمای گام‌به‌گام نصب PyQt5 و ابزارهای جانبی
برای نصب PyQt5 کافیست از مدیر بسته‌های پایتون (PyPI) و دستور pip استفاده کنید. جهت طراحی بصری، نصب بسته `pyqt5-tools` نیز توصیه می‌شود.

مراحل زیر را در محیط ترمینال یا Command Prompt خود دنبال کنید:

  1. ابتدا از به‌روز بودن ابزار pip مطمئن شوید:
    python -m pip install –upgrade pip
  2. کتابخانه اصلی PyQt5 را نصب کنید:
    pip install PyQt5
  3. برای دسترسی به محیط گرافیکی Qt Designer، ابزارهای جانبی را نصب کنید:
    pip install pyqt5-tools

۳. ساخت اولین پنجره کاربردی و بررسی ساختار کد

۳. ساخت اولین پنجره کاربردی و بررسی ساختار کد
ساختار اصلی هر برنامه PyQt5 از یک نمونه `QApplication` و حداقل یک کلاس مشتقه از `QWidget` یا `QMainWindow` تشکیل می‌شود.

کد زیر ساده‌ترین برنامه ساخت پنجره در PyQt5 است. می‌توانید مشابه نمونه‌های دیگر در بخش تکه‌کدهای پایتون، ساختار آن را بررسی کنید:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # تنظیمات اصلی پنجره
        self.setWindowTitle('اولین برنامه PyQt5 من')
        self.setGeometry(100, 100, 400, 200)

        # ساخت ویجت‌ها
        self.label = QLabel('به آموزش PyQt5 خوش آمدید!', self)
        self.btn = QPushButton('کلیک کنید', self)

        # چیدمان عمودی
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.btn)
        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

در کد بالا، `QApplication` مسئول مدیریت چرخه حیات (Event Loop) برنامه است. فراخوانی `sys.exit(app.exec_())` باعث می‌شود برنامه تا زمانی که کاربر پنجره را ببندد فعال بماند.

۴. معماری سیگنال و اسلات (Signal & Slot)

۴. معماری سیگنال و اسلات (Signal & Slot)
سیگنال و اسلات مکانیزم اختصاصی Qt برای ارتباط بین اشیاء است. وقتی رخدادی (مانند کلیک دکمه) اتفاق می‌افتد، سیگنالی ارسال می‌شود که به اسلات (متد یا تابع) متصل متصل گردیده است.

به زبان ساده، سیگنال همان “رویداد” (Event) و اسلات همان “تابع پاسخ‌دهنده” (Handler) است. برای متصل کردن دکمه به یک تابع در PyQt5 به این شکل عمل می‌کنیم:

# تعریف تابع اسلات
def on_button_click(self):
    self.label.setText('دکمه فشرده‌ شد!')

# اتصال سیگنال clicked دکمه به اسلات
self.btn.clicked.connect(self.on_button_click)

این ساختار decoupling یا جداسازی اجزا را بسیار آسان می‌کند، چرا که فرستنده سیگنال هیچ نیازی به داشتن اطلاعات از گیرنده آن ندارد.

۵. مدیریت چیدمان (Layout Management)

۵. مدیریت چیدمان (Layout Management)
مدیریت چیدمان به شما اطمینان می‌دهد که ویجت‌ها با تغییر سایز پنجره توسط کاربر، به‌طور خودکار مقیاس‌پذیر شده و منظم باقی می‌مانند.

در PyQt5 سه لایه چیدمان پرکاربرد وجود دارد:

  • QVBoxLayout: چیدن عناصر به صورت عمودی زیر هم.
  • QHBoxLayout: چیدن عناصر به صورت افقی کنار هم.
  • QGridLayout: چیدن عناصر به صورت شبکه ماتریسی (سطر و ستون)، عالی برای فرم‌های پیچیده.

۶. شخصی‌سازی ظاهر برنامه با QSS

کتابخانه PyQt5 از کسکادینگ استایل شیت اختصاصی Qt (QSS) پشتیبانی می‌کند که سینتکسی بسیار شبیه به CSS در دنیای وب دارد.

شما می‌توانید ظاهر ویجت‌های دسکتاپ را دقیقا مشابه آنچه در نمونه‌های CSS کاربردی استفاده می‌کنید استایل‌دهی کنید. برای مثال:

# اعمال استایل روی دکمه
self.btn.setStyleSheet("""
    QPushButton {
        background-color: #2563eb;
        color: white;
        border-radius: 5px;
        padding: 8px 16px;
        font-size: 14px;
    }
    QPushButton:hover {
        background-color: #1d4ed8;
    }
""")

۷. ۳ نکته کلیدی و تجربه عملی در برنامه‌نویسی PyQt5

اکثر آموزش‌های مقدماتی از ذکر چالش‌های واقعی توسعه نرم‌افزار خودداری می‌کنند. در این بخش ۳ نکته کلیدی که در پروژه‌های واقعی با آن‌ها مواجه می‌شوید آورده شده است:

نکته اول: جلوگیری از هنگ کردن GUI با استفاده از QThread

اگر در تابع اسلات خود محاسبات سنگین ریاضی انجام دهید، رابط کاربری قفل شده و اصطلاحاً “Not Responding” می‌شود. برای مثال، نباید محاسبات سنگین پردازش داده یا اجرای کدهای پردازشی مانند کدهای محاسباتی در پایتون با numpy را روی ترد اصلی رابط گرافیکی اجرا کنید. همیشه پردازش‌های زمان‌بر را به یک `QThread` مجزا منتقل کنید:

from PyQt5.QtCore import QThread, pyqtSignal

class WorkerThread(QThread):
    # سیگنال برای ارسال نتیجه به ترد اصلی
    result_ready = pyqtSignal(str)

    def run(self):
        # انجام پردازش سنگین
        # ...
        self.result_ready.emit("پردازش با موفقیت تمام شد")

نکته دوم: تله Garbage Collection پایتون و بسته شدن ناگهانی پنجره‌ها

یکی از اشتباهات متداول این است که پنجره جدیدی را درون یک تابع محلی نمونه‌سازی می‌کنید بدون اینکه ارجاعی از آن را در `self` ذخیره کنید. پس از پایان تابع، زباله‌روب (Garbage Collector) پایتون آن پنجره را از حافظه پاک کرده و پنجره بلافاصله بسته می‌شود!

اشتباه: `win = SecondaryWindow(); win.show()`
درست: `self.win = SecondaryWindow(); self.win.show()`

نکته سوم: بهینه‌سازی سیگنال‌های سفارشی برای نشت حافظه

همیشه توجه داشته باشید هنگامی که یک ویجت به صورت پویا حذف می‌شود، اتصال سیگنال‌های آن به اسلات‌های سایر اشیاء ممکن است برقرار بماند. قبل از حذف شیء با فراخوانی `disconnect()` پیوندها را قطع کنید تا از Memory Leak جلوگیری کنید.

۸. کار با Qt Designer برای طراحی سریع بدون کدنویسی

ابزار Qt Designer یک محیط Drag & Drop برای طراحی فرم‌های GUI است که فایل‌هایی با پسوند `.ui` خروجی می‌دهد.

طرح‌بندی بصری سرعت توسعه برنامه‌های بزرگ را تا چند برابر افزایش می‌دهد. مراحل کار با آن به شرح زیر است:

  1. اجرای فایل `designer.exe` که معمولاً در مسیر نصب پایتون در پوشه `site-packages/qt5_applications/Qt/bin` قرار دارد.
  2. طراحی فرم، افزودن ویجت‌ها و تنظیم چیدمان‌ها.
  3. ذخیره فایل طراحی با نام مثلاً `main_window.ui`.
  4. تبدیل فایل UI به کد پایتون با اجرای دستور زیر در ترمینال:
    pyuic5 -x main_window.ui -o main_window.py

همچنین جهت بررسی موارد بیشتر و یادگیری دیگر ابزارهای کدنویسی می‌توانید به بخش تکه‌کدهای آماده کدنویسی سر بزنید.

۹. پرسش‌های متداول

آیا PyQt5 رایگان است؟

PyQt5 تحت پروانه GPLv3 و مجوز تجاری عرضه می‌شود. اگر برنامه‌ای که می‌نویسید متن‌باز باشد استفاده از آن کاملاً رایگان است، اما برای پروژه‌های تجاری closed-source باید لایسنس خریده شود یا از PySide2 استفاده شود.

تفاوت اصلی PyQt5 و PySide2 چیست؟

هر دو کتابخانه پیوند پایتون برای Qt5 هستند. PySide2 لایسنس LGPL دارد که امکان استفاده رایگان در پروژه‌های تجاری را فراهم می‌کند، اما PyQt5 جامعه کاربری قدیمی‌تر و نمونه‌کدهای بیشتری در اینترنت دارد.

چگونه برنامه PyQt5 را به فایل exe تبدیل کنیم؟

می‌توانید با نصب ابزار PyInstaller و اجرای دستور `pyinstaller –noconsole –onefile main.py` برنامه خود را به یک فایل قابل اجرا بدون نیاز به پایتون تبدیل کنید.

آیا PyQt5 از زبان فارسی و راست‌به‌چپ (RTL) پشتیبانی می‌کند؟

بله، با استفاده از متد `setLayoutDirection(Qt.RightToLeft)` روی پنجره اصلی یا ویجت‌ها، کل برنامه به صورت کاملاً استاندارد به حالت راست‌به‌چپ تغییر می‌کند.

۱۰. عیب‌یابی سریع خطاهای رایج

خطای ۱: QCoreApplication::exec: The event loop is already running

علت: فراخوانی مجدد `app.exec_()` در حالی که چرخه رویداد برنامه فعال است.

حل سریع: مطمئن شوید که دستور `app.exec_()` فقط یک‌بار و در بلوک اصلی `if __name__ == ‘__main__’:` فراخوانی شده است.

خطای ۲: TypeError: native Qt signal is not callable

علت: تلاش برای صدا زدن مستقیم سیگنال مانند `self.btn.clicked()` به‌جای ارسال متد به متد `connect`.

حل سریع: حتماً از ساختار `self.btn.clicked.connect(self.my_function)` استفاده کنید و پرانتز جلوی اسم تابع متصل‌شونده را بردارید.

خطای ۳: Segmentation fault / Process finished with exit code -1073741819

علت: دسترسی به ویجت یا شیئی از C++ که در حافظه نابود شده ولی ارجاع پایتون به آن هنوز باقی مانده است.

حل سریع: از دستکاری یا حذف ویجت‌های والدین (Parent) بدون مدیریت فرزندان خودداری کرده و مطمئن شوید کدهای مربوط به تغییرات GUI درون QThread غیر اصلی اجرا نشوند.

سوالات متداول

PyQt5 چیست و چه کاربردی دارد؟

PyQt5 یک فریم‌ورک قدرتمند پایتون برای ساخت نرم‌افزارهای دسکتاپ با رابط کاربری گرافیکی (GUI) است. با این ابزار می‌توانید برنامه‌های چندپلتفرمی برای سیستم‌عامل‌های ویندوز، مک و لینوکس توسعه دهید.

تفاوت اصلی PyQt5 و Tkinter چیست؟

PyQt5 ویجت‌های بسیار پیشرفته‌تر، ظاهر مدرن‌تر و ابزار طراحی بصری Qt Designer دارد. در مقابل، Tkinter ساده‌تر است اما برای برنامه‌های پیچیده و بزرگ دسکتاپ محدودیت‌های زیادی دارد.

چگونه PyQt5 را در پایتون نصب کنیم؟

شما می‌توانید با اجرای دستور pip install PyQt5 در محیط ترمینال، این کتابخانه را به‌راحتی نصب کنید. همچنین برای دسترسی به محیط گرافیکی طراحی، نصب pyqt5-tools پیشنهاد می‌شود.

آیا PyQt5 برای پروژه‌های تجاری رایگان است؟

PyQt5 تحت پروانه GPL v3 و لایسنس تجاری عرضه می‌شود. اگر قصد دارید سورس‌کد برنامه خود را بسته نگه‌دارید، باید لایسنس تجاری خریداری کرده یا از فریم‌ورک‌های جایگزین مانند PySide6 استفاده کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *