Initial commit of full Emirat project
This commit is contained in:
commit
bea7fc69b8
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@ -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
|
||||
15
.idea/Emirat.iml
generated
Normal file
15
.idea/Emirat.iml
generated
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.13 (Emirat)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="PyDocumentationSettings">
|
||||
<option name="format" value="PLAIN" />
|
||||
<option name="myDocStringFormat" value="Plain" />
|
||||
</component>
|
||||
<component name="TestRunnerService">
|
||||
<option name="PROJECT_TEST_RUNNER" value="py.test" />
|
||||
</component>
|
||||
</module>
|
||||
58
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
58
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,58 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="LossyEncoding" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredPackages">
|
||||
<value>
|
||||
<list size="42">
|
||||
<item index="0" class="java.lang.String" itemvalue="PyQt5" />
|
||||
<item index="1" class="java.lang.String" itemvalue="psycopg2-binary" />
|
||||
<item index="2" class="java.lang.String" itemvalue="google-api-python-client" />
|
||||
<item index="3" class="java.lang.String" itemvalue="pandas" />
|
||||
<item index="4" class="java.lang.String" itemvalue="pyqtgraph" />
|
||||
<item index="5" class="java.lang.String" itemvalue="google-auth-oauthlib" />
|
||||
<item index="6" class="java.lang.String" itemvalue="SQLAlchemy" />
|
||||
<item index="7" class="java.lang.String" itemvalue="requests" />
|
||||
<item index="8" class="java.lang.String" itemvalue="PyOTP" />
|
||||
<item index="9" class="java.lang.String" itemvalue="passlib" />
|
||||
<item index="10" class="java.lang.String" itemvalue="google-auth" />
|
||||
<item index="11" class="java.lang.String" itemvalue="PyQt6" />
|
||||
<item index="12" class="java.lang.String" itemvalue="python-dotenv" />
|
||||
<item index="13" class="java.lang.String" itemvalue="pyepc" />
|
||||
<item index="14" class="java.lang.String" itemvalue="importlib-metadata" />
|
||||
<item index="15" class="java.lang.String" itemvalue="playwright" />
|
||||
<item index="16" class="java.lang.String" itemvalue="pytest" />
|
||||
<item index="17" class="java.lang.String" itemvalue="aiofiles" />
|
||||
<item index="18" class="java.lang.String" itemvalue="black" />
|
||||
<item index="19" class="java.lang.String" itemvalue="aiohttp" />
|
||||
<item index="20" class="java.lang.String" itemvalue="isort" />
|
||||
<item index="21" class="java.lang.String" itemvalue="pytest-asyncio" />
|
||||
<item index="22" class="java.lang.String" itemvalue="APScheduler" />
|
||||
<item index="23" class="java.lang.String" itemvalue="flake8" />
|
||||
<item index="24" class="java.lang.String" itemvalue="openpyxl" />
|
||||
<item index="25" class="java.lang.String" itemvalue="sphinx-rtd-theme" />
|
||||
<item index="26" class="java.lang.String" itemvalue="mypy" />
|
||||
<item index="27" class="java.lang.String" itemvalue="pre-commit" />
|
||||
<item index="28" class="java.lang.String" itemvalue="ipython" />
|
||||
<item index="29" class="java.lang.String" itemvalue="gunicorn" />
|
||||
<item index="30" class="java.lang.String" itemvalue="types-python-dateutil" />
|
||||
<item index="31" class="java.lang.String" itemvalue="types-requests" />
|
||||
<item index="32" class="java.lang.String" itemvalue="types-setuptools" />
|
||||
<item index="33" class="java.lang.String" itemvalue="jupyter" />
|
||||
<item index="34" class="java.lang.String" itemvalue="pytest-cov" />
|
||||
<item index="35" class="java.lang.String" itemvalue="pytest-mock" />
|
||||
<item index="36" class="java.lang.String" itemvalue="Sphinx" />
|
||||
<item index="37" class="java.lang.String" itemvalue="types-aiofiles" />
|
||||
<item index="38" class="java.lang.String" itemvalue="uvicorn" />
|
||||
<item index="39" class="java.lang.String" itemvalue="pyinstaller" />
|
||||
<item index="40" class="java.lang.String" itemvalue="ttkthemes" />
|
||||
<item index="41" class="java.lang.String" itemvalue="pillow" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
</profile>
|
||||
</component>
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.13 (Decryption)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (Emirat)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Emirat.iml" filepath="$PROJECT_DIR$/.idea/Emirat.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
7
.idea/vcs.xml
generated
Normal file
7
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
<mapping directory="$PROJECT_DIR$/Preisliste" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
0
Launcher/__init__.py
Normal file
0
Launcher/__init__.py
Normal file
BIN
Launcher/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
Launcher/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
Launcher/__pycache__/app_launcher.cpython-313.pyc
Normal file
BIN
Launcher/__pycache__/app_launcher.cpython-313.pyc
Normal file
Binary file not shown.
323
Launcher/app_launcher.py
Normal file
323
Launcher/app_launcher.py
Normal file
@ -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("<<NotebookTabChanged>>", 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()
|
||||
0
Launcher/resources/ritterdigital.ico
Normal file
0
Launcher/resources/ritterdigital.ico
Normal file
1
Preisliste
Submodule
1
Preisliste
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 2e6bda7d3efe002005884e31fa58228eb6aee157
|
||||
78
logs/launcher.log
Normal file
78
logs/launcher.log
Normal file
@ -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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 für Preisliste
|
||||
81
logs/launcher_20250318.log
Normal file
81
logs/launcher_20250318.log
Normal file
@ -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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Versuche direkten Import für 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 für 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 - Prüfe 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 hinzugefügt: C:\Development\Emirat\Preisliste
|
||||
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Versuche direkten Import für 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 für Preisliste
|
||||
70
main_launcher.py
Normal file
70
main_launcher.py
Normal file
@ -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()
|
||||
40
requirements.txt
Normal file
40
requirements.txt
Normal file
@ -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
|
||||
Loading…
Reference in New Issue
Block a user