2017-01-21 2 views
4

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 &copy; <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)

Antwort

4

runJavaScript in QtWebEngine asynchron arbeitet, so dass es nie einen Wert zurückgibt - statt , übergeben Sie einen Rückruf (dh eine Python-Funktion), die mit dem Javascript-Wert aufgerufen wird. In Ihrem Beispiel könnten Sie als zweites Argument einfach print übergeben.

+0

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

Verwandte Themen