107 lines
4.8 KiB
Python
107 lines
4.8 KiB
Python
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() |