الفكرة العامة
- QCalendarWidget يعرض تقويم شهري أو سنوي.
- يمكن للمستخدم التنقل بين الأشهر والسنوات.
- يمكن قراءة التاريخ الذي يختاره المستخدم.
- يمكن تخصيص شكل التقويم وألوانه.
المكتبات المطلوبة
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QCalendarWidget
from PyQt5.QtCore import QDate
مثال أساسي على QCalendarWidget
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.setText("اختر تاريخًا من التقويم")
self.label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.calendar)
layout.addWidget(self.label)
self.setLayout(layout)
def show_date(self, date):
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(...) لربط حدث الضغط على أي تاريخ بدالة تعرض التاريخ المختار.
- QDate.toString('dd/MM/yyyy') لتحويل التاريخ إلى صيغة يوم/شهر/سنة.
تمرين عملي – عرض عدد الأيام المتبقية حتى تاريخ معين
في هذا التمرين سنجعل المستخدم يختار تاريخ من التقويم، وسيظهر عدد الأيام المتبقية حتى هذا التاريخ من اليوم الحالي.
الكود مع الحل
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QCalendarWidget
from PyQt5.QtCore import QDate, Qt
class DaysUntilDate(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("حساب الأيام المتبقية")
self.setGeometry(200, 200, 400, 300)
layout = QVBoxLayout()
self.calendar = QCalendarWidget()
self.calendar.setGridVisible(True)
self.calendar.clicked.connect(self.calculate_days)
self.label = QLabel("اختر تاريخًا من التقويم")
self.label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.calendar)
layout.addWidget(self.label)
self.setLayout(layout)
def calculate_days(self, date):
today = QDate.currentDate()
days_remaining = today.daysTo(date)
if days_remaining > 0:
self.label.setText(f"المتبقي: {days_remaining} يوم")
elif days_remaining == 0:
self.label.setText("اليوم هو التاريخ المختار ✅")
else:
self.label.setText(f"لقد مضى {abs(days_remaining)} يوم على التاريخ المختار")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DaysUntilDate()
window.show()
sys.exit(app.exec_())
شرح التمرين
- عند اختيار أي تاريخ من التقويم، يتم حساب الفرق بالأيام بين التاريخ الحالي والتاريخ المختار.
- إذا كان الفرق موجبًا → التاريخ في المستقبل.
- إذا كان الفرق صفرًا → اليوم هو نفس التاريخ.
- إذا كان الفرق سالبًا → التاريخ في الماضي.
📌 النتيجة:
واجهة أنيقة تتيح اختيار أي تاريخ ومعرفة كم يوم متبقي أو مضى عليه.