
خب برای این پروژه وسایلی که نیاز دارید :
برنامه پایتون
کتابخانه tkinter
کتابخانه json
کتابخانه os

کتابخانه های لازم را نصب کنید و کد زیر را دخل آن وارد کنید.
import tkinter as tk from tkinter import messagebox import json import os DATA_FILE = "event_planner_data.json" # مقادیر پیشفرض جدید DEFAULT_YEAR = "1405" DEFAULT_MONTH = "01" DEFAULT_DAY = "30" DEFAULT_HOUR = "05" DEFAULT_MINUTE = "37" # مقدار پیشفرض برای توضیحات رویداد (میتوانید این را هم تغییر دهید) DEFAULT_EVENT_DESCRIPTION = "" # یا مثلاً "یک رویداد جدید" def load_events(): if os.path.exists(DATA_FILE): try: with open(DATA_FILE, 'r', encoding='utf-8') as f: return json.load(f) except json.JSONDecodeError: messagebox.showerror("خطا در بارگذاری", "فایل داده خراب است. یک فایل جدید ایجاد میشود.") return [] except Exception as e: messagebox.showerror("خطا", f"خطا در بارگذاری فایل: {e}") return [] return [] def save_events(events): try: with open(DATA_FILE, 'w', encoding='utf-8') as f: json.dump(events, f, ensure_ascii=False, indent=4) except Exception as e: messagebox.showerror("خطا در ذخیره", f"خطا در ذخیره فایل: {e}") def add_event(): year = year_entry.get() month = month_entry.get() day = day_entry.get() hour = hour_entry.get() minute = minute_entry.get() event_desc = event_entry.get() # توضیحات رویداد if not all([year, month, day, hour, minute, event_desc]): messagebox.showwarning("ورودی ناقص", "لطفاً تمام فیلدهای تاریخ، زمان و رویداد را پر کنید.") return # اعتبارسنجی اولیه (بدون منطق کامل شمسی) try: int_year, int_month, int_day, int_hour, int_minute = int(year), int(month), int(day), int(hour), int(minute) if not (1 <= int_month <= 12 and 1 <= int_day <= 31 and 0 <= int_hour <= 23 and 0 <= int_minute <= 59): messagebox.showwarning("ورودی نامعتبر", "لطفاً تاریخ و زمان معتبر وارد کنید.") return except ValueError: messagebox.showwarning("ورودی نامعتبر", "سال، ماه، روز، ساعت و دقیقه باید اعداد صحیح باشند.") return new_event = { "year": year, "month": month, "day": day, "hour": hour, "minute": minute, "description": event_desc } events.append(new_event) save_events(events) update_event_list() # پاک کردن فیلد توضیحات رویداد و بازگرداندن به مقدار پیشفرض event_entry.delete(0, tk.END) event_entry.insert(0, DEFAULT_EVENT_DESCRIPTION) # اضافه شدن این خط # بازگرداندن مقادیر پیشفرض برای تاریخ و زمان set_default_values() def update_event_list(): event_listbox.delete(0, tk.END) for i, event in enumerate(events): event_str = f"[{event['year']}/{event['month']}/{event['day']} {event['hour']}:{event['minute']}] {event['description']}" event_listbox.insert(tk.END, event_str) def delete_event(): selected_index = event_listbox.curselection() if not selected_index: messagebox.showwarning("انتخاب نشده", "لطفاً رویدادی را برای حذف انتخاب کنید.") return if messagebox.askyesno("تأیید حذف", "آیا از حذف این رویداد مطمئن هستید؟"): index_to_delete = selected_index[0] del events[index_to_delete] save_events(events) update_event_list() def set_default_values(): # ابتدا فیلدهای تاریخ و زمان را پاک میکنیم سپس مقادیر پیشفرض را وارد میکنیم year_entry.delete(0, tk.END) year_entry.insert(0, DEFAULT_YEAR) month_entry.delete(0, tk.END) month_entry.insert(0, DEFAULT_MONTH) day_entry.delete(0, tk.END) day_entry.insert(0, DEFAULT_DAY) hour_entry.delete(0, tk.END) hour_entry.insert(0, DEFAULT_HOUR) minute_entry.delete(0, tk.END) minute_entry.insert(0, DEFAULT_MINUTE) # اضافه شدن تنظیم مقدار پیشفرض برای توضیحات رویداد event_entry.delete(0, tk.END) event_entry.insert(0, DEFAULT_EVENT_DESCRIPTION) # ----- GUI Setup ----- root = tk.Tk() root.title("Event Planner") root.geometry("600x500") # اندازه پنجره # ----- Frame for Event Input ----- input_frame = tk.Frame(root, padx=10, pady=10) input_frame.pack(pady=10, fill=tk.X) tk.Label(input_frame, text="سال:").grid(row=0, column=0, sticky=tk.W) year_entry = tk.Entry(input_frame, width=5) year_entry.grid(row=0, column=1, padx=5) tk.Label(input_frame, text="ماه:").grid(row=0, column=2, sticky=tk.W) month_entry = tk.Entry(input_frame, width=3) month_entry.grid(row=0, column=3, padx=5) tk.Label(input_frame, text="روز:").grid(row=0, column=4, sticky=tk.W) day_entry = tk.Entry(input_frame, width=3) day_entry.grid(row=0, column=5, padx=5) tk.Label(input_frame, text="ساعت:").grid(row=1, column=0, sticky=tk.W) hour_entry = tk.Entry(input_frame, width=3) hour_entry.grid(row=1, column=1, padx=5) tk.Label(input_frame, text="دقیقه:").grid(row=1, column=2, sticky=tk.W) minute_entry = tk.Entry(input_frame, width=3) minute_entry.grid(row=1, column=3, padx=5) tk.Label(input_frame, text="رویداد:").grid(row=2, column=0, sticky=tk.W) event_entry = tk.Entry(input_frame, width=40) event_entry.grid(row=2, column=1, columnspan=5, pady=5, sticky=tk.W) add_button = tk.Button(input_frame, text="افزودن رویداد", command=add_event) add_button.grid(row=3, column=0, columnspan=6, pady=10) # ----- Frame for Event List ----- list_frame = tk.Frame(root, padx=10, pady=10) list_frame.pack(pady=10, fill=tk.BOTH, expand=True) event_listbox = tk.Listbox(list_frame, height=10, width=70, font=("Arial", 10)) event_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar = tk.Scrollbar(list_frame) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) event_listbox.config(yscrollcommand=scrollbar.set) scrollbar.config(command=event_listbox.yview) # ----- Buttons ----- button_frame = tk.Frame(root, pady=10) button_frame.pack(fill=tk.X) delete_button = tk.Button(button_frame, text="حذف رویداد انتخاب شده", command=delete_event) delete_button.pack(side=tk.LEFT, padx=10) # ----- Initialization ----- events = load_events() set_default_values() # تنظیم مقادیر پیشفرض هنگام شروع update_event_list() root.mainloop()
خب کد را اجرا کنید ، صفحه پایین را می بینید.

اینم از این پروژه الان اگر اطلاعات را وارد کنیم و افزودن را بزنیم و دوباره بریم توی برنامه اطلاعات را نشان میدهد .
برای دانلود همین پایتون یا فایل تبدیل شده به برنامه روی نوشته لینک بزنید و 15ثانیه صبر کنید و فایل را دریافت کنید .
اگر ایده یا پروژه ای دیگری میخواهید در نظر ها بنویسید .