1
1
import tkinter as tk
2
- from tkinter import messagebox , END , filedialog
3
- import csv
2
+ from tkinter import messagebox , simpledialog , filedialog
3
+ from tkinter import ttk
4
4
from datetime import datetime
5
-
5
+ import csv
6
6
7
7
class Task :
8
- def __init__ (self , description , date ):
8
+ def __init__ (self , title , description , due_date , priority ):
9
+ self .title = title
9
10
self .description = description
11
+ self .due_date = due_date
12
+ self .priority = priority
10
13
self .completed = False
11
- self .date = date # New date attribute
12
-
13
-
14
- class TaskManager :
15
- def __init__ (self ):
16
- self .tasks = []
17
-
18
- def add_task (self , description , date ):
19
- task = Task (description , date )
20
- self .tasks .append (task )
21
-
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
27
-
28
- def delete_task (self , index ):
29
- if 0 <= index < len (self .tasks ):
30
- return self .tasks .pop (index ).description
31
- return None
32
-
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 ]
41
14
15
+ def __str__ (self ):
16
+ status = "Completed" if self .completed else "Pending"
17
+ return f"{ self .title } - Due: { self .due_date } - Priority: { self .priority } - Status: { status } "
42
18
43
19
class TaskManagerApp :
44
- def __init__ (self , master ):
45
- self .master = master
46
- self .task_manager = TaskManager ()
47
- master .title ("Task Management Application" )
20
+ def __init__ (self , root ):
21
+ self .root = root
22
+ self .root .title ("Task Manager" )
48
23
49
- # Task Entry Section
50
- self .task_label = tk .Label (master , text = "Enter Task:" )
51
- self .task_label .pack ()
24
+ self .tasks = [] # List to store Task objects
52
25
53
- self .task_entry = tk .Entry (master , width = 50 )
54
- self .task_entry .pack ()
26
+ # Menu Bar
27
+ self .menu_bar = tk .Menu (self .root )
28
+ self .root .config (menu = self .menu_bar )
55
29
56
- self .date_label = tk .Label (master , text = "Enter Date (YYYY-MM-DD):" )
57
- self .date_label .pack ()
30
+ # Task List Frame
31
+ self .frame_task_list = tk .Frame (self .root )
32
+ self .frame_task_list .pack (side = tk .LEFT , fill = tk .BOTH , expand = True )
58
33
59
- self .date_entry = tk .Entry ( master , width = 50 )
60
- self .date_entry .pack ()
34
+ self .task_listbox = tk .Listbox ( self . frame_task_list , selectmode = tk . SINGLE )
35
+ self .task_listbox .pack (fill = tk . BOTH , expand = True )
61
36
62
- self .add_task_button = tk .Button (master , text = "Add Task" , command = self .add_task )
63
- self .add_task_button .pack ()
37
+ # Buttons
38
+ self .button_frame = tk .Frame (self .frame_task_list )
39
+ self .button_frame .pack ()
64
40
65
- # Task List Section
66
- self .task_listbox = tk .Listbox (master , width = 50 , height = 10 )
67
- self .task_listbox .pack ()
41
+ tk .Button (self .button_frame , text = "Add Task" , command = self .add_task ).pack (side = tk .LEFT )
42
+ tk .Button (self .button_frame , text = "Edit Task" , command = self .edit_task ).pack (side = tk .LEFT )
43
+ tk .Button (self .button_frame , text = "Delete Task" , command = self .delete_task ).pack (side = tk .LEFT )
44
+ tk .Button (self .button_frame , text = "Complete Task" , command = self .complete_task ).pack (side = tk .LEFT )
45
+ tk .Button (self .button_frame , text = "Download Tasks" , command = self .download_tasks ).pack (side = tk .LEFT ) # New button
68
46
69
- self .complete_task_button = tk .Button (master , text = "Complete Task" , command = self .complete_task )
70
- self .complete_task_button .pack ()
47
+ # Task Details Frame
48
+ self .frame_task_details = tk .Frame (self .root )
49
+ self .frame_task_details .pack (side = tk .RIGHT , fill = tk .BOTH , expand = True )
71
50
72
- self .delete_task_button = tk .Button (master , text = "Delete Task" , command = self .delete_task )
73
- self .delete_task_button .pack ()
51
+ tk .Label (self .frame_task_details , text = "Title:" ).pack ()
52
+ self .entry_title = tk .Entry (self .frame_task_details )
53
+ self .entry_title .pack ()
74
54
75
- # Download Section
76
- self .download_button = tk .Button ( master , text = "Download Tasks" , command = self . download_tasks )
77
- self .download_button .pack ()
55
+ tk . Label ( self . frame_task_details , text = "Description:" ). pack ()
56
+ self .text_description = tk .Text ( self . frame_task_details , height = 5 )
57
+ self .text_description .pack ()
78
58
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 ()
59
+ tk .Label (self .frame_task_details , text = "Due Date (YYYY-MM-DD):" ).pack ()
60
+ self .entry_due_date = tk .Entry (self .frame_task_details )
61
+ self .entry_due_date .pack ()
83
62
84
- # Status Section
85
- self .status_label = tk .Label (master , text = "" , fg = "green" )
86
- self .status_label .pack ()
63
+ tk .Label (self .frame_task_details , text = "Priority:" ).pack ()
64
+ self .priority_var = tk .StringVar (value = "Medium" )
65
+ priority_options = ["Low" , "Medium" , "High" ]
66
+ self .priority_menu = ttk .Combobox (self .frame_task_details , textvariable = self .priority_var , values = priority_options )
67
+ self .priority_menu .pack ()
68
+
69
+ tk .Button (self .frame_task_details , text = "Save Task" , command = self .save_task ).pack ()
87
70
88
71
def add_task (self ):
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 )
72
+ self .clear_task_details ()
73
+ self .entry_title .focus ()
74
+
75
+ def edit_task (self ):
76
+ selected_task_index = self .task_listbox .curselection ()
77
+ if selected_task_index :
78
+ task = self .tasks [selected_task_index [0 ]]
79
+ self .entry_title .delete (0 , tk .END )
80
+ self .entry_title .insert (0 , task .title )
81
+ self .text_description .delete ("1.0" , tk .END )
82
+ self .text_description .insert ("1.0" , task .description )
83
+ self .entry_due_date .delete (0 , tk .END )
84
+ self .entry_due_date .insert (0 , task .due_date )
85
+ self .priority_var .set (task .priority )
86
+
87
+ def delete_task (self ):
88
+ selected_task_index = self .task_listbox .curselection ()
89
+ if selected_task_index :
90
+ del self .tasks [selected_task_index [0 ]]
95
91
self .update_task_listbox ()
96
- self .update_status ("Task added!" )
97
- else :
98
- self .update_status ("Please enter a valid task and date." )
99
92
100
93
def complete_task (self ):
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." )
94
+ selected_task_index = self .task_listbox .curselection ()
95
+ if selected_task_index :
96
+ task = self .tasks [selected_task_index [0 ]]
97
+ task .completed = True
98
+ self .update_task_listbox ()
111
99
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 :
100
+ def save_task (self ):
101
+ title = self .entry_title .get ()
102
+ description = self .text_description .get ("1.0" , tk .END ).strip ()
103
+ due_date = self .entry_due_date .get ()
104
+ priority = self .priority_var .get ()
105
+
106
+ if title and due_date :
107
+ try :
108
+ # Validate the date format
109
+ datetime .strptime (due_date , '%Y-%m-%d' )
110
+ task = Task (title , description , due_date , priority )
111
+ self .tasks .append (task )
117
112
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." )
123
-
124
- def download_tasks (self ):
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." )
113
+ self .clear_task_details ()
114
+ messagebox .showinfo ("Info" , "Task saved successfully!" )
115
+ except ValueError :
116
+ messagebox .showerror ("Error" , "Invalid date format. Please use YYYY-MM-DD." )
141
117
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." )
118
+ messagebox .showwarning ("Warning" , "Title and Due Date are required." )
152
119
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
120
+ def clear_task_details (self ):
121
+ self .entry_title .delete (0 , tk .END )
122
+ self .text_description .delete ("1.0" , tk .END )
123
+ self .entry_due_date .delete (0 , tk .END )
124
+ self .priority_var .set ("Medium" )
159
125
160
126
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 } )" )
127
+ # Sort tasks by priority before updating the listbox
128
+ priority_order = {"High" : 1 , "Medium" : 2 , "Low" : 3 }
129
+ self .tasks .sort (key = lambda x : priority_order [x .priority ]) # Sort by priority
165
130
166
- def update_status (self , message ):
167
- self .status_label .config (text = message )
131
+ self .task_listbox .delete (0 , tk .END )
132
+ for task in self .tasks :
133
+ self .task_listbox .insert (tk .END , str (task ))
168
134
135
+ def download_tasks (self ):
136
+ # Open a file dialog to choose the save location
137
+ file_path = filedialog .asksaveasfilename (defaultextension = ".csv" ,
138
+ filetypes = [("CSV files" , "*.csv" ), ("All files" , "*.*" )])
139
+ if file_path :
140
+ try :
141
+ with open (file_path , mode = 'w' , newline = '' ) as file :
142
+ writer = csv .writer (file )
143
+ # Write the header
144
+ writer .writerow (["Title" , "Description" , "Due Date" , "Priority" , "Status" ])
145
+ for task in self .tasks :
146
+ writer .writerow ([task .title , task .description , task .due_date , task .priority , "Completed" if task .completed else "Pending" ])
147
+ messagebox .showinfo ("Success" , "Tasks downloaded successfully!" )
148
+ except Exception as e :
149
+ messagebox .showerror ("Error" , f"Failed to download tasks: { e } " )
169
150
170
151
if __name__ == "__main__" :
171
152
root = tk .Tk ()
172
153
app = TaskManagerApp (root )
173
- root .mainloop ()
154
+ root .mainloop ()
0 commit comments