From 6a49f47a5bf9696592e1e3f6082a816b0f354dc9 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 24 Nov 2025 13:47:32 +0000 Subject: [PATCH] add native mode checks and fallback for pywebview in UI launch process; create new pywebview module --- nice.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++-- pywebview.py | 3 +++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 pywebview.py diff --git a/nice.py b/nice.py index 0932f5f..d2052a9 100644 --- a/nice.py +++ b/nice.py @@ -133,6 +133,7 @@ async def read_nng_messages(): # This shouldn't be necessary global SHUTDOWN SHUTDOWN = True + logger.debug("Triggering shutdown due to socket in use") return # asyncio.create_task(read_nng_messages()) @@ -752,8 +753,56 @@ def launch_app( port = native.find_open_port() #port = 8001 logger.debug(f"Run on port {port}") - #ui.run(reload=False, show=True, port=port, native=native_mode, favicon="icon/icon1.ico") - ui.run(reload=False, show=True, port=port, native=native_mode) + + # If native mode was requested, ensure pywebview has a usable GUI + # backend (Qt or GTK). If not present, disable native mode to avoid + # runtime WebViewException errors when webview.initialize() runs. + if native_mode: + try: + import webview + + backend_available = False + # Check common backends: PyQt5/PySide6 or GTK (gi) + try: + import PyQt5 # type: ignore + backend_available = True + except Exception: + try: + import PySide6 # type: ignore + backend_available = True + except Exception: + pass + + if not backend_available: + try: + # GTK + from gi.repository import Gtk # type: ignore + + backend_available = True + except Exception: + backend_available = False + + if not backend_available: + logger.debug( + "pywebview backend (Qt/GTK) not available; disabling native mode" + ) + native_mode = False + except Exception as e: + logger.debug(f"pywebview import/check failed: {e}; disabling native mode") + native_mode = False + + # Try to run with the requested mode. If native startup fails at + # runtime, catch and fall back to browser mode so the app stays usable. + try: + ui.run(reload=False, show=True, port=port, native=native_mode) + except Exception as e: + logger.error(f"Failed to start UI in native mode: {e}") + if native_mode: + logger.debug("Retrying without native mode (browser fallback)") + try: + ui.run(reload=False, show=True, port=port, native=False) + except Exception as e2: + logger.error(f"Fallback to browser mode failed: {e2}") except Exception as e: logger.error(e) pass diff --git a/pywebview.py b/pywebview.py new file mode 100644 index 0000000..fedcfe4 --- /dev/null +++ b/pywebview.py @@ -0,0 +1,3 @@ +import webview +webview.create_window('Hello world', 'https://pywebview.flowrl.com/hello') +webview.start() \ No newline at end of file