تقنيات نور التعليمية تقنيات نور التعليمية

آخر الأخبار

جاري التحميل ...

الدرس 12 من PyQt – التعامل مع النوافذ المتعددة (Multiple Windows / Dialogs).

🎯 الهدف من الدرس

في هذا الدرس سنتعلم:

  1. كيفية إنشاء نافذة رئيسية (Main Window).
  2. كيفية فتح نافذة ثانوية (Dialog / Child Window).
  3. تمرير البيانات من نافذة إلى أخرى.
  4. إغلاق النوافذ والتعامل مع العودة للنافذة السابقة.
Multiple Windows / Dialogs


📝 المثال التطبيقي

سننشئ تطبيق بسيط فيه:

  • نافذة رئيسية فيها زر "فتح نافذة ثانية".
  • النافذة الثانية تحتوي على حقل إدخال (QLineEdit) وزر "إرسال".
  • عند كتابة نص في النافذة الثانية والضغط على إرسال، سيعود النص للنافذة الأولى ويُعرض في Label.


💻 الكود

import sys
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QPushButton, QLabel,
    QDialog, QVBoxLayout, QLineEdit, QWidget
)


# النافذة الثانوية
class SecondWindow(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("النافذة الثانية")
        self.setGeometry(300, 300, 300, 150)

        layout = QVBoxLayout()

        # إدخال النص
        self.input_field = QLineEdit(self)
        self.input_field.setPlaceholderText("اكتب شيئًا هنا...")
        layout.addWidget(self.input_field)

        # زر الإرسال
        self.btn_send = QPushButton("إرسال", self)
        self.btn_send.clicked.connect(self.send_data)
        layout.addWidget(self.btn_send)

        self.setLayout(layout)

    def send_data(self):
        text = self.input_field.text()
        if text:
            # إرسال النص للنافذة الرئيسية
            self.parent().update_label(text)
            self.close()


# النافذة الرئيسية
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("النافذة الرئيسية")
        self.setGeometry(200, 200, 400, 200)

        # الواجهة
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout(self.central_widget)

        # Label لعرض البيانات
        self.label = QLabel("لم يتم استلام بيانات بعد", self)
        self.layout.addWidget(self.label)

        # زر فتح النافذة الثانية
        self.btn_open = QPushButton("فتح النافذة الثانية", self)
        self.btn_open.clicked.connect(self.open_second_window)
        self.layout.addWidget(self.btn_open)

    def open_second_window(self):
        self.second_window = SecondWindow(self)
        self.second_window.exec_()  # فتح كـ Dialog (ينتظر الإغلاق)

    def update_label(self, text):
        self.label.setText(f"النص المستلم: {text}")


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

✅ شرح الكود

1- أنشأنا نافذة رئيسية (MainWindow) فيها زر يفتح نافذة ثانية.
2- النافذة الثانية (SecondWindow) تحتوي على إدخال نص وزر إرسال.

عند الضغط على "إرسال":

  • يتم إرسال النص إلى النافذة الرئيسية عبر update_label.
  • يتم إغلاق النافذة الثانية.

3- النتيجة: النص يظهر في الـ Label داخل النافذة الرئيسية.

📝 التمرين: إنشاء نافذة تسجيل دخول

المطلوب:

1- إنشاء نافذة تسجيل دخول تحتوي على:

  • حقل اسم المستخدم (QLineEdit).
  • حقل كلمة المرور (QLineEdit مع خاصية إخفاء النص).
  • زر تسجيل الدخول.

2- إذا كانت البيانات صحيحة (مثلاً: اسم المستخدم = admin وكلمة المرور = 1234) → تفتح نافذة جديدة بعنوان "النافذة الرئيسية".
3- إذا كانت البيانات خاطئة → يظهر تنبيه (QMessageBox).


💻 الحل

import sys
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QDialog, QLabel, QPushButton,
    QLineEdit, QVBoxLayout, QWidget, QMessageBox
)


# النافذة الرئيسية بعد تسجيل الدخول
class MainApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("النافذة الرئيسية")
        self.setGeometry(200, 200, 400, 200)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        layout = QVBoxLayout(central_widget)

        label = QLabel("مرحبًا بك في التطبيق 🎉")
        layout.addWidget(label)


# نافذة تسجيل الدخول
class LoginWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("تسجيل الدخول")
        self.setGeometry(300, 300, 300, 150)

        layout = QVBoxLayout()

        # إدخال اسم المستخدم
        self.username_input = QLineEdit(self)
        self.username_input.setPlaceholderText("اسم المستخدم")
        layout.addWidget(self.username_input)

        # إدخال كلمة المرور
        self.password_input = QLineEdit(self)
        self.password_input.setPlaceholderText("كلمة المرور")
        self.password_input.setEchoMode(QLineEdit.Password)  # إخفاء النص
        layout.addWidget(self.password_input)

        # زر تسجيل الدخول
        self.login_button = QPushButton("تسجيل الدخول", self)
        self.login_button.clicked.connect(self.check_login)
        layout.addWidget(self.login_button)

        self.setLayout(layout)

    def check_login(self):
        username = self.username_input.text()
        password = self.password_input.text()

        if username == "admin" and password == "1234":
            self.accept()  # إغلاق نافذة تسجيل الدخول بنجاح
        else:
            QMessageBox.warning(self, "خطأ", "اسم المستخدم أو كلمة المرور غير صحيحة")


if __name__ == "__main__":
    app = QApplication(sys.argv)

    login = LoginWindow()

    if login.exec_() == QDialog.Accepted:
        window = MainApp()
        window.show()
        sys.exit(app.exec_())

✅ شرح الفكرة

1- نافذة تسجيل الدخول (LoginWindow):

  • إذا كان الإدخال صحيح (admin / 1234) → يتم استدعاء self.accept() لإغلاق النافذة بنجاح.
  • إذا كان خاطئ → يظهر QMessageBox.warning.

2- MainApp:

  • نافذة رئيسية تظهر فقط إذا كان تسجيل الدخول ناجح.

3- في main:

  • يتم فتح نافذة تسجيل الدخول أولاً.
  • إذا أغلق المستخدم النافذة بدون نجاح → التطبيق ينتهي.
  • إذا كانت صحيحة → يتم فتح النافذة الرئيسية.

عن الكاتب

Tamer Ahmed

التعليقات


اتصل بنا

إذا أعجبك محتوى مدونتنا نتمنى البقاء على تواصل دائم ، فقط قم بإدخال بريدك الإلكتروني للإشتراك في بريد المدونة السريع ليصلك جديد المدونة أولاً بأول ، كما يمكنك إرسال رساله بالضغط على الزر المجاور ...

جميع الحقوق محفوظة

تقنيات نور التعليمية