📌 ما هو QCalendarWidget؟
QCalendarWidget
هو عنصر واجهة (Widget) في PyQt يتيح للمستخدم عرض تقويم واختيار التواريخ بسهولة.
يمكنك استخدامه في أي تطبيق يحتاج لتحديد مواعيد، مثل تطبيقات الحجز أو تنظيم المواعيد.
⚙️ الخطوات الأساسية لاستخدامه:
- إنشاء عنصر QCalendarWidget.
- تحديد تاريخ البداية أو النهاية إذا لزم الأمر.
- ربطه مع حدث لاختيار التاريخ.
- عرض التاريخ المحدد في عنصر آخر مثل QLabel.
💻 مثال عملي:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QCalendarWidget, QLabel
from PyQt5.QtCore import QDate
class CalendarExample(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("مثال على QCalendarWidget")
self.setGeometry(200, 200, 400, 300)
layout = QVBoxLayout()
# إنشاء التقويم
self.calendar = QCalendarWidget()
self.calendar.setGridVisible(True) # إظهار الشبكة
self.calendar.clicked.connect(self.show_date) # عند اختيار تاريخ
# تسمية لعرض التاريخ
self.label = QLabel("اختر تاريخًا من التقويم")
self.label.setStyleSheet("font-size: 16px; color: blue;")
layout.addWidget(self.calendar)
layout.addWidget(self.label)
self.setLayout(layout)
def show_date(self):
date = self.calendar.selectedDate()
self.label.setText(f"التاريخ المحدد: {date.toString('dd/MM/yyyy')}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = CalendarExample()
window.show()
sys.exit(app.exec_())
📌 شرح الكود:
QCalendarWidget()
: ينشئ عنصر التقويم.setGridVisible(True)
: يجعل شبكة التقويم مرئية.clicked.connect(self.show_date)
: يربط اختيار أي تاريخ بتنفيذ الدالةshow_date
.selectedDate()
: ترجع التاريخ الذي اختاره المستخدم.toString('dd/MM/yyyy')
: يحول التاريخ إلى نص بالصيغة المطلوبة.
🎯 النتيجة المتوقعة:
- عند تشغيل البرنامج، سيظهر تقويم.
- عند اختيار أي تاريخ، سيُعرض في الأسفل بصيغة "يوم/شهر/سنة".
تمرين على QDateEdit و QTimeEdit
قم بإنشاء تطبيق PyQt يحتوي على:
- QDateEdit لاختيار تاريخ الميلاد.
- QTimeEdit لاختيار وقت محدد.
- زر عند الضغط عليه يعرض رسالة تحتوي على التاريخ والوقت المختارين.
- تنسيق التاريخ يكون على شكل:
يوم/شهر/سنة
. - تنسيق الوقت يكون على شكل:
ساعات:دقائق:ثوان
.
الحل
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QDateEdit, QTimeEdit, QPushButton, QMessageBox
from PyQt5.QtCore import QDate, QTime
class DateTimeApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("تمرين QDateEdit و QTimeEdit")
self.resize(300, 200)
# Layout
layout = QVBoxLayout()
# مكون لاختيار التاريخ
self.date_edit = QDateEdit()
self.date_edit.setDate(QDate.currentDate()) # تعيين تاريخ اليوم
self.date_edit.setDisplayFormat("dd/MM/yyyy") # تنسيق العرض
layout.addWidget(self.date_edit)
# مكون لاختيار الوقت
self.time_edit = QTimeEdit()
self.time_edit.setTime(QTime.currentTime()) # تعيين الوقت الحالي
self.time_edit.setDisplayFormat("HH:mm:ss") # تنسيق العرض
layout.addWidget(self.time_edit)
# زر عرض البيانات
btn_show = QPushButton("عرض التاريخ والوقت")
btn_show.clicked.connect(self.show_datetime)
layout.addWidget(btn_show)
self.setLayout(layout)
def show_datetime(self):
selected_date = self.date_edit.date().toString("dd/MM/yyyy")
selected_time = self.time_edit.time().toString("HH:mm:ss")
QMessageBox.information(self, "البيانات المختارة", f"التاريخ: {selected_date}\nالوقت: {selected_time}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DateTimeApp()
window.show()
sys.exit(app.exec_())
شرح مختصر
QDateEdit
وQTimeEdit
تسمح للمستخدم باختيار التاريخ والوقت.- استخدمنا
setDisplayFormat()
لتنسيق طريقة العرض. - عند الضغط على الزر، يتم عرض التاريخ والوقت في QMessageBox.
نسخة مطورة من التمرين:
- تختار التاريخ والوقت من QDateEdit و QTimeEdit.
- عند الضغط على الزر، يتم حفظهما في ملف Excel مع كل ضغطة زر (إضافة صف جديد).
- إذا لم يكن ملف Excel موجودًا، سيتم إنشاؤه تلقائيًا.
الكود
import sys
import os
import pandas as pd
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QDateEdit, QTimeEdit, QPushButton, QMessageBox
from PyQt5.QtCore import QDate, QTime
class DateTimeApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("حفظ التاريخ والوقت في Excel")
self.resize(300, 200)
layout = QVBoxLayout()
# اختيار التاريخ
self.date_edit = QDateEdit()
self.date_edit.setDate(QDate.currentDate())
self.date_edit.setDisplayFormat("dd/MM/yyyy")
layout.addWidget(self.date_edit)
# اختيار الوقت
self.time_edit = QTimeEdit()
self.time_edit.setTime(QTime.currentTime())
self.time_edit.setDisplayFormat("HH:mm:ss")
layout.addWidget(self.time_edit)
# زر الحفظ
btn_save = QPushButton("حفظ في Excel")
btn_save.clicked.connect(self.save_to_excel)
layout.addWidget(btn_save)
self.setLayout(layout)
def save_to_excel(self):
# الحصول على البيانات
selected_date = self.date_edit.date().toString("dd/MM/yyyy")
selected_time = self.time_edit.time().toString("HH:mm:ss")
# اسم ملف الإكسل
file_name = "dates_times.xlsx"
# إذا كان الملف موجودًا نقرأه، إذا لا، ننشئه
if os.path.exists(file_name):
df = pd.read_excel(file_name)
else:
df = pd.DataFrame(columns=["التاريخ", "الوقت"])
# إضافة البيانات الجديدة
new_row = {"التاريخ": selected_date, "الوقت": selected_time}
df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)
# حفظ الملف
df.to_excel(file_name, index=False)
QMessageBox.information(self, "تم الحفظ", f"تم حفظ التاريخ والوقت:\n{selected_date} - {selected_time}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DateTimeApp()
window.show()
sys.exit(app.exec_())
طريقة العمل
- تختار التاريخ من QDateEdit والوقت من QTimeEdit.
- تضغط زر "حفظ في Excel".
- البرنامج سيضيف التاريخ والوقت في ملف
dates_times.xlsx
. - كل ضغطة زر تضيف صف جديد دون حذف البيانات السابقة.