Ver Fonte

providing desktop mode (optional fullscreen)

Rodja Trappe há 2 anos atrás
pai
commit
c734cab195
2 ficheiros alterados com 34 adições e 2 exclusões
  1. 28 0
      nicegui/desktop_mode.py
  2. 6 2
      nicegui/run.py

+ 28 - 0
nicegui/desktop_mode.py

@@ -0,0 +1,28 @@
+import multiprocessing
+import os
+import signal
+import tempfile
+import time
+from threading import Thread
+
+import webview
+
+shutdown = multiprocessing.Event()
+
+
+def open_window(event, fullscreen) -> None:
+    window = webview.create_window('NiceGUI', url='http://localhost:8080', fullscreen=fullscreen)
+    window.events.closing += event.set  # signal that the program should be closed to the main process
+    webview.start(storage_path=tempfile.mkdtemp())
+
+
+def check_shutdown() -> None:
+    while True:
+        if shutdown.is_set():
+            os.kill(os.getpgid(os.getpid()), signal.SIGTERM)
+        time.sleep(0.1)
+
+
+def activate(fullscreen: bool = False) -> None:
+    multiprocessing.Process(target=open_window, args=(shutdown, fullscreen), daemon=False).start()
+    Thread(target=check_shutdown, daemon=True).start()

+ 6 - 2
nicegui/run.py

@@ -9,7 +9,7 @@ import uvicorn
 from uvicorn.main import STARTUP_FAILURE
 from uvicorn.main import STARTUP_FAILURE
 from uvicorn.supervisors import ChangeReload, Multiprocess
 from uvicorn.supervisors import ChangeReload, Multiprocess
 
 
-from . import globals
+from . import desktop_mode, globals
 
 
 
 
 def run(*,
 def run(*,
@@ -21,6 +21,8 @@ def run(*,
         dark: Optional[bool] = False,
         dark: Optional[bool] = False,
         binding_refresh_interval: float = 0.1,
         binding_refresh_interval: float = 0.1,
         show: bool = True,
         show: bool = True,
+        desktop: bool = False,
+        fullscreen: bool = False,
         reload: bool = True,
         reload: bool = True,
         uvicorn_logging_level: str = 'warning',
         uvicorn_logging_level: str = 'warning',
         uvicorn_reload_dirs: str = '.',
         uvicorn_reload_dirs: str = '.',
@@ -67,7 +69,9 @@ def run(*,
     if multiprocessing.current_process().name != 'MainProcess':
     if multiprocessing.current_process().name != 'MainProcess':
         return
         return
 
 
-    if show:
+    if desktop or fullscreen:
+        desktop_mode.activate(fullscreen)
+    elif show:
         webbrowser.open(f'http://{host if host != "0.0.0.0" else "127.0.0.1"}:{port}/')
         webbrowser.open(f'http://{host if host != "0.0.0.0" else "127.0.0.1"}:{port}/')
 
 
     def split_args(args: str) -> List[str]:
     def split_args(args: str) -> List[str]: