QWebEngineView.page().runJavaScript()未正确运行JavaScript代码



我正在使用PyQt5 GUI库制作一个Python程序。我发现使用runJavaScript((方法无法在HTML文档上执行JavaScript代码。

这是我的HTML文档——一个Mapbox GL JS组件。它也可以在这里找到:https://docs.mapbox.com/mapbox-gl-js/example/simple-map/。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Display a map on a webpage</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<link href="https://api.mapbox.com/mapbox-gl-js/v2.10.0/mapbox-gl.css" rel="stylesheet">
<script src="https://api.mapbox.com/mapbox-gl-js/v2.10.0/mapbox-gl.js"></script><script src="qrc:///qtwebchannel/qwebchannel.js"></script>
<style>
body { margin: 0; padding: 0; }
#map { position: absolute; top: 0; bottom: 0; width: 100%; }
</style>
</head>
<body>
<div id="map"></div>
<script>
mapboxgl.accessToken = 'pk.eyJ1IjoidmxhZGlra2lyIiwiYSI6ImNsNno2dnN3cjAxamYzbm4xeDhxa2xuY2oifQ.HhDTHZglHlDNte7XwGZ1Xg';
const map = new mapboxgl.Map({
container: 'map', // container ID
// Choose from Mapbox's core styles, or make your own style with Mapbox Studio
style: 'mapbox://styles/mapbox/streets-v11', // style URL
center: [-74.5, 40], // starting position [lng, lat]
zoom: 9, // starting zoom
projection: 'globe' // display the map as a 3D globe
});
map.on('style.load', () => {
map.setFog({}); // Set the default atmosphere style
});
</script>
</body>
</html>

以下是我的Python代码的一部分:

# Creating QWebEngineView widget called "mapView"
self.mapView = QtWebEngineWidgets.a
mapSizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
mapSizePolicy.setHeightForWidth(self.mapView.sizePolicy().hasHeightForWidth())
self.mapView.setSizePolicy(mapSizePolicy)
self.mapView.setObjectName("mapView")
self.detstartpointMapLayout.addWidget(self.mapView)
# Opening an HTML document and passing the components to QWebEngineView widget
with open('mapboxjs.html', 'r') as file:
mapHTML = file.read()
self.mapView.setHtml(mapHTML)
# Running a JavaScript code (with no success).
self.mapView.page().runJavaScript("const marker1 = new mapboxgl.Marker().setLngLat([12.554729, 55.70651]).addTo(map);")

这是我的程序返回的一个错误:

js: Uncaught ReferenceError: mapboxgl is not defined .

我想发生这种情况是因为runJavaScript((或QWebEngineView没有注意到我以前使用标记在HTML文档的HEAD部分导入的库。如何绕过它?当我在Firefox中打开HTML代码并将JS代码发送到控制台时,相同的JavaScript命令不会出错。

我的建议是正确的,因为page.runJavaScript((中的JS函数是在HTML文件HEAD部分的.JS脚本完成执行之前执行的。因此,为了解决这个问题,我通过替换将page().runJavascript()的执行延迟到HTML文件完全加载(包括HEAD部分中的.js文件(

self.widgetname.page().runJavaScript("someJavaScriptFunction")

带有

self.widgetname.page().loadFinished.connect(lambda: self.widgetname.page().runJavaScript("someJavaScriptFunction"))

不要忘记在self.widgetname.page().runJavaScript()之前包含lambda:

相关内容

  • 没有找到相关文章

最新更新