في هذا الدرس سنتعرف على أداة QDateEdit، وهي أداة تتيح للمستخدم اختيار التاريخ بسهولة إما عن طريق الكتابة أو من خلال أزرار الزيادة والنقصان، ويمكن ربطها بالتطبيقات التي تتعامل مع التواريخ مثل أنظمة الحجز والفواتير.
شرح الفكرة
- QDateEdit تعرض تاريخًا يمكن تغييره بسهولة.
- يمكن تحديد تاريخ افتراضي.
- يمكن تحديد الحد الأدنى والأقصى للتاريخ.
- يمكن تنسيق عرض التاريخ.
مثال عملي – اختيار تاريخ ميلاد
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QDateEdit
from PyQt5.QtCore import QDate
class DateExample(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("اختيار التاريخ - QDateEdit")
self.resize(300, 150)
layout = QVBoxLayout()
self.label = QLabel("اختر تاريخ ميلادك:")
layout.addWidget(self.label)
# إنشاء أداة اختيار التاريخ
self.date_edit = QDateEdit()
self.date_edit.setCalendarPopup(True) # إظهار التقويم عند الضغط
self.date_edit.setDate(QDate.currentDate()) # التاريخ الافتراضي: اليوم
self.date_edit.setMinimumDate(QDate(1900, 1, 1)) # أقل تاريخ ممكن
self.date_edit.setMaximumDate(QDate.currentDate()) # لا يمكن اختيار تاريخ مستقبلي
self.date_edit.setDisplayFormat("dd/MM/yyyy") # تنسيق عرض التاريخ
self.date_edit.dateChanged.connect(self.show_selected_date)
layout.addWidget(self.date_edit)
# لعرض النتيجة
self.result_label = QLabel("")
layout.addWidget(self.result_label)
self.setLayout(layout)
def show_selected_date(self):
selected_date = self.date_edit.date().toString("dd/MM/yyyy")
self.result_label.setText(f"لقد اخترت: {selected_date}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DateExample()
window.show()
sys.exit(app.exec_())
الناتج
- عند تشغيل البرنامج، ستظهر أداة لاختيار التاريخ.
- عند اختيار أي تاريخ، يتم عرضه أسفل الأداة مباشرة.
أفكار لتطوير الدرس
- استخدام QDateEdit في نموذج تسجيل بيانات.
- حفظ التاريخ في قاعدة بيانات أو ملف Excel.
- ربطه بـ QTimeEdit لاختيار الوقت أيضًا.
اختيار التاريخ والوقت وحفظهما في Excel
في هذا الدرس سنقوم بإنشاء برنامج يسمح للمستخدم باختيار تاريخ ووقت حدث معيّن (مثل حجز موعد)، وعند الضغط على زر الحفظ، يتم تسجيل البيانات في جدول داخل البرنامج وكذلك في ملف Excel.
الكود
import sys
import os
import pandas as pd
from PyQt5.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QLabel, QDateEdit, QTimeEdit,
QPushButton, QTableWidget, QTableWidgetItem
)
from PyQt5.QtCore import QDate, QTime
class DateTimeSaver(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("اختيار التاريخ والوقت وحفظهما")
self.resize(400, 300)
layout = QVBoxLayout()
# اختيار التاريخ
layout.addWidget(QLabel("اختر التاريخ:"))
self.date_edit = QDateEdit()
self.date_edit.setCalendarPopup(True)
self.date_edit.setDate(QDate.currentDate())
layout.addWidget(self.date_edit)
# اختيار الوقت
layout.addWidget(QLabel("اختر الوقت:"))
self.time_edit = QTimeEdit()
self.time_edit.setTime(QTime.currentTime())
layout.addWidget(self.time_edit)
# زر الحفظ
self.save_button = QPushButton("حفظ الموعد")
self.save_button.clicked.connect(self.save_datetime)
layout.addWidget(self.save_button)
# جدول لعرض البيانات
self.table = QTableWidget()
self.table.setColumnCount(2)
self.table.setHorizontalHeaderLabels(["التاريخ", "الوقت"])
layout.addWidget(self.table)
self.setLayout(layout)
# تحميل البيانات السابقة إن وجدت
self.load_from_excel()
def save_datetime(self):
date_str = self.date_edit.date().toString("dd/MM/yyyy")
time_str = self.time_edit.time().toString("HH:mm")
# إضافة الصف للجدول
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(date_str))
self.table.setItem(row, 1, QTableWidgetItem(time_str))
# الحفظ في Excel
self.save_to_excel()
def save_to_excel(self):
data = []
for row in range(self.table.rowCount()):
data.append([
self.table.item(row, 0).text(),
self.table.item(row, 1).text()
])
df = pd.DataFrame(data, columns=["التاريخ", "الوقت"])
df.to_excel("appointments.xlsx", index=False)
def load_from_excel(self):
if os.path.exists("appointments.xlsx"):
df = pd.read_excel("appointments.xlsx")
for _, row_data in df.iterrows():
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(str(row_data["التاريخ"])))
self.table.setItem(row, 1, QTableWidgetItem(str(row_data["الوقت"])))
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DateTimeSaver()
window.show()
sys.exit(app.exec_())
مميزات هذا البرنامج
✅ اختيار تاريخ و وقت معًا.
✅ عرض كل المواعيد المحفوظة في جدول.
✅ حفظ تلقائي في ملف appointments.xlsx
.
✅ تحميل البيانات السابقة تلقائيًا عند بدء البرنامج.
نسخة مطورة من درس اختيار التاريخ والوقت بحيث:
- يمكن إضافة موعد جديد.
- يمكن تعديل أي موعد من الجدول.
- يمكن حذف أي موعد.
- الحفظ في Excel يتم تلقائيًا بعد أي تعديل أو حذف.
النسخة المطورة – إدارة المواعيد مع التعديل والحذف
import sys
import os
import pandas as pd
from PyQt5.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QLabel, QDateEdit, QTimeEdit,
QPushButton, QTableWidget, QTableWidgetItem, QHBoxLayout, QMessageBox
)
from PyQt5.QtCore import QDate, QTime
class DateTimeManager(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("إدارة المواعيد")
self.resize(500, 400)
layout = QVBoxLayout()
# اختيار التاريخ
layout.addWidget(QLabel("اختر التاريخ:"))
self.date_edit = QDateEdit()
self.date_edit.setCalendarPopup(True)
self.date_edit.setDate(QDate.currentDate())
layout.addWidget(self.date_edit)
# اختيار الوقت
layout.addWidget(QLabel("اختر الوقت:"))
self.time_edit = QTimeEdit()
self.time_edit.setTime(QTime.currentTime())
layout.addWidget(self.time_edit)
# أزرار التحكم
btn_layout = QHBoxLayout()
self.add_button = QPushButton("إضافة موعد")
self.add_button.clicked.connect(self.add_appointment)
btn_layout.addWidget(self.add_button)
self.update_button = QPushButton("تعديل الموعد")
self.update_button.clicked.connect(self.update_appointment)
btn_layout.addWidget(self.update_button)
self.delete_button = QPushButton("حذف الموعد")
self.delete_button.clicked.connect(self.delete_appointment)
btn_layout.addWidget(self.delete_button)
layout.addLayout(btn_layout)
# جدول عرض المواعيد
self.table = QTableWidget()
self.table.setColumnCount(2)
self.table.setHorizontalHeaderLabels(["التاريخ", "الوقت"])
layout.addWidget(self.table)
self.setLayout(layout)
# تحميل البيانات السابقة
self.load_from_excel()
def add_appointment(self):
date_str = self.date_edit.date().toString("dd/MM/yyyy")
time_str = self.time_edit.time().toString("HH:mm")
# إضافة الصف
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(date_str))
self.table.setItem(row, 1, QTableWidgetItem(time_str))
self.save_to_excel()
def update_appointment(self):
selected_row = self.table.currentRow()
if selected_row == -1:
QMessageBox.warning(self, "تحذير", "الرجاء اختيار موعد لتعديله")
return
date_str = self.date_edit.date().toString("dd/MM/yyyy")
time_str = self.time_edit.time().toString("HH:mm")
self.table.setItem(selected_row, 0, QTableWidgetItem(date_str))
self.table.setItem(selected_row, 1, QTableWidgetItem(time_str))
self.save_to_excel()
def delete_appointment(self):
selected_row = self.table.currentRow()
if selected_row == -1:
QMessageBox.warning(self, "تحذير", "الرجاء اختيار موعد لحذفه")
return
self.table.removeRow(selected_row)
self.save_to_excel()
def save_to_excel(self):
data = []
for row in range(self.table.rowCount()):
data.append([
self.table.item(row, 0).text(),
self.table.item(row, 1).text()
])
df = pd.DataFrame(data, columns=["التاريخ", "الوقت"])
df.to_excel("appointments.xlsx", index=False)
def load_from_excel(self):
if os.path.exists("appointments.xlsx"):
df = pd.read_excel("appointments.xlsx")
for _, row_data in df.iterrows():
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(str(row_data["التاريخ"])))
self.table.setItem(row, 1, QTableWidgetItem(str(row_data["الوقت"])))
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DateTimeManager()
window.show()
sys.exit(app.exec_())
المميزات الجديدة
✅ إضافة موعد جديد.
✅ تعديل موعد محدد.
✅ حذف موعد محدد.
✅ حفظ تلقائي في Excel بعد أي عملية.
✅ تحميل تلقائي للمواعيد السابقة عند فتح البرنامج.