87 lines
2.7 KiB
Python
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() |