# utils/progress_bar.py """ Progress bar implementation """ import tkinter as tk from tkinter import ttk from typing import Optional, Callable import sys from queue import Queue import threading class ProgressBar: def __init__(self, total: int, prefix: str = "", suffix: str = "", max_points: int = 30): self.total = total self.prefix = prefix self.suffix = suffix self.max_points = max_points self.current = 0 self.last_points = 0 self.output_callback: Optional[Callable] = None def set_output_callback(self, callback: Callable[[str], None]): """Set callback function for output""" self.output_callback = callback def update(self, current: int): self.current = current points = min(int((current / self.total) * self.max_points), self.max_points) if points > self.last_points: new_points = points - self.last_points self._write_output("." * new_points) self.last_points = points def increment(self): self.update(self.current + 1) def finish(self): remaining_points = self.max_points - self.last_points if remaining_points > 0: self._write_output("." * remaining_points) self._write_output(f"] {self.suffix}\n") def start(self): self._write_output(f"\r{self.prefix} [") def _write_output(self, text: str): if self.output_callback: self.output_callback(text) else: print(text, end="", flush=True)