""" Main entry point for the Radar Data Reader application. """ import tkinter as tk import logging from pathlib import Path # --- NUOVO IMPORT --- import multiprocessing from radar_data_reader.gui.main_window import MainWindow from radar_data_reader.gui.gui_utils import center_window from radar_data_reader.utils import logger from radar_data_reader.utils.config_manager import ConfigManager from radar_data_reader.core.app_controller import AppController LOGGING_CONFIG = { "default_root_level": logging.DEBUG, "format": "%(asctime)s [%(levelname)-8s] %(name)-20s: %(message)s", "date_format": "%H:%M:%S", "enable_console": True, "enable_file": False, "file_path": "radar_reader.log", "colors": { logging.DEBUG: "gray", logging.INFO: "black", logging.WARNING: "orange", logging.ERROR: "red", logging.CRITICAL: "red", }, } # Questo percorso potrebbe essere diverso se l'eseguibile viene spostato. # Sarebbe meglio gestirlo in modo più robusto, ma per ora lo lasciamo così. PROJECT_ROOT = Path(__file__).parent.parent CONFIG_DIR = PROJECT_ROOT / "config" CONFIG_FILE_PATH = CONFIG_DIR / "config.json" def main(): root = None try: # Per un'applicazione distribuita, il config file dovrebbe essere # in una posizione standard (es. AppData) invece che relativa. # Per ora, lasciamo così. config_path = Path("config/config.json").resolve() config_manager = ConfigManager(config_path) config_manager.load_config() controller = AppController(config_manager) root = tk.Tk() root.withdraw() logger.setup_basic_logging(root, LOGGING_CONFIG) view = MainWindow( master=root, controller=controller, logging_config=LOGGING_CONFIG ) controller.bind_view(view) center_window(root) view.mainloop() except Exception as e: # Usa il logger se è già attivo, altrimenti stampa. log_or_print = logger.get_logger(__name__) if logger._logging_system_active else print # Gestisce il caso in cui il logger potrebbe non essere un oggetto Logger valido if isinstance(log_or_print, logging.Logger): log_or_print.critical(f"A critical error occurred: {e}", exc_info=True) else: print(f"A critical error occurred: {e}") if root: root.destroy() if __name__ == "__main__": # --- MODIFICA CRUCIALE PER PYINSTALLER --- # Questa chiamata è essenziale per il corretto funzionamento di multiprocessing # quando l'applicazione è "congelata" in un eseguibile. # Deve essere la prima istruzione dentro il blocco if __name__ == "__main__". multiprocessing.freeze_support() main()