|
| 1 | +import tkinter as tk |
| 2 | +from tkinter import messagebox, END, filedialog |
| 3 | +import csv |
1 | 4 | from datetime import datetime
|
2 | 5 |
|
3 | 6 |
|
4 | 7 | class Task:
|
5 |
| - def __init__(self, title, due_date, description, priority='Medium'): |
6 |
| - self.title = title |
7 |
| - self.due_date = due_date |
| 8 | + def __init__(self, description, date): |
8 | 9 | self.description = description
|
9 |
| - self.priority = priority |
10 | 10 | self.completed = False
|
11 |
| - |
12 |
| - def __repr__(self): |
13 |
| - status = "Completed" if self.completed else "Pending" |
14 |
| - return f"Task(title={self.title}, due_date={self.due_date}, description={self.description}, priority={self.priority}, status={status})" |
15 |
| - |
16 |
| - |
17 |
| -import csv |
| 11 | + self.date = date # New date attribute |
18 | 12 |
|
19 | 13 |
|
20 | 14 | class TaskManager:
|
21 | 15 | def __init__(self):
|
22 | 16 | self.tasks = []
|
23 | 17 |
|
24 |
| - def add_task(self, title, due_date, description, priority='Medium'): |
25 |
| - new_task = Task(title, due_date, description, priority) |
26 |
| - self.tasks.append(new_task) |
27 |
| - print(f"Task '{title}' added successfully.") |
| 18 | + def add_task(self, description, date): |
| 19 | + task = Task(description, date) |
| 20 | + self.tasks.append(task) |
28 | 21 |
|
29 |
| - def list_tasks(self, completed=None): |
30 |
| - if completed is None: |
31 |
| - return self.tasks |
32 |
| - elif completed: |
33 |
| - return [task for task in self.tasks if task.completed] |
34 |
| - else: |
35 |
| - return [task for task in self.tasks if not task.completed] |
36 |
| - |
37 |
| - def complete_task(self, title): |
38 |
| - for task in self.tasks: |
39 |
| - if task.title == title and not task.completed: |
40 |
| - task.completed = True |
41 |
| - print(f"Task '{title}' marked as completed.") |
42 |
| - return |
43 |
| - print(f"Task '{title}' not found or already completed.") |
44 |
| - |
45 |
| - def delete_task(self, title): |
46 |
| - for task in self.tasks: |
47 |
| - if task.title == title: |
48 |
| - self.tasks.remove(task) |
49 |
| - print(f"Task '{title}' deleted successfully.") |
50 |
| - return |
51 |
| - print(f"Task '{title}' not found.") |
52 |
| - |
53 |
| - def set_task_priority(self, title, new_priority): |
54 |
| - for task in self.tasks: |
55 |
| - if task.title == title: |
56 |
| - task.priority = new_priority |
57 |
| - print(f"Priority for task '{title}' set to '{new_priority}'.") |
58 |
| - return |
59 |
| - print(f"Task '{title}' not found.") |
60 |
| - |
61 |
| - def filter_tasks_by_date(self, date): |
62 |
| - return [task for task in self.tasks if task.due_date.date() == date] |
63 |
| - |
64 |
| - def export_tasks_to_csv(self, tasks, filename): |
65 |
| - with open(filename, 'w', newline='') as csvfile: |
66 |
| - fieldnames = ['title', 'due_date', 'description', 'priority', 'status'] |
67 |
| - writer = csv.DictWriter(csvfile, fieldnames=fieldnames) |
68 |
| - |
69 |
| - writer.writeheader() |
70 |
| - for task in tasks: |
71 |
| - writer.writerow({ |
72 |
| - 'title': task.title, |
73 |
| - 'due_date': task.due_date.strftime('%Y-%m-%d %H:%M:%S'), |
74 |
| - 'description': task.description, |
75 |
| - 'priority': task.priority, |
76 |
| - 'status': 'Completed' if task.completed else 'Pending' |
77 |
| - }) |
78 |
| - print(f"Tasks exported to {filename} successfully.") |
79 |
| - |
80 |
| - |
81 |
| -def download_tasks_by_date(manager, date, filename): |
82 |
| - tasks = manager.filter_tasks_by_date(date) |
83 |
| - manager.export_tasks_to_csv(tasks, filename) |
| 22 | + def complete_task(self, index): |
| 23 | + if 0 <= index < len(self.tasks): |
| 24 | + self.tasks[index].completed = True |
| 25 | + return self.tasks[index].description |
| 26 | + return None |
84 | 27 |
|
| 28 | + def delete_task(self, index): |
| 29 | + if 0 <= index < len(self.tasks): |
| 30 | + return self.tasks.pop(index).description |
| 31 | + return None |
85 | 32 |
|
86 |
| -import tkinter as tk |
87 |
| -from tkinter import ttk, filedialog, simpledialog |
| 33 | + def get_task_list(self): |
| 34 | + return [(task.description, task.completed, task.date) for task in self.tasks] |
| 35 | + |
| 36 | + def get_finished_tasks(self): |
| 37 | + return [(task.description, task.completed, task.date) for task in self.tasks if task.completed] |
| 38 | + |
| 39 | + def get_tasks_filtered_by_date(self, filter_date): |
| 40 | + return [(task.description, task.completed, task.date) for task in self.tasks if task.date == filter_date] |
88 | 41 |
|
89 | 42 |
|
90 |
| -class TaskApp: |
91 |
| - def __init__(self, root, task_manager): |
92 |
| - self.root = root |
93 |
| - self.task_manager = task_manager |
94 |
| - self.root.title("Task Manager") |
| 43 | +class TaskManagerApp: |
| 44 | + def __init__(self, master): |
| 45 | + self.master = master |
| 46 | + self.task_manager = TaskManager() |
| 47 | + master.title("Task Management Application") |
95 | 48 |
|
96 |
| - self.create_widgets() |
97 |
| - self.update_task_list() |
| 49 | + # Task Entry Section |
| 50 | + self.task_label = tk.Label(master, text="Enter Task:") |
| 51 | + self.task_label.pack() |
98 | 52 |
|
99 |
| - def create_widgets(self): |
100 |
| - self.frame = tk.Frame(self.root) |
101 |
| - self.frame.pack() |
| 53 | + self.task_entry = tk.Entry(master, width=50) |
| 54 | + self.task_entry.pack() |
102 | 55 |
|
103 |
| - self.task_listbox = tk.Listbox(self.frame, width=100, height=20) |
104 |
| - self.task_listbox.pack(side=tk.LEFT) |
| 56 | + self.date_label = tk.Label(master, text="Enter Date (YYYY-MM-DD):") |
| 57 | + self.date_label.pack() |
105 | 58 |
|
106 |
| - self.scrollbar = tk.Scrollbar(self.frame) |
107 |
| - self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y) |
108 |
| - self.task_listbox.config(yscrollcommand=self.scrollbar.set) |
109 |
| - self.scrollbar.config(command=self.task_listbox.yview) |
| 59 | + self.date_entry = tk.Entry(master, width=50) |
| 60 | + self.date_entry.pack() |
110 | 61 |
|
111 |
| - self.add_task_button = tk.Button(self.root, text="Add Task", command=self.add_task) |
| 62 | + self.add_task_button = tk.Button(master, text="Add Task", command=self.add_task) |
112 | 63 | self.add_task_button.pack()
|
113 | 64 |
|
114 |
| - self.complete_task_button = tk.Button(self.root, text="Complete Task", command=self.complete_task) |
| 65 | + # Task List Section |
| 66 | + self.task_listbox = tk.Listbox(master, width=50, height=10) |
| 67 | + self.task_listbox.pack() |
| 68 | + |
| 69 | + self.complete_task_button = tk.Button(master, text="Complete Task", command=self.complete_task) |
115 | 70 | self.complete_task_button.pack()
|
116 | 71 |
|
117 |
| - self.show_finished_tasks_button = tk.Button(self.root, text="Show Finished Tasks", |
118 |
| - command=self.show_finished_tasks) |
119 |
| - self.show_finished_tasks_button.pack() |
| 72 | + self.delete_task_button = tk.Button(master, text="Delete Task", command=self.delete_task) |
| 73 | + self.delete_task_button.pack() |
120 | 74 |
|
121 |
| - self.show_pending_tasks_button = tk.Button(self.root, text="Show Pending Tasks", |
122 |
| - command=self.show_pending_tasks) |
123 |
| - self.show_pending_tasks_button.pack() |
| 75 | + # Download Section |
| 76 | + self.download_button = tk.Button(master, text="Download Tasks", command=self.download_tasks) |
| 77 | + self.download_button.pack() |
124 | 78 |
|
125 |
| - self.show_all_tasks_button = tk.Button(self.root, text="Show All Tasks", command=self.show_all_tasks) |
126 |
| - self.show_all_tasks_button.pack() |
| 79 | + # Finished Tasks Section |
| 80 | + self.view_finished_tasks_button = tk.Button(master, text="View Finished Tasks", |
| 81 | + command=self.view_finished_tasks) |
| 82 | + self.view_finished_tasks_button.pack() |
127 | 83 |
|
128 |
| - self.download_tasks_button = tk.Button(self.root, text="Download Tasks by Date", command=self.download_tasks) |
129 |
| - self.download_tasks_button.pack() |
| 84 | + # Status Section |
| 85 | + self.status_label = tk.Label(master, text="", fg="green") |
| 86 | + self.status_label.pack() |
130 | 87 |
|
131 | 88 | def add_task(self):
|
132 |
| - title = simpledialog.askstring("Task Title", "Enter task title:") |
133 |
| - due_date = simpledialog.askstring("Due Date", "Enter due date (YYYY-MM-DD):") |
134 |
| - description = simpledialog.askstring("Description", "Enter task description:") |
135 |
| - priority = simpledialog.askstring("Priority", "Enter task priority (Low, Medium, High):", initialvalue="Medium") |
136 |
| - |
137 |
| - if title and due_date and description and priority: |
138 |
| - try: |
139 |
| - due_date = datetime.strptime(due_date, "%Y-%m-%d") |
140 |
| - self.task_manager.add_task(title, due_date, description, priority) |
141 |
| - self.update_task_list() |
142 |
| - except ValueError: |
143 |
| - print("Invalid date format. Please enter date in YYYY-MM-DD format.") |
| 89 | + task = self.task_entry.get() |
| 90 | + date_str = self.date_entry.get() |
| 91 | + if task and self.validate_date(date_str): |
| 92 | + self.task_manager.add_task(task, date_str) |
| 93 | + self.task_entry.delete(0, END) |
| 94 | + self.date_entry.delete(0, END) |
| 95 | + self.update_task_listbox() |
| 96 | + self.update_status("Task added!") |
| 97 | + else: |
| 98 | + self.update_status("Please enter a valid task and date.") |
144 | 99 |
|
145 | 100 | def complete_task(self):
|
146 |
| - selected_task = self.task_listbox.get(tk.ACTIVE) |
147 |
| - if selected_task: |
148 |
| - title = selected_task.split(",")[0].split("=")[1].strip() |
149 |
| - self.task_manager.complete_task(title) |
150 |
| - self.update_task_list() |
151 |
| - |
152 |
| - def show_finished_tasks(self): |
153 |
| - self.task_listbox.delete(0, tk.END) |
154 |
| - for task in self.task_manager.list_tasks(completed=True): |
155 |
| - self.task_listbox.insert(tk.END, task) |
156 |
| - |
157 |
| - def show_pending_tasks(self): |
158 |
| - self.task_listbox.delete(0, tk.END) |
159 |
| - for task in self.task_manager.list_tasks(completed=False): |
160 |
| - self.task_listbox.insert(tk.END, task) |
161 |
| - |
162 |
| - def show_all_tasks(self): |
163 |
| - self.task_listbox.delete(0, tk.END) |
164 |
| - for task in self.task_manager.list_tasks(): |
165 |
| - self.task_listbox.insert(tk.END, task) |
| 101 | + try: |
| 102 | + selected_task_index = self.task_listbox.curselection()[0] |
| 103 | + completed_task = self.task_manager.complete_task(selected_task_index) |
| 104 | + if completed_task: |
| 105 | + self.update_task_listbox() |
| 106 | + self.update_status(f"Task '{completed_task}' completed!") |
| 107 | + else: |
| 108 | + self.update_status("Error completing task.") |
| 109 | + except IndexError: |
| 110 | + self.update_status("Please select a task to complete.") |
| 111 | + |
| 112 | + def delete_task(self): |
| 113 | + try: |
| 114 | + selected_task_index = self.task_listbox.curselection()[0] |
| 115 | + deleted_task = self.task_manager.delete_task(selected_task_index) |
| 116 | + if deleted_task: |
| 117 | + self.update_task_listbox() |
| 118 | + self.update_status(f"Task '{deleted_task}' deleted!") |
| 119 | + else: |
| 120 | + self.update_status("Error deleting task.") |
| 121 | + except IndexError: |
| 122 | + self.update_status("Please select a task to delete.") |
166 | 123 |
|
167 | 124 | def download_tasks(self):
|
168 |
| - date_str = simpledialog.askstring("Task Date", "Enter date (YYYY-MM-DD):") |
169 |
| - if date_str: |
170 |
| - try: |
171 |
| - date = datetime.strptime(date_str, '%Y-%m-%d').date() |
172 |
| - filename = filedialog.asksaveasfilename(defaultextension=".csv", filetypes=[("CSV files", "*.csv")]) |
173 |
| - if filename: |
174 |
| - download_tasks_by_date(self.task_manager, date, filename) |
175 |
| - except ValueError: |
176 |
| - print("Invalid date format. Please enter date in YYYY-MM-DD format.") |
177 |
| - |
178 |
| - def update_task_list(self): |
179 |
| - self.task_listbox.delete(0, tk.END) |
180 |
| - for task in self.task_manager.list_tasks(): |
181 |
| - self.task_listbox.insert(tk.END, task) |
| 125 | + filter_date = self.date_entry.get() |
| 126 | + if self.validate_date(filter_date): |
| 127 | + tasks_to_download = self.task_manager.get_tasks_filtered_by_date(filter_date) |
| 128 | + if tasks_to_download: |
| 129 | + file_path = filedialog.asksaveasfilename(defaultextension=".csv", filetypes=[("CSV files", "*.csv")]) |
| 130 | + if file_path: |
| 131 | + with open(file_path, mode='w', newline='') as file: |
| 132 | + writer = csv.writer(file) |
| 133 | + writer.writerow(["Task Description", "Completed", "Date"]) |
| 134 | + for task_desc, completed, date in tasks_to_download: |
| 135 | + writer.writerow([task_desc, completed, date]) |
| 136 | + self.update_status("Tasks downloaded successfully!") |
| 137 | + else: |
| 138 | + self.update_status("Download cancelled.") |
| 139 | + else: |
| 140 | + self.update_status("No tasks found for this date.") |
| 141 | + else: |
| 142 | + self.update_status("Please enter a valid date (YYYY-MM-DD).") |
| 143 | + |
| 144 | + def view_finished_tasks(self): |
| 145 | + finished_tasks = self.task_manager.get_finished_tasks() |
| 146 | + self.task_listbox.delete(0, END) |
| 147 | + if finished_tasks: |
| 148 | + for task_description, completed, date in finished_tasks: |
| 149 | + self.task_listbox.insert(END, f"✔️ {task_description} (Date: {date})") |
| 150 | + else: |
| 151 | + self.task_listbox.insert(END, "No finished tasks.") |
182 | 152 |
|
| 153 | + def validate_date(self, date_str): |
| 154 | + try: |
| 155 | + datetime.strptime(date_str, '%Y-%m-%d') |
| 156 | + return True |
| 157 | + except ValueError: |
| 158 | + return False |
183 | 159 |
|
184 |
| -if __name__ == "__main__": |
185 |
| - root = tk.Tk() |
186 |
| - manager = TaskManager() |
| 160 | + def update_task_listbox(self): |
| 161 | + self.task_listbox.delete(0, END) |
| 162 | + for task_description, completed, date in self.task_manager.get_task_list(): |
| 163 | + status = "✔️" if completed else "❌" |
| 164 | + self.task_listbox.insert(END, f"{status} {task_description} (Date: {date})") |
| 165 | + |
| 166 | + def update_status(self, message): |
| 167 | + self.status_label.config(text=message) |
187 | 168 |
|
188 |
| - # Add some sample tasks for testing |
189 |
| - manager.add_task("Task 1", datetime(2023, 10, 15), "Description for Task 1", priority='High') |
190 |
| - manager.add_task("Task 2", datetime(2023, 10, 20), "Description for Task 2", priority='Low') |
191 | 169 |
|
192 |
| - app = TaskApp(root, manager) |
| 170 | +if __name__ == "__main__": |
| 171 | + root = tk.Tk() |
| 172 | + app = TaskManagerApp(root) |
193 | 173 | root.mainloop()
|
0 commit comments