SXXXXXXX_RadarDataReader/radar_data_reader/__main__.py

87 lines
2.7 KiB
Python

"""
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()