def start(func=None, args=None, localization={}, gui=None, debug=False, http_server=False, user_agent=None): global guilib, _debug, _multiprocessing, _http_server, _user_agent def _create_children(other_windows): if not windows[0].shown.wait(10): raise WebViewException('Main window failed to load') for window in other_windows: guilib.create_window(window) _debug = debug _user_agent = user_agent #_multiprocessing = multiprocessing multiprocessing = False # TODO _http_server = http_server if multiprocessing: from multiprocessing import Process as Thread else: from threading import Thread original_localization.update(localization) if threading.current_thread().name != 'MainThread': raise WebViewException('This function must be run from a main thread.') if len(windows) == 0: raise WebViewException( 'You must create a window first before calling this function.') guilib = initialize(gui) # thanks to the buggy EdgeHTML, http server must be used for local urls if guilib.renderer == 'edgehtml': http_server = True for window in windows: window._initialize(guilib, multiprocessing, http_server) if len(windows) > 1: t = Thread(target=_create_children, args=(windows[1:], )) t.start() if func: if args is not None: if not hasattr(args, '__iter__'): args = (args, ) t = Thread(target=func, args=args) else: t = Thread(target=func) t.start() guilib.create_window(windows[0])
def wrapper(*args, **kwargs): event = args[0].loaded if event_type == 'loaded' else args[0].shown try: if not event.wait(15): raise WebViewException('Main window failed to start') if args[0].gui is None: raise WebViewException('GUI is not initialized') return function(*args, **kwargs) except NameError as e: raise WebViewException('Create a web view window first, before invoking this function')
def start(func=None, args=None, localization={}, gui=None, debug=False, http_server=False, user_agent=None, block=True): global guilib, _debug, _multiprocessing, _http_server, _user_agent def _create_children(other_windows): if not windows[0].shown.wait(10): raise WebViewException('Main window failed to load') for window in other_windows: guilib.create_window(window) _debug = debug _user_agent = user_agent _multiprocessing = not block _http_server = http_server original_localization.update(localization) if threading.current_thread().name != 'MainThread': raise WebViewException('This function must be run from a main thread.') if len(windows) == 0: raise WebViewException( 'You must create a window first before calling this function.') guilib = initialize(gui) for window in windows: window._initialize(guilib, http_server) if len(windows) > 1: t = threading.Thread(target=_create_children, args=(windows[1:], )) t.start() if func: if args is not None: if not hasattr(args, '__iter__'): args = (args, ) t = threading.Thread(target=func, args=args) else: t = threading.Thread(target=func) t.start() return guilib.create_window(windows[0])
def _create_children(other_windows): if not windows[0].shown.wait(10): raise WebViewException('Main window failed to load') for window in other_windows: guilib.create_window(window)
def start(func=None, args=None, localization={}, gui=None, debug=False, http_server=False, user_agent=None): """ Start a GUI loop and display previously created windows. This function must be called from a main thread. :param func: Function to invoke upon starting the GUI loop. :param args: Function arguments. Can be either a single value or a tuple of values. :param localization: A dictionary with localized strings. Default strings and their keys are defined in localization.py. :param gui: Force a specific GUI. Allowed values are ``cef``, ``qt``, or ``gtk`` depending on a platform. :param debug: Enable debug mode. Default is False. :param http_server: Enable built-in HTTP server. If enabled, local files will be served using a local HTTP server on a random port. For each window, a separate HTTP server is spawned. This option is ignored for non-local URLs. :param user_agent: Change user agent string. Not supported in EdgeHTML. """ global guilib, _debug, _multiprocessing, _http_server, _user_agent def _create_children(other_windows): if not windows[0].shown.wait(10): raise WebViewException('Main window failed to load') for window in other_windows: guilib.create_window(window) _debug = debug _user_agent = user_agent #_multiprocessing = multiprocessing multiprocessing = False # TODO _http_server = http_server if multiprocessing: from multiprocessing import Process as Thread else: from threading import Thread original_localization.update(localization) if threading.current_thread().name != 'MainThread': raise WebViewException('This function must be run from a main thread.') if len(windows) == 0: raise WebViewException('You must create a window first before calling this function.') guilib = initialize(gui) for window in windows: window._initialize(guilib, multiprocessing, http_server) if len(windows) > 1: t = Thread(target=_create_children, args=(windows[1:],)) t.start() if func: if args is not None: if not hasattr(args, '__iter__'): args = (args,) t = Thread(target=func, args=args) else: t = Thread(target=func) t.start() guilib.create_window(windows[0])
def initialize(forced_gui=None): def import_gtk(): global guilib try: import webview.platforms.gtk as guilib logger.debug('Using GTK') print('Using GTK') return True except (ImportError, ValueError) as e: logger.exception('GTK cannot be loaded') print('GTK cannot be loaded') return False def import_qt(): global guilib try: import webview.platforms.qt as guilib logger.debug('Using QT') print('Using QT') return True except ImportError as e: logger.exception('QT cannot be loaded') print('QT cannot be loaded') return False def import_cocoa(): global guilib try: import webview.platforms.cocoa as guilib return True except ImportError: logger.exception('PyObjC cannot be loaded') return False def import_winforms(): global guilib try: import webview.platforms.winforms as guilib return True except ImportError as e: logger.exception('pythonnet cannot be loaded') return False def try_import(guis): while guis: import_func = guis.pop(0) if import_func(): return True return False global forced_gui_ if not forced_gui: forced_gui = 'qt' if 'KDE_FULL_SESSION' in os.environ else None forced_gui = os.environ['PYWEBVIEW_GUI'].lower() \ if 'PYWEBVIEW_GUI' in os.environ and os.environ['PYWEBVIEW_GUI'].lower() in ['qt', 'gtk', 'cef', 'mshtml'] \ else None forced_gui_ = forced_gui if platform.system() == 'Darwin': if forced_gui == 'qt': guis = [import_qt, import_cocoa] else: guis = [import_cocoa, import_qt] if not try_import(guis): raise WebViewException( 'You must have either PyObjC (for Cocoa support) or Qt with Python bindings installed in order to use pywebview.' ) elif platform.system() == 'Linux' or platform.system() == 'OpenBSD': if forced_gui == 'qt': guis = [import_qt, import_gtk] else: guis = [import_gtk, import_qt] if not try_import(guis): raise WebViewException( 'You must have either QT or GTK with Python extensions installed in order to use pywebview.' ) elif platform.system() == 'Windows': if forced_gui == 'qt': guis = [import_qt, import_winforms] else: guis = [import_winforms, import_qt] # guis = [import_qt, import_winforms] # guis = [import_qt] if not try_import(guis): raise WebViewException( 'You must have either pythonnet installed in order to use pywebview.' ) else: raise WebViewException( 'Unsupported platform. Only Windows, Linux, OS X, OpenBSD are supported.' ) return guilib