پروژه پنجم : ثبت رویداد

خب برای این پروژه وسایلی که نیاز دارید :

  • برنامه پایتون

  • کتابخانه 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ثانیه صبر کنید و فایل را دریافت کنید .

اگر ایده یا پروژه ای دیگری میخواهید در نظر ها بنویسید .