在 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。
我正在使用 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。