Ich versuche, ein JS-Map-Widget aus einer PyQt5-Anwendung zu laden und abzufragen. Ich bin in der Lage, die Methode zu verwenden:Rückgabewert von Javascript an pyqt5
PyQt5.QtWebEngineWidgets.QWebEngineView().page().runJavaScript()
JS Funktion von der Webseite in einem QWebEngineView()
geladen auszuführen, aber ich habe Probleme beim Verständnis, wie man wieder speichern, um einen Wert python, die durch eine zurückgeführt wird JS-Funktion.
Ein komplettes Beispiel ist hier verfügbar:
Die folgende PyQt5 Code Last eine HTML-Seite (pyqtwebtest.html
) mit einem leaflet.js
Karte Widget in einem PyQt4 Hauptfenster und fügen Sie eine Schaltfläche, um einen JS-Code, mit dem Ziel auszuführen, um die zu speichern Rückgabewert innerhalb einer Python variable ...
#!/usr/local/bin/python36
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
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):
self.browser = QWebEngineView()
self.browser.load(QUrl('file:///Users/epi/pyqtwebtest.html'))
def __layout(self):
self.vbox = QVBoxLayout()
self.hBox = QVBoxLayout()
self.getboundsbutton = QPushButton()
self.hBox.addWidget(self.browser)
self.hBox.addWidget(self.getboundsbutton)
self.vbox.addLayout(self.hBox)
self.setLayout(self.vbox)
self.getboundsbutton.clicked.connect(self.getBounds)
def getBounds(self):
self.bounds = self.browser.page().runJavaScript("[map.getBounds().getSouthWest().lat, map.getBounds().getSouthWest().lng, map.getBounds().getNorthEast().lat, map.getBounds().getNorthEast().lng]")
print(self.bounds)
# this is where I get stuck .. the result is None
# the same js code in the html file prints the bounds values
# that I want to store on the python side of the app
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
app.exec_()
if __name__ == '__main__':
sys.exit(main())
die die folgende HTML-Seite zu laden:
<!DOCTYPE html>
<html>
<head>
<title>PyQtLeaflet</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
<style>
#map {
width: 600px;
height: 400px;
}
</style>
</head>
<body>
<div id='map'></div>
<script>
var mbAttr = 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="http://mapbox.com">Mapbox</a>',
mbUrl = 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw';
var grayscale = L.tileLayer(mbUrl, {id: 'mapbox.light', attribution: mbAttr}),
streets = L.tileLayer(mbUrl, {id: 'mapbox.streets', attribution: mbAttr});
var map = L.map('map', {
center: [10, 10],
zoom: 10,
layers: [grayscale]
});
var baseLayers = {
"Grayscale": grayscale,
"Streets": streets
};
L.control.layers(baseLayers).addTo(map);
// this is the "bounds" variable which I am trying to get from pyqt
bounds = [map.getBounds().getSouthWest().lat, map.getBounds().getSouthWest().lng, map.getBounds().getNorthEast().lat, map.getBounds().getNorthEast().lng]
console.log(bounds)
</script>
</body>
</html>
Ich verstehe, dass diese Frage ein duplicate in Betracht gezogen werden kann, aber ich hatte Schwierigkeiten in die exakt gleichen Methoden für eine neuere Version von pyqt5 finden (> = 5,7)
Danke 'The Compiler' und danke' Avaris' auf freenode #PyQt. Ich denke ich habe es. Aktualisierter Code ist verfügbar unter: https://gist.github.com/a1152047086def509906fa71a9eb11ad Ich fügte ein einfaches linedit hinzu, um die Ergebnisse von JS und eine Druckanweisung zu speichern. – user1013346