在PyQt中向web worker's上下文中添加python类

Add python class to web worker's context in PyQt

本文关键字:上下文 添加 python 中向 PyQt web worker      更新时间:2023-09-26

我正在用webkit编写PyQt5中的应用程序,我想通过JavaScript访问一个Python类,在Web Worker中。

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

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(),我得到"baz"的回报。

我想在一个worker中运行。如果我用

创建一个javascript文件
self.postMessage(foo.test());

,在检查器中,我创建了一个worker:

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

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

看起来确实不可能将Qt对象添加到web-worker中,因为它们存在于自己的作用域中,而Qt对象总是添加到页面DOM中。