May 17, 2026, 11:40 PM
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user