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

آخر الأخبار

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

الدرس 30 – التعامل مع QDateEdit لاختيار التواريخ

في هذا الدرس سنتعرف على أداة QDateEdit، وهي أداة تتيح للمستخدم اختيار التاريخ بسهولة إما عن طريق الكتابة أو من خلال أزرار الزيادة والنقصان، ويمكن ربطها بالتطبيقات التي تتعامل مع التواريخ مثل أنظمة الحجز والفواتير.
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 بعد أي عملية.
تحميل تلقائي للمواعيد السابقة عند فتح البرنامج.

عن الكاتب

Tamer Ahmed

التعليقات


اتصل بنا

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

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

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