从 pyqt QWebEngineView 启动 javascript 函数



我计划从pyqt QWebEngine执行一个javascript函数。我遵循了一个使用地图的示例,当按下Qt应用程序按钮时检索地图绑定,并写了一个小示例。

.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
function helloWorld(param1, param2) {
return "Hello world " + param1 + " " + param2;
}
</script>
</body>
</html>

蟒:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.form_widget = FormWidget(self)
_widget = QWidget()
_layout = QVBoxLayout(_widget)
_layout.addWidget(self.form_widget)
self.setCentralWidget(_widget)

class FormWidget(QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
self.__controls()
self.__layout()
self.browser.page().runJavaScript("helloWorld()", self.ready)
def __controls(self):
html = open('test.html', 'r').read()
self.browser = QWebEngineView()
self.browser.setHtml(html)
def __layout(self):
self.vbox = QVBoxLayout()
self.hBox = QVBoxLayout()
self.hBox.addWidget(self.browser)
self.vbox.addLayout(self.hBox)
self.setLayout(self.vbox)
def ready(self, returnValue):
print(returnValue)
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
app.exec_()

if __name__ == '__main__':
sys.exit(main())

但是,我收到以下错误:

js: Uncaught ReferenceError: helloWorld is not defined
None ----> This is the return value printed at ready()

我错过了什么?

您有 2 个错误:

  • 您正在调用该函数,当页面尚未完成加载时。

  • 您的函数需要 2 个参数,虽然它也可以工作,但会发出未定义的信号。

使用上述方法,您可以获得以下内容:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.form_widget = FormWidget(self)
_widget = QWidget()
_layout = QVBoxLayout(_widget)
_layout.addWidget(self.form_widget)
self.setCentralWidget(_widget)

class FormWidget(QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
self.__controls()
self.__layout()
def __controls(self):
html = open('test.html', 'r').read()
self.browser = QWebEngineView()
self.browser.setHtml(html)
self.browser.loadFinished.connect(self.onLoadFinished)
def onLoadFinished(self, ok):
if ok:
self.browser.page().runJavaScript("helloWorld(1, "2")", self.ready)
def __layout(self):
self.vbox = QVBoxLayout()
self.hBox = QVBoxLayout()
self.hBox.addWidget(self.browser)
self.vbox.addLayout(self.hBox)
self.setLayout(self.vbox)
def ready(self, returnValue):
print(returnValue)
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
return app.exec_()

if __name__ == '__main__':
sys.exit(main())

加:

要可视化 js 控制台的输出,您必须覆盖QWebEnginePagejavaScriptConsoleMessage方法:

...
class WebEnginePage(QWebEnginePage):
def javaScriptConsoleMessage(self, level, message, lineNumber, sourceID):
print("javaScriptConsoleMessage: ", level, message, lineNumber, sourceID)

class FormWidget(QWidget):
...
def __controls(self):
...
self.browser = QWebEngineView()
self.browser.setPage(WebEnginePage(self.browser))
...

要验证这一点,您必须使用console.log(...)

*。.html

...
<script>
function helloWorld(param1, param2) {
console.log("Hello world")
return "Hello world " + param1 + " " + param2;
}
</script>
...

输出:

javaScriptConsoleMessage:  0 Hello world 12 data:text/html;charset=UTF-8,%3C%21DOCTYPE%20html%3E%0A%3Chtml%3E%0A%0A%3Chead%3E%0A%20%20%20%20%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%3C%2Fhead%3E%0A%0A%3Cbody%3E%0A%0A%3Cscript%3E%0A%20%20%20%20function%20helloWorld%28param1%2C%20param2%29%20%7B%0A%20%20%20%20%09console.log%28%22Hello%20world%22%29%0A%20%20%20%20%20%20%20%20return%20%22Hello%20world%20%22%20%2B%20param1%20%2B%20%22%20%22%20%2B%20param2%3B%0A%20%20%20%20%7D%0A%3C%2Fscript%3E%0A%0A%3C%2Fbody%3E%0A%3C%2Fhtml%3E

最新更新