commit bea7fc69b8fc1ce91cce3639c1189ff7a13ee8e3 Author: Damjan Savic Date: Tue Mar 18 23:15:29 2025 +0100 Initial commit of full Emirat project diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/Emirat.iml b/.idea/Emirat.iml new file mode 100644 index 0000000..16ec5ff --- /dev/null +++ b/.idea/Emirat.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..cb92289 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,58 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f353eea --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c887090 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..220f55b --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Launcher/__init__.py b/Launcher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Launcher/__pycache__/__init__.cpython-313.pyc b/Launcher/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..f5a3a59 Binary files /dev/null and b/Launcher/__pycache__/__init__.cpython-313.pyc differ diff --git a/Launcher/__pycache__/app_launcher.cpython-313.pyc b/Launcher/__pycache__/app_launcher.cpython-313.pyc new file mode 100644 index 0000000..041aac5 Binary files /dev/null and b/Launcher/__pycache__/app_launcher.cpython-313.pyc differ diff --git a/Launcher/app_launcher.py b/Launcher/app_launcher.py new file mode 100644 index 0000000..999ce9f --- /dev/null +++ b/Launcher/app_launcher.py @@ -0,0 +1,323 @@ +""" +Hauptklasse für den Anwendungslauncher, der mehrere Anwendungen in Tabs verwaltet. +""" +import os +import sys +import importlib +import importlib.util +import tkinter as tk +from tkinter import ttk +from tkinter import messagebox +import traceback +import logging + +# Logger für den Launcher +logger = logging.getLogger("emirat.launcher") + + +class ApplicationLauncher(tk.Tk): + """ + Ein Hauptfenster-Launcher, der mehrere Anwendungen in Tabs laden kann. + """ + + def __init__(self): + super().__init__() + + # Logger einrichten + self._setup_logging() + + # Grundlegende Fensterkonfiguration + self.title("Emirat Software Suite") + self.geometry("1200x800") + self.minsize(800, 600) + + # Icon laden, falls vorhanden + icon_path = os.path.join(os.path.dirname(__file__), "resources", "ritterdigital.ico") + if os.path.exists(icon_path): + self.iconbitmap(icon_path) + logger.info(f"Icon geladen: {icon_path}") + else: + logger.warning(f"Icon nicht gefunden: {icon_path}") + + # Hauptstilkonfiguration + self.style = ttk.Style(self) + self.style.theme_use('clam') # Alternatives Theme: 'alt', 'default', 'classic' + + # Rahmen für Inhalt einrichten + self.main_frame = ttk.Frame(self) + self.main_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) + + # Statusleiste erstellen + self.status_bar = ttk.Frame(self) + self.status_bar.pack(fill=tk.X, side=tk.BOTTOM) + self.status_label = ttk.Label(self.status_bar, text="Bereit", anchor=tk.W) + self.status_label.pack(side=tk.LEFT, padx=5) + + # Notebook (Tabs) für Anwendungen einrichten + self.notebook = ttk.Notebook(self.main_frame) + self.notebook.pack(fill=tk.BOTH, expand=True) + + # Anwendungs-Frames und Instanzen speichern + self.app_frames = {} + self.app_instances = {} + + # Verfügbare Anwendungen finden und laden + self.app_modules = self.discover_applications() + self.load_applications() + + # Event-Binding für Tab-Wechsel + self.notebook.bind("<>", self.on_tab_changed) + + logger.info("Launcher initialisiert") + + def _setup_logging(self): + """Richtet das Logging-System für den Launcher ein.""" + logger.setLevel(logging.INFO) + if not logger.handlers: + # Konsolenausgabe + console_handler = logging.StreamHandler() + console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + logger.addHandler(console_handler) + + # Datei-Logging + log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "logs") + os.makedirs(log_dir, exist_ok=True) + file_handler = logging.FileHandler(os.path.join(log_dir, "launcher.log")) + file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + logger.addHandler(file_handler) + + logger.info("Launcher-Logging eingerichtet") + + def discover_applications(self): + """ + Sucht im Basisverzeichnis nach Anwendungsmodulen. + Erwartet für jede Anwendung einen Ordner mit einem module_launcher.py, + das eine get_app_for_launcher-Funktion enthält. + """ + app_modules = {} + base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + logger.info(f"Suche nach Anwendungen in: {base_dir}") + + # Bekannte Anwendungspfade + apps_to_check = [ + "Preisliste", + # Hier können weitere Anwendungen hinzugefügt werden + ] + + for app_name in apps_to_check: + app_dir = os.path.join(base_dir, app_name) + logger.info(f"Prüfe Anwendung {app_name} in {app_dir}") + + if not os.path.isdir(app_dir): + logger.warning(f"Verzeichnis nicht gefunden: {app_dir}") + continue + + # Prüfen, ob es eine module_launcher.py gibt + module_path = os.path.join(app_dir, "module_launcher.py") + if os.path.exists(module_path): + logger.info(f"Gefunden: {module_path}") + app_modules[app_name] = { + "path": module_path, + "module_name": "module_launcher", + "app_dir": app_dir + } + else: + logger.warning(f"Keine module_launcher.py gefunden in {app_dir}") + + # Alternativ direkt nach main.py suchen + main_path = os.path.join(app_dir, "main.py") + if os.path.exists(main_path): + logger.info(f"Gefunden: {main_path} (als Fallback)") + app_modules[app_name] = { + "path": main_path, + "module_name": "main", + "app_dir": app_dir + } + + logger.info(f"Gefundene Anwendungen: {list(app_modules.keys())}") + return app_modules + + def load_applications(self): + """ + Lädt die gefundenen Anwendungen und erstellt für jede einen Tab. + """ + if not self.app_modules: + logger.warning("Keine Anwendungen gefunden") + self._show_no_apps_message() + return + + for app_name, app_info in self.app_modules.items(): + try: + logger.info(f"Lade Anwendung: {app_name} aus {app_info['path']}") + + # Anwendungsverzeichnis zum Python-Pfad hinzufügen + if app_info["app_dir"] not in sys.path: + sys.path.insert(0, app_info["app_dir"]) + logger.info(f"Verzeichnis zum Pfad hinzugefügt: {app_info['app_dir']}") + + # Tab-Frame erstellen + app_frame = ttk.Frame(self.notebook) + self.app_frames[app_name] = app_frame + + # Modul dynamisch laden + try: + # Verschiedene Methoden zum Laden des Moduls versuchen + module = None + + # Methode 1: Direkter Import, wenn Modul bereits im Pfad ist + try: + logger.info(f"Versuche direkten Import für {app_name}") + if app_info["module_name"] == "module_launcher": + # Vollständiger Import-Pfad für module_launcher + import_path = f"{app_name}.module_launcher" + logger.info(f"Import-Pfad: {import_path}") + module = importlib.import_module(import_path) + else: + # Einfacher Import für main.py oder ähnliches + import_path = app_info["module_name"] + logger.info(f"Import-Pfad: {import_path}") + module = importlib.import_module(import_path) + except ImportError as e: + logger.warning(f"Direkter Import fehlgeschlagen: {e}") + + # Methode 2: Import über spec, wenn direkter Import fehlschlägt + if module is None: + logger.info(f"Versuche Import über spec für {app_name}") + spec = importlib.util.spec_from_file_location( + app_info["module_name"], + app_info["path"] + ) + module = importlib.util.module_from_spec(spec) + sys.modules[app_info["module_name"]] = module + spec.loader.exec_module(module) + + # Überprüfen, ob Module geladen wurde + if module is None: + raise ImportError(f"Konnte Modul {app_info['module_name']} nicht laden") + + # App-Instanz erstellen + if hasattr(module, "get_app_for_launcher"): + logger.info(f"Verwende get_app_for_launcher-Funktion für {app_name}") + app_instance = module.get_app_for_launcher(app_frame) + self.app_instances[app_name] = app_instance + self.notebook.add(app_frame, text=app_name) + self.status_label.config(text=f"Anwendung '{app_name}' geladen") + else: + logger.error(f"Keine get_app_for_launcher-Funktion in {app_name}") + self._show_error_app(app_name, app_frame, + "Die Anwendung unterstützt keine direkte Launcher-Integration") + + except Exception as e: + logger.error(f"Fehler beim Laden von {app_name}: {str(e)}") + traceback.print_exc() + self._show_error_app(app_name, app_frame, f"Fehler beim Laden der Anwendung: {str(e)}") + + except Exception as e: + logger.error(f"Fehler bei der Anwendungsinitialisierung von {app_name}: {str(e)}") + messagebox.showerror( + "Fehler beim Laden", + f"Anwendung '{app_name}' konnte nicht geladen werden: {str(e)}" + ) + traceback.print_exc() + + def _show_error_app(self, app_name, frame, error_message): + """ + Zeigt eine Fehleranzeige im Tab einer Anwendung an. + """ + for widget in frame.winfo_children(): + widget.destroy() + + error_frame = ttk.Frame(frame, padding=20) + error_frame.pack(fill=tk.BOTH, expand=True) + + error_icon = ttk.Label( + error_frame, + text="⚠️", + font=("Arial", 24) + ) + error_icon.pack(pady=(0, 10)) + + error_title = ttk.Label( + error_frame, + text=f"Fehler in Anwendung '{app_name}'", + font=("Arial", 14, "bold"), + foreground="red" + ) + error_title.pack(pady=(0, 20)) + + error_label = ttk.Label( + error_frame, + text=error_message, + foreground="black", + justify=tk.LEFT, + wraplength=600 + ) + error_label.pack(pady=10) + + # Hinweis + hint_label = ttk.Label( + error_frame, + text="Weitere Informationen finden Sie in den Logdateien.", + font=("Arial", 9, "italic") + ) + hint_label.pack(pady=(20, 0)) + + self.notebook.add(frame, text=app_name) + logger.info(f"Fehler-Tab für {app_name} erstellt") + + def _show_no_apps_message(self): + """ + Zeigt eine Meldung an, wenn keine Anwendungen gefunden wurden. + """ + info_frame = ttk.Frame(self.main_frame, padding=30) + info_frame.pack(fill=tk.BOTH, expand=True) + + title = ttk.Label( + info_frame, + text="Keine Anwendungen gefunden", + font=("Arial", 16, "bold") + ) + title.pack(pady=(0, 20)) + + message = ttk.Label( + info_frame, + text=( + "Der Launcher konnte keine Anwendungen finden, die integriert werden können.\n\n" + "Bitte stellen Sie sicher, dass alle Anwendungen korrekt installiert sind und " + "eine module_launcher.py-Datei enthalten." + ), + wraplength=600, + justify=tk.CENTER + ) + message.pack() + + def on_tab_changed(self, event): + """ + Wird aufgerufen, wenn der Benutzer zwischen Tabs wechselt. + """ + try: + current_tab = self.notebook.select() + if not current_tab: + return + + tab_index = self.notebook.index(current_tab) + tab_name = self.notebook.tab(tab_index, "text") + self.status_label.config(text=f"Aktive Anwendung: {tab_name}") + + # Fokus auf die aktive Anwendung setzen + if tab_name in self.app_instances: + app = self.app_instances[tab_name] + if hasattr(app, "on_activate"): + try: + app.on_activate() + logger.info(f"on_activate aufgerufen für {tab_name}") + except Exception as e: + logger.error(f"Fehler beim Aktivieren der Anwendung {tab_name}: {str(e)}") + except Exception as e: + logger.error(f"Fehler beim Tab-Wechsel: {str(e)}", exc_info=True) + + +if __name__ == "__main__": + app = ApplicationLauncher() + app.mainloop() \ No newline at end of file diff --git a/Launcher/resources/ritterdigital.ico b/Launcher/resources/ritterdigital.ico new file mode 100644 index 0000000..e69de29 diff --git a/Preisliste b/Preisliste new file mode 160000 index 0000000..2e6bda7 --- /dev/null +++ b/Preisliste @@ -0,0 +1 @@ +Subproject commit 2e6bda7d3efe002005884e31fa58228eb6aee157 diff --git a/logs/launcher.log b/logs/launcher.log new file mode 100644 index 0000000..a137fda --- /dev/null +++ b/logs/launcher.log @@ -0,0 +1,78 @@ +2025-03-18 22:58:24,832 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 22:58:24,861 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 22:58:24,862 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 22:58:24,862 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 22:58:24,862 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 22:58:24,866 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 22:58:25,851 - emirat.launcher - INFO - Launcher initialisiert +2025-03-18 22:58:25,852 - emirat.launcher - INFO - on_activate aufgerufen fr Preisliste +2025-03-18 22:59:18,289 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 22:59:18,315 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 22:59:18,320 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 22:59:19,114 - emirat.launcher - INFO - Launcher initialisiert +2025-03-18 22:59:19,115 - emirat.launcher - INFO - on_activate aufgerufen fr Preisliste +2025-03-18 23:02:48,042 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:02:48,067 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:02:48,069 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:02:48,071 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:02:48,881 - emirat.launcher - INFO - Launcher initialisiert +2025-03-18 23:02:48,881 - emirat.launcher - INFO - on_activate aufgerufen fr Preisliste +2025-03-18 23:04:03,310 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:04:03,337 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:04:03,342 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:04:04,172 - emirat.launcher - INFO - Launcher initialisiert +2025-03-18 23:04:04,172 - emirat.launcher - INFO - on_activate aufgerufen fr Preisliste +2025-03-18 23:07:57,377 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:07:57,399 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:07:57,400 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:07:57,400 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:07:57,429 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:08:00,212 - emirat.launcher - INFO - Launcher initialisiert +2025-03-18 23:08:00,213 - emirat.launcher - INFO - on_activate aufgerufen fr Preisliste +2025-03-18 23:08:05,271 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:08:05,291 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:08:05,292 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:08:05,292 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:08:05,319 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:08:06,320 - emirat.launcher - INFO - Launcher initialisiert +2025-03-18 23:08:06,320 - emirat.launcher - INFO - on_activate aufgerufen fr Preisliste diff --git a/logs/launcher_20250318.log b/logs/launcher_20250318.log new file mode 100644 index 0000000..98862aa --- /dev/null +++ b/logs/launcher_20250318.log @@ -0,0 +1,81 @@ +2025-03-18 10:39:17,767 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 10:39:18,999 - database.db_connector - INFO - Datenbankverbindung hergestellt +2025-03-18 22:33:29,114 - __main__ - INFO - Launcher beendet +2025-03-18 22:49:26,016 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 22:49:26,878 - database.db_connector - INFO - Datenbankverbindung hergestellt +2025-03-18 22:49:36,820 - __main__ - INFO - Launcher beendet +2025-03-18 22:50:37,133 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 22:50:37,998 - database.db_connector - INFO - Datenbankverbindung hergestellt +2025-03-18 22:58:15,698 - __main__ - INFO - Launcher beendet +2025-03-18 22:58:24,455 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 22:58:24,832 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 22:58:24,861 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 22:58:24,862 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 22:58:24,862 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 22:58:24,862 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 22:58:24,863 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 22:58:24,866 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 22:59:18,241 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 22:59:18,289 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 22:59:18,315 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 22:59:18,317 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 22:59:18,320 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:02:47,992 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 23:02:48,042 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:02:48,067 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:02:48,068 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:02:48,069 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:02:48,071 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:04:03,261 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 23:04:03,310 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:04:03,337 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:04:03,339 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:04:03,342 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:07:57,332 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 23:07:57,377 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:07:57,399 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:07:57,400 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:07:57,400 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:07:57,401 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:07:57,429 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste +2025-03-18 23:08:05,224 - __main__ - INFO - Starte Emirat Software Launcher +2025-03-18 23:08:05,271 - emirat.launcher - INFO - Launcher-Logging eingerichtet +2025-03-18 23:08:05,291 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico +2025-03-18 23:08:05,292 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat +2025-03-18 23:08:05,292 - emirat.launcher - INFO - Prfe Anwendung Preisliste in C:\Development\Emirat\Preisliste +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste'] +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefgt: C:\Development\Emirat\Preisliste +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Versuche direkten Import fr Preisliste +2025-03-18 23:08:05,293 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher +2025-03-18 23:08:05,319 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion fr Preisliste diff --git a/main_launcher.py b/main_launcher.py new file mode 100644 index 0000000..3c1005b --- /dev/null +++ b/main_launcher.py @@ -0,0 +1,70 @@ +""" +Haupteinstiegspunkt für den Anwendungs-Launcher. +Dieses Skript sollte im Hauptverzeichnis (C:/Development/Emirat) abgelegt werden. +""" +import os +import sys +import logging +from datetime import datetime + +# Logging einrichten +log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs") +os.makedirs(log_dir, exist_ok=True) + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler( + os.path.join(log_dir, f'launcher_{datetime.now().strftime("%Y%m%d")}.log') + ), + logging.StreamHandler(sys.stdout) + ] +) + +logger = logging.getLogger(__name__) + + +def main(): + """ + Hauptfunktion zum Starten des Launchers. + """ + try: + logger.info("Starte Emirat Software Launcher") + + # Launcher-Verzeichnis zum Python-Pfad hinzufügen + launcher_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Launcher") + if launcher_dir not in sys.path: + sys.path.insert(0, launcher_dir) + + # Importiere und starte den Launcher + from Launcher.app_launcher import ApplicationLauncher + + app = ApplicationLauncher() + app.mainloop() + + logger.info("Launcher beendet") + + except Exception as e: + logger.error(f"Fehler beim Starten des Launchers: {str(e)}", exc_info=True) + + # Bei Fehlern im Grafikmodus einen Dialog anzeigen + try: + import tkinter as tk + from tkinter import messagebox + root = tk.Tk() + root.withdraw() # Verstecke das Hauptfenster + messagebox.showerror( + "Launcher-Fehler", + f"Der Launcher konnte nicht gestartet werden:\n\n{str(e)}\n\n" + f"Details wurden in die Logdatei geschrieben:\n{os.path.join(log_dir, 'launcher_*.log')}" + ) + except: + # Fallback, wenn selbst der Fehlerdialog nicht angezeigt werden kann + print(f"KRITISCHER FEHLER: Der Launcher konnte nicht gestartet werden: {str(e)}") + print(f"Details wurden in die Logdatei geschrieben: {os.path.join(log_dir, 'launcher_*.log')}") + input("Drücken Sie Enter, um fortzufahren...") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cb05fa6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,40 @@ +# Datenbank-Treiber +pyodbc>=5.2.0 + +# GUI-Toolkit (tkinter ist in der Standardbibliothek, aber zur Dokumentation) +# Hinweis: tkinter erfordert keine separate Installation mit pip + +# Entwicklungswerkzeuge +setuptools>=76.0.0 +wheel>=0.45.1 +black>=25.1.0 # Code-Formatierung (optional) +autopep8>=2.3.2 # Alternative Code-Formatierung (optional) + +# Test-Frameworks +pytest>=8.3.5 +pytest-cov>=6.0.0 + +# Debugging +ptvsd>=4.3.2 # Python-Debugger für VS Code (optional) + +# Paketierungswerkzeuge für EXE-Erstellung +pyinstaller>=6.12.0 + +# Dokumentation +sphinx>=8.2.3 # Dokumentationsgenerator (optional) + +# Lokale Pakete im Entwicklungsmodus +-e ./module_interface +-e ./common + +# Logging-Erweiterungen +python-json-logger>=3.3.0 + +# Spezifische Abhängigkeiten für das Preislisten-Modul +# (Fügen Sie hier weitere spezifische Abhängigkeiten hinzu) + +# Performance-Optimierungen +psutil>=7.0.0 # Systemressourcen überwachen (optional) + +# Sicherheits-Tools +bcrypt>=4.3.0 # Für sicheres Passwort-Hashing