【问题标题】:How to Access pywebview.Window Object from Another multiprocessing.Process?如何从另一个 multiprocessing.Process 访问 pywebview.Window 对象?
【发布时间】:2021-09-01 20:29:18
【问题描述】:

我有一个控制flask api 的webview

webview 将有一个按钮来启动flask server 和一个按钮来停止服务器。这就是为什么我必须使用multiprocessing.ProcessFlask 创建一个单独的进程。这样,我就无法再访问我的pywebview.Window。我想使用pywebview.WindowFlask 进程中使用pywebview.Window.evaluate_js() 评估一些javascript(当然它必须与我在为Flask 打开新进程之前已经创建的pywebview.Window 相同)。 有谁知道如何完成这个问题。我很感激!

一些示例代码:

from flask import Flask, request, jsonify
import os, sys, re, json, socket, sqlite3, base64, requests, webview
from flask_cors import CORS

class ServerFlaskApi:
    def __init__(self):
        self.app = Flask(__name__, root_path=Root_Dir)
        self.app.add_url_rule("/", view_func=self.Default)

    def Default(self):
        return "Welcome to the Python Http Server for your Application!", 200
    def PrintToWebViewConsole(self):
        #Trying to use pywebview.Window here, of course WebviewWindow is not defined!!!
        WebviewWindow.evaluate_js(js_script)
################
class WebviewApi:
    def __init__(self):
        self.server_thread = None
    def StartServer(self):
        self.server_thread = multiprocessing.Process(target=Run_Flask_Server, daemon=True)
        self.server_thread.start()
    def StopServer(self):
        self.server_thread.terminate()

def Run_Flask_Server():
    serverApi = ServerFlaskApi()
    CORS(serverApi.app)
    serverApi.app.run(host=Server_Host, port=Server_Port, debug=True, use_reloader=False)
################
if __name__ == "__main__":
    WebViewApi = WebviewApi()
    WebviewWindow = webview.create_window(title="Server Monitor", url="view/main-gui.html", js_api=WebViewApi, width=550, height=750, min_size=(550, 750), resizable=False, on_top=True, confirm_close=False)
    webview.start(debug=False)

我还是Python 的新手,欢迎提出任何建议!

提前谢谢你!

【问题讨论】:

    标签: python-3.x flask webview multiprocessing pywebview


    【解决方案1】:

    我想我必须使用Threading 而不是Processing,因为Thread 共享内存而Process 不是。 此外,对于任何想要停止Thread 的人,这里有一个功能可以做到这一点,不确定这是否是一个好方法,但它对我有用:

    def Kill_Thread(thread):
        if not isinstance(thread, threading.Thread):
                raise TypeError("Must be set as threading.Thread type!!!")
        thread_id = thread.ident
        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))
        if res > 1:
            ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
            print("Exception raise failure")
    

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多