في الدرس السابق أنشأنا نافذة تسجيل الدخول باستخدام قاعدة بيانات SQLite.
الآن سنضيف ميزة إنشاء حساب جديد عبر نافذة تسجيل (Sign Up).
🎯 الفكرة
1- إضافة زر "مستخدم جديد؟ سجل هنا".2- عند الضغط على الزر → تظهر نافذة تسجيل مستخدم جديد.
يقوم المستخدم بإدخال:
- اسم المستخدم.
- كلمة المرور.
- تأكيد كلمة المرور.
💻 الكود
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
.