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

آخر الأخبار

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

📘 الدرس 14: إنشاء نافذة تسجيل مستخدم جديد (Sign Up)

في الدرس السابق أنشأنا نافذة تسجيل الدخول باستخدام قاعدة بيانات SQLite.

الآن سنضيف ميزة إنشاء حساب جديد عبر نافذة تسجيل (Sign Up).

Sign Up

🎯 الفكرة

1- إضافة زر "مستخدم جديد؟ سجل هنا".
2- عند الضغط على الزر → تظهر نافذة تسجيل مستخدم جديد.

يقوم المستخدم بإدخال:

  • اسم المستخدم.
  • كلمة المرور.
  • تأكيد كلمة المرور.

3- يتم تخزين البيانات في قاعدة البيانات users.db إذا كان اسم المستخدم غير موجود.

💻 الكود

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


# تهيئة قاعدة البيانات
def init_db():
    conn = sqlite3.connect("users.db")
    cursor = conn.cursor()

    cursor.execute("""
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL UNIQUE,
            password TEXT NOT NULL
        )
    """)

    conn.commit()
    conn.close()


# النافذة الرئيسية
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 SignUpWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("تسجيل مستخدم جديد")
        self.setGeometry(350, 350, 300, 200)

        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.confirm_input = QLineEdit(self)
        self.confirm_input.setPlaceholderText("تأكيد كلمة المرور")
        self.confirm_input.setEchoMode(QLineEdit.Password)
        layout.addWidget(self.confirm_input)

        self.signup_button = QPushButton("تسجيل", self)
        self.signup_button.clicked.connect(self.register_user)
        layout.addWidget(self.signup_button)

        self.setLayout(layout)

    def register_user(self):
        username = self.username_input.text()
        password = self.password_input.text()
        confirm = self.confirm_input.text()

        if not username or not password:
            QMessageBox.warning(self, "خطأ", "يرجى ملء جميع الحقول")
            return

        if password != confirm:
            QMessageBox.warning(self, "خطأ", "كلمتا المرور غير متطابقتين")
            return

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()

        try:
            cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, password))
            conn.commit()
            QMessageBox.information(self, "نجاح", "تم تسجيل المستخدم بنجاح 🎉")
            self.accept()
        except sqlite3.IntegrityError:
            QMessageBox.warning(self, "خطأ", "اسم المستخدم موجود بالفعل")
        finally:
            conn.close()


# نافذة تسجيل الدخول
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)

        btn_layout = QHBoxLayout()

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

        self.signup_button = QPushButton("مستخدم جديد؟", self)
        self.signup_button.clicked.connect(self.open_signup)
        btn_layout.addWidget(self.signup_button)

        layout.addLayout(btn_layout)

        self.setLayout(layout)

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

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password))
        result = cursor.fetchone()
        conn.close()

        if result:
            self.accept()
        else:
            QMessageBox.warning(self, "خطأ", "اسم المستخدم أو كلمة المرور غير صحيحة")

    def open_signup(self):
        signup = SignUpWindow()
        if signup.exec_() == QDialog.Accepted:
            QMessageBox.information(self, "تنبيه", "يمكنك الآن تسجيل الدخول باستخدام بياناتك الجديدة")


if __name__ == "__main__":
    init_db()

    app = QApplication(sys.argv)
    login = LoginWindow()

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

✅ ما تعلمناه

  • إنشاء نافذة جديدة لتسجيل المستخدمين.
  • التحقق من الحقول المدخلة (اسم المستخدم، كلمة المرور، تأكيد كلمة المرور).
  • التعامل مع قاعدة البيانات لمنع إدخال أسماء مكررة.
  • الربط بين نافذتي تسجيل الدخول والتسجيل.


📌 في الدرس 15 سنطور النظام أكثر:

  • إضافة تشفير كلمات المرور قبل حفظها في قاعدة البيانات باستخدام hashlib.

عن الكاتب

Tamer Ahmed

التعليقات


اتصل بنا

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

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

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