在 PyQt 中将 python class 添加到 web worker 的上下文中

Add python class to web worker's context in PyQt

我正在使用 webkit 在 PyQt5 中编写应用程序,我想通过 JavaScript 在 Web Worker 中访问 Python class。

我的代码现在是这样做的:

import sys
import time

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWebKit import *
from PyQt5.QtWebKitWidgets import *
from PyQt5.QtWidgets import *


class Foo(QObject):
    @pyqtSlot(result=str)
    def bar(self):
        return "baz"


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.view = QWebView(self)

        self.setupInspector()

        self.splitter = QSplitter(self)
        self.splitter.setContentsMargins(800, 600, 0, 0)
        self.splitter.setOrientation(Qt.Vertical)

        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(800, 600, 0, 0)
        self.layout.addWidget(self.splitter)

        self.view.setLayout(self.layout)

        self.foo = Foo(self)
        self.view.page().mainFrame().addToJavaScriptWindowObject("foo", self.foo)

    def setupInspector(self):
        page = self.view.page()
        page.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
        self.webInspector = QWebInspector(self)
        self.webInspector.setPage(page)

        shortcut = QShortcut(self)
        shortcut.setKey(Qt.Key_F12)
        shortcut.activated.connect(self.toggleInspector)
        self.webInspector.setVisible(False)

    def toggleInspector(self):
        self.webInspector.setVisible(not self.webInspector.isVisible())


def main():
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    window.view.load(QUrl(sys.argv[1]))
    app.exec_()


if __name__ == "__main__":
    main()

我加载了一个 html 文件,带有 file:/ URL,像这样:python3 browser.py file:/path-to-html/file.html.

如果我 运行 检查员,我可以 运行 foo.bar() 我在 return.

中得到 "baz"

我想运行那里面的一个工人。如果我创建一个 javascript 文件:

self.postMessage(foo.test());

然后,在检查器中,我创建了一个工人:

var worker = new Worker('file:/same-path-as-the-html/file.js');

我得到 ReferenceError: Can't find variable: foo,对我来说,这似乎意味着 foo 没有被 Qt 添加到 worker 的范围。

看起来确实不可能将 Qt 对象添加到 web-workers,因为它们生活在自己的范围内,而 Qt 对象总是添加到页面中 DOM。

另见 this answer