From bea7fc69b8fc1ce91cce3639c1189ff7a13ee8e3 Mon Sep 17 00:00:00 2001 From: Damjan Savic Date: Tue, 18 Mar 2025 23:15:29 +0100 Subject: [PATCH] Initial commit of full Emirat project --- .idea/.gitignore | 8 + .idea/Emirat.iml | 15 + .idea/inspectionProfiles/Project_Default.xml | 58 ++++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/vcs.xml | 7 + Launcher/__init__.py | 0 Launcher/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 139 bytes .../__pycache__/app_launcher.cpython-313.pyc | Bin 0 -> 16021 bytes Launcher/app_launcher.py | 323 ++++++++++++++++++ Launcher/resources/ritterdigital.ico | 0 Preisliste | 1 + logs/launcher.log | 78 +++++ logs/launcher_20250318.log | 81 +++++ main_launcher.py | 70 ++++ requirements.txt | 40 +++ 17 files changed, 702 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/Emirat.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 Launcher/__init__.py create mode 100644 Launcher/__pycache__/__init__.cpython-313.pyc create mode 100644 Launcher/__pycache__/app_launcher.cpython-313.pyc create mode 100644 Launcher/app_launcher.py create mode 100644 Launcher/resources/ritterdigital.ico create mode 160000 Preisliste create mode 100644 logs/launcher.log create mode 100644 logs/launcher_20250318.log create mode 100644 main_launcher.py create mode 100644 requirements.txt 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 0000000000000000000000000000000000000000..f5a3a59d81dd0330530eba42214a4924ac8e0b51 GIT binary patch literal 139 zcmey&%ge<81mEm#ri19mAOZ#$p^VQgK*m&tbOudEzm*I{OhDdekklO)Uwo^ z{DR!nypkB#+{~iHk{F-F(!Au1)S{U9_{_Y_lK6PNg34PQHo5sJr8%i~MXW%rAft;x OjE~HWjEqIhKo$T+u^@N= literal 0 HcmV?d00001 diff --git a/Launcher/__pycache__/app_launcher.cpython-313.pyc b/Launcher/__pycache__/app_launcher.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..041aac551543e243314b812d214bcd211782250d GIT binary patch literal 16021 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 literal 0 HcmV?d00001 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