반응형
import tkinter as tk
from tkinter import messagebox, ttk
import json
from datetime import datetime
try:
from tkcalendar import Calendar
TKCALENDAR_AVAILABLE = True
except ImportError:
TKCALENDAR_AVAILABLE = False
# 데이터 파일 경로
DATA_FILE = "todo_advanced_data.json"
class ToDoApp:
def __init__(self, root):
self.root = root
self.root.title("Advanced To-Do List App")
self.root.geometry("700x800")
self.tasks = [] # 전체 작업 데이터
self.dark_mode = False
# 상단 입력 필드와 추가 버튼
self.input_frame = tk.Frame(self.root)
self.input_frame.pack(pady=10)
self.task_entry = tk.Entry(self.input_frame, width=25, font=("Arial", 14))
self.task_entry.pack(side=tk.LEFT, padx=5)
self.category_menu = tk.StringVar(value="General")
self.category_dropdown = ttk.Combobox(
self.input_frame, textvariable=self.category_menu, values=["General", "Work", "Personal", "Study"], state="readonly"
)
self.category_dropdown.pack(side=tk.LEFT, padx=5)
self.priority_menu = tk.StringVar(value="Medium")
self.priority_dropdown = ttk.Combobox(
self.input_frame, textvariable=self.priority_menu, values=["High", "Medium", "Low"], state="readonly"
)
self.priority_dropdown.pack(side=tk.LEFT, padx=5)
if TKCALENDAR_AVAILABLE:
self.date_button = tk.Button(self.input_frame, text="Set Due Date", command=self.open_calendar, width=10)
self.date_button.pack(side=tk.LEFT, padx=5)
self.add_button = tk.Button(self.input_frame, text="Add Task", command=self.add_task, width=10)
self.add_button.pack(side=tk.LEFT, padx=5)
# 리스트 박스와 스크롤바
self.list_frame = tk.Frame(self.root)
self.list_frame.pack(pady=10)
self.scrollbar = tk.Scrollbar(self.list_frame)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.task_listbox = tk.Listbox(self.list_frame, height=20, width=70, font=("Arial", 14), yscrollcommand=self.scrollbar.set)
self.task_listbox.pack(side=tk.LEFT, fill=tk.BOTH)
self.scrollbar.config(command=self.task_listbox.yview)
# 아래 작업 버튼들
self.button_frame = tk.Frame(self.root)
self.button_frame.pack(pady=10)
self.complete_button = tk.Button(self.button_frame, text="Mark Complete", command=self.complete_task, width=15)
self.complete_button.pack(side=tk.LEFT, padx=5)
self.delete_button = tk.Button(self.button_frame, text="Delete Task", command=self.delete_task, width=15)
self.delete_button.pack(side=tk.LEFT, padx=5)
# 데이터 불러오기
self.load_tasks()
def add_task(self):
"""할 일을 추가"""
task = self.task_entry.get().strip()
category = self.category_menu.get()
priority = self.priority_menu.get()
if task:
due_date = getattr(self, "due_date", None) if TKCALENDAR_AVAILABLE else None # 설정된 마감일
self.tasks.append({
"task": task,
"completed": False,
"category": category,
"priority": priority,
"due_date": due_date
})
self.update_task_listbox()
self.task_entry.delete(0, tk.END) # 입력 필드 초기화
self.due_date = None # 마감일 초기화
self.save_tasks()
else:
messagebox.showwarning("Warning", "Task cannot be empty!")
def complete_task(self):
"""작업 완료로 표시"""
selected_index = self.task_listbox.curselection()
if selected_index:
index = selected_index[0]
self.tasks[index]["completed"] = not self.tasks[index]["completed"] # 완료 상태 토글
self.update_task_listbox()
self.save_tasks()
else:
messagebox.showwarning("Warning", "Please select a task to mark complete!")
def delete_task(self):
"""작업 삭제"""
selected_index = self.task_listbox.curselection()
if selected_index:
index = selected_index[0]
self.tasks.pop(index) # 작업 삭제
self.update_task_listbox()
self.save_tasks()
else:
messagebox.showwarning("Warning", "Please select a task to delete!")
def update_task_listbox(self):
"""리스트박스를 현재 작업 상태에 맞게 업데이트"""
self.task_listbox.delete(0, tk.END) # 기존 항목 모두 제거
for task in self.tasks:
display_text = f"{task['task']} ({task['category']}, {task['priority']})"
if TKCALENDAR_AVAILABLE and task.get("due_date"):
display_text += f" [Due: {task['due_date']}]"
if task["completed"]:
display_text += " (Completed)"
self.task_listbox.insert(tk.END, display_text)
def save_tasks(self):
"""작업 데이터를 JSON 파일로 저장"""
with open(DATA_FILE, "w") as f:
json.dump(self.tasks, f)
def load_tasks(self):
"""JSON 파일에서 작업 데이터를 불러오기"""
try:
with open(DATA_FILE, "r") as f:
self.tasks = json.load(f)
self.update_task_listbox() # 리스트박스 업데이트
except FileNotFoundError:
self.tasks = []
def open_calendar(self):
"""캘린더 위젯 열기"""
if not TKCALENDAR_AVAILABLE:
messagebox.showerror("Error", "tkcalendar module is not installed!")
return
calendar_window = tk.Toplevel(self.root)
calendar_window.title("Select Due Date")
calendar = Calendar(calendar_window, selectmode="day", date_pattern="yyyy-mm-dd")
calendar.pack(pady=20)
tk.Button(
calendar_window, text="Set Date", command=lambda: self.set_due_date(calendar, calendar_window)
).pack()
def set_due_date(self, calendar, window):
"""마감일 설정"""
self.due_date = calendar.get_date()
window.destroy()
# 앱 실행
if __name__ == "__main__":
root = tk.Tk()
app = ToDoApp(root)
root.mainloop()
어플로 만들고 싶었는데 파이썬으로만 돌아가서 더 연구하고 완성하겠습니다
반응형
'코딩 > 개인 PT' 카테고리의 다른 글
[Python 3] 재귀 깊이 설정하기 (0) | 2024.12.24 |
---|---|
[Python 3] 벽돌깨기 게임 (0) | 2024.10.17 |
[Python 3] 지렁이 게임 (0) | 2024.09.29 |
펌웨어 사전기초 (1) | 2024.09.24 |