Major updates: analyse .fit and .gpx files now with jogging_dashboard_***_app.py. Additionally, created a WEB and a GUI version of the tool.
This commit is contained in:
213
jogging_dashboard_gui_app.py
Normal file
213
jogging_dashboard_gui_app.py
Normal file
@@ -0,0 +1,213 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
|
||||
@author: Marcel Weschke
|
||||
@email: marcel.weschke@directbox.de
|
||||
"""
|
||||
# %% Load libraries
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QSplashScreen, QLabel
|
||||
from PyQt6.QtWebEngineWidgets import QWebEngineView
|
||||
from PyQt6.QtCore import QUrl, QTimer, Qt
|
||||
from PyQt6.QtGui import QPixmap
|
||||
|
||||
# Performance-Optimierungen für Qt WebEngine
|
||||
os.environ.update({
|
||||
# Hardware-Beschleunigung forcieren
|
||||
"QTWEBENGINE_CHROMIUM_FLAGS": (
|
||||
"--ignore-gpu-blocklist "
|
||||
"--enable-gpu-rasterization "
|
||||
"--enable-zero-copy "
|
||||
"--disable-logging "
|
||||
"--no-sandbox "
|
||||
"--disable-dev-shm-usage "
|
||||
"--disable-extensions "
|
||||
"--disable-plugins "
|
||||
"--disable-background-timer-throttling "
|
||||
"--disable-backgrounding-occluded-windows "
|
||||
"--disable-renderer-backgrounding "
|
||||
"--disable-features=TranslateUI "
|
||||
"--aggressive-cache-discard "
|
||||
"--memory-pressure-off"
|
||||
),
|
||||
# Logging reduzieren
|
||||
"QT_LOGGING_RULES": "qt.webenginecontext.debug=false",
|
||||
"QTWEBENGINE_DISABLE_SANDBOX": "1",
|
||||
# Cache-Optimierungen
|
||||
"QTWEBENGINE_DISABLE_GPU_THREAD": "0"
|
||||
})
|
||||
|
||||
# Importiere deine Dash-App
|
||||
from jogging_dashboard_browser_app import app
|
||||
|
||||
class DashThread(threading.Thread):
|
||||
"""Optimierter Dash-Thread mit besserer Kontrolle"""
|
||||
def __init__(self):
|
||||
super().__init__(daemon=True)
|
||||
self.dash_ready = False
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
# Dash mit Performance-Optimierungen starten
|
||||
app.run(
|
||||
debug=False,
|
||||
port=8051,
|
||||
use_reloader=False,
|
||||
host='127.0.0.1',
|
||||
threaded=True, # Threading für bessere Performance
|
||||
processes=1 # Single process für Desktop
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Dash-Server Fehler: {e}")
|
||||
|
||||
def wait_for_dash(self, timeout=10):
|
||||
"""Warte bis Dash-Server bereit ist"""
|
||||
import requests
|
||||
start_time = time.time()
|
||||
|
||||
while time.time() - start_time < timeout:
|
||||
try:
|
||||
response = requests.get('http://127.0.0.1:8051/', timeout=2)
|
||||
if response.status_code == 200:
|
||||
self.dash_ready = True
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
time.sleep(0.5)
|
||||
|
||||
return False
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("Jogging Dashboard - Desktop")
|
||||
self.setGeometry(100, 100, 1400, 900) # Größere Standardgröße
|
||||
|
||||
# Performance: Lade Seite erst wenn Dash bereit ist
|
||||
self.browser = None
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
"""UI-Setup ohne sofortiges Laden der Seite"""
|
||||
central_widget = QWidget()
|
||||
layout = QVBoxLayout()
|
||||
|
||||
# Loading-Label während Dash startet
|
||||
self.loading_label = QLabel("🚀 Dashboard wird geladen...")
|
||||
self.loading_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.loading_label.setStyleSheet("""
|
||||
QLabel {
|
||||
font-size: 18px;
|
||||
color: #333;
|
||||
background: #f0f0f0;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
""")
|
||||
|
||||
layout.addWidget(self.loading_label)
|
||||
central_widget.setLayout(layout)
|
||||
self.setCentralWidget(central_widget)
|
||||
|
||||
def load_dashboard(self):
|
||||
"""Lade Dashboard nachdem Dash bereit ist"""
|
||||
# Browser-Widget erstellen
|
||||
self.browser = QWebEngineView()
|
||||
|
||||
# Performance-Einstellungen für WebEngineView
|
||||
settings = self.browser.settings()
|
||||
settings.setAttribute(settings.WebAttribute.PluginsEnabled, False)
|
||||
settings.setAttribute(settings.WebAttribute.JavascriptEnabled, True)
|
||||
settings.setAttribute(settings.WebAttribute.LocalStorageEnabled, True)
|
||||
|
||||
# Seite laden
|
||||
self.browser.setUrl(QUrl("http://127.0.0.1:8051"))
|
||||
|
||||
# Layout aktualisieren
|
||||
central_widget = QWidget()
|
||||
layout = QVBoxLayout()
|
||||
layout.setContentsMargins(0, 0, 0, 0) # Kein Rand für maximale Größe
|
||||
layout.addWidget(self.browser)
|
||||
central_widget.setLayout(layout)
|
||||
self.setCentralWidget(central_widget)
|
||||
|
||||
print("✅ Dashboard geladen!")
|
||||
|
||||
class SplashScreen(QSplashScreen):
|
||||
"""Splash Screen für bessere UX während des Startens"""
|
||||
def __init__(self):
|
||||
# Einfacher Text-Splash (du kannst ein Logo hinzufügen)
|
||||
pixmap = QPixmap(400, 200)
|
||||
pixmap.fill(Qt.GlobalColor.white)
|
||||
super().__init__(pixmap)
|
||||
|
||||
# Text hinzufügen
|
||||
self.setStyleSheet("""
|
||||
QSplashScreen {
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
}
|
||||
""")
|
||||
|
||||
def showMessage(self, message):
|
||||
super().showMessage(message, Qt.AlignmentFlag.AlignCenter, Qt.GlobalColor.white)
|
||||
|
||||
def main():
|
||||
print("🚀 Starte Jogging Dashboard...")
|
||||
|
||||
# Qt Application mit Performance-Flags
|
||||
app_qt = QApplication(sys.argv)
|
||||
#app_qt.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling, True) # Not working yet
|
||||
#app_qt.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps, True) # Not working yet
|
||||
|
||||
# Splash Screen anzeigen
|
||||
splash = SplashScreen()
|
||||
splash.show()
|
||||
splash.showMessage("Initialisiere Dashboard...")
|
||||
app_qt.processEvents()
|
||||
|
||||
# Dash-Server starten
|
||||
dash_thread = DashThread()
|
||||
dash_thread.start()
|
||||
|
||||
splash.showMessage("Starte Web-Server...")
|
||||
app_qt.processEvents()
|
||||
|
||||
# Auf Dash warten
|
||||
if dash_thread.wait_for_dash(timeout=15):
|
||||
splash.showMessage("Dashboard bereit!")
|
||||
app_qt.processEvents()
|
||||
|
||||
# Hauptfenster erstellen und laden
|
||||
window = MainWindow()
|
||||
|
||||
# Kurz warten für bessere UX
|
||||
time.sleep(0.5)
|
||||
|
||||
# Dashboard laden
|
||||
window.load_dashboard()
|
||||
|
||||
# Splash schließen und Hauptfenster anzeigen
|
||||
splash.close()
|
||||
window.show()
|
||||
|
||||
print("✅ Dashboard erfolgreich gestartet!")
|
||||
|
||||
else:
|
||||
splash.showMessage("❌ Fehler beim Starten!")
|
||||
app_qt.processEvents()
|
||||
time.sleep(2)
|
||||
splash.close()
|
||||
print("❌ Dashboard konnte nicht gestartet werden!")
|
||||
sys.exit(1)
|
||||
|
||||
# Event-Loop starten
|
||||
sys.exit(app_qt.exec())
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user