diff --git a/dashboard_gui.py b/dashboard_gui.py index da0e391..5c0cc96 100644 --- a/dashboard_gui.py +++ b/dashboard_gui.py @@ -6,6 +6,7 @@ Designed with web migration in mind - single window with menu bar and content ar import os import threading +import time import tkinter as tk from tkinter import ttk, messagebox from typing import Dict, Optional, Callable @@ -1707,8 +1708,20 @@ class DashboardGUI: tk.Label(limit_frame, text="photos", font=("Arial", 11)).grid(row=0, column=2, sticky=tk.W) # Action button - process_btn = ttk.Button(form_frame, text="🚀 Start Processing", command=self._run_process) - process_btn.grid(row=1, column=0, sticky=tk.W, pady=(20, 0)) + self.process_btn = ttk.Button(form_frame, text="🚀 Start Processing", command=self._run_process) + self.process_btn.grid(row=1, column=0, sticky=tk.W, pady=(20, 0)) + + # Progress bar + self.progress_var = tk.DoubleVar() + self.progress_bar = ttk.Progressbar(form_frame, variable=self.progress_var, + maximum=100, length=400, mode='determinate') + self.progress_bar.grid(row=2, column=0, sticky=(tk.W, tk.E), pady=(15, 0)) + + # Progress status label + self.progress_status_var = tk.StringVar(value="Ready to process") + progress_status_label = tk.Label(form_frame, textvariable=self.progress_status_var, + font=("Arial", 11), fg="gray") + progress_status_label.grid(row=3, column=0, sticky=tk.W, pady=(5, 0)) return panel @@ -1982,13 +1995,54 @@ class DashboardGUI: def worker(): try: + # Disable the button and initialize progress + self.process_btn.config(state="disabled", text="⏳ Processing...") + self.progress_var.set(0) + self.progress_status_var.set("Starting processing...") self.status_label.config(text="Processing...") + + # Simulate progress updates (since we don't have real progress from on_process) + def update_progress(): + for i in range(101): + if i <= 20: + self.progress_status_var.set("Initializing face detection...") + elif i <= 40: + self.progress_status_var.set("Loading photos...") + elif i <= 60: + self.progress_status_var.set("Detecting faces...") + elif i <= 80: + self.progress_status_var.set("Processing face encodings...") + elif i <= 95: + self.progress_status_var.set("Saving results...") + else: + self.progress_status_var.set("Finalizing...") + + self.progress_var.set(i) + self.root.update_idletasks() + time.sleep(0.05) # Small delay to show progress + + # Start progress updates in a separate thread + progress_thread = threading.Thread(target=update_progress, daemon=True) + progress_thread.start() + + # Run the actual processing result = self.on_process(limit_value) + + # Ensure progress reaches 100% + self.progress_var.set(100) + self.progress_status_var.set("Processing completed successfully!") + messagebox.showinfo("Process", f"Processing completed. Result: {result}", parent=self.root) self.status_label.config(text="Ready") + except Exception as e: + self.progress_var.set(0) + self.progress_status_var.set("Processing failed") messagebox.showerror("Process", f"Error during processing: {e}", parent=self.root) self.status_label.config(text="Ready") + finally: + # Re-enable the button regardless of success or failure + self.process_btn.config(state="normal", text="🚀 Start Processing") threading.Thread(target=worker, daemon=True).start()