import tkinter as tk from tkinter import ttk, messagebox import csv import time from datetime import datetime class TaskTrackerApp: def __init__(self, root): self.root = root self.root.title("ClockWork: Time Tracking Made Easy") self.task_name_var = tk.StringVar() self.probable_time_var = tk.IntVar() self.start_time = None # UI elements configuration self.setup_ui() # Create the time log file if it doesn't exist self.create_log_file() def setup_ui(self): style = ttk.Style() style.configure("TLabel", font=("Helvetica", 12)) style.configure("TButton", font=("Helvetica", 12, 'bold'), padding=6) # UI Elements ttk.Label(self.root, text="Task Name:", foreground="blue").grid(row=0, column=0, padx=10, pady=10) ttk.Entry(self.root, textvariable=self.task_name_var, width=30).grid(row=0, column=1, padx=10, pady=10) ttk.Label(self.root, text="Probable Time (minutes):", foreground="blue").grid(row=1, column=0, padx=10, pady=10) ttk.Entry(self.root, textvariable=self.probable_time_var, width=30).grid(row=1, column=1, padx=10, pady=10) ttk.Button(self.root, text="Start Task", command=self.start_task).grid(row=2, column=0, padx=10, pady=10) self.stop_button = ttk.Button(self.root, text="Stop Task", command=self.stop_task, state=tk.DISABLED) self.stop_button.grid(row=2, column=1, padx=10, pady=10) ttk.Button(self.root, text="Reset", command=self.reset_task).grid(row=3, column=0, padx=10, pady=10) ttk.Button(self.root, text="View Time Logs", command=self.view_time_logs).grid(row=3, column=1, padx=10, pady=10) self.timer_label = ttk.Label(self.root, text="00:00:00", font=("Helvetica", 18, 'bold'), foreground="green") self.timer_label.grid(row=4, column=0, columnspan=2, padx=10, pady=20) def create_log_file(self): with open("time_log.csv", "a", newline="") as file: writer = csv.writer(file) if file.tell() == 0: writer.writerow(['Task Name', 'Probable Time (minutes)', 'Start Time', 'End Time', 'Time Spent (minutes)', 'Time Difference (minutes)']) def start_task(self): task_name = self.task_name_var.get() if task_name: self.start_time = time.time() self.start_button.config(state=tk.DISABLED) self.stop_button.config(state=tk.NORMAL) self.update_timer() def stop_task(self): self.stop_button.config(state=tk.DISABLED) self.start_button.config(state=tk.NORMAL) time_spent = round((time.time() - self.start_time) / 60, 2) self.log_time(time_spent) def update_timer(self): if self.start_time: time_spent = time.time() - self.start_time time_str = time.strftime('%H:%M:%S', time.gmtime(time_spent)) self.timer_label.config(text=time_str) self.root.after(1000, self.update_timer) def log_time(self, time_spent): end_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') time_diff = round(time_spent - self.probable_time_var.get(), 2) with open("time_log.csv", "a", newline="") as file: writer = csv.writer(file) writer.writerow([self.task_name_var.get(), self.probable_time_var.get(), self.start_time, end_time, time_spent, time_diff]) def reset_task(self): self.task_name_var.set("") self.probable_time_var.set("") self.timer_label.config(text="00:00:00") self.start_button.config(state=tk.NORMAL) self.stop_button.config(state=tk.DISABLED) def view_time_logs(self): try: with open("time_log.csv", "r") as file: logs = list(csv.reader(file)) if len(logs) > 1: log_window = tk.Toplevel(self.root) log_window.title("Time Logs") text_area = tk.Text(log_window, height=20, width=120) text_area.pack(padx=10, pady=10) for log in logs[1:]: task_name, probable_time, start_time, end_time, time_spent, time_diff = log color = "green" if float(time_diff) < 0 else "red" text_area.insert(tk.END, f"Task: {task_name}, Probable: {probable_time} min, Time Spent: {time_spent} min, Diff: {time_diff} min\n", color) text_area.config(state=tk.DISABLED) text_area.tag_config("green", foreground="green") text_area.tag_config("red", foreground="red") else: messagebox.showinfo("No Logs", "No task logs found.") except Exception as e: messagebox.showerror("Error", f"Could not read time logs: {e}") if __name__ == "__main__": root = tk.Tk() app = TaskTrackerApp(root) root.mainloop()