title: Return value from javascript to pyqt5
body: <p>I'm trying to load and query a JS map widget from inside a PyQt5 application. I'm able to use the method:</p>
  
  <p><code>PyQt5.QtWebEngineWidgets.QWebEngineView().page().runJavaScript()</code></p>
  
  <p>to execute JS function from the webpage loaded in a <code>QWebEngineView()</code> but I'm having troubles in understanding how to store back to python a value which is returned by a JS function.</p>
  
  <p>A complete example is available here:</p>
  
  <p>The following PyQt5 code load an html page (<code>pyqtwebtest.html</code>) with a <code>leaflet.js</code> map widget inside a PyQt4 mainwindow and add a button to execute a JS code with the aim to store the returned value inside a python variable ... </p>
  
  <pre><code>#!/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())
  </code></pre>
  
  <p>which load the following html page:</p>
  
  <pre><code>&lt;!DOCTYPE html&gt;
  &lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;PyQtLeaflet&lt;/title&gt;
      &lt;meta charset="utf-8" /&gt;
      &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
      &lt;link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" /&gt;
      &lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.2/dist/leaflet.css" /&gt;
      &lt;script src="https://unpkg.com/leaflet@1.0.2/dist/leaflet.js"&gt;&lt;/script&gt;
      &lt;style&gt;
          #map {
              width: 600px;
              height: 400px;
          }
      &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;div id='map'&gt;&lt;/div&gt;
  &lt;script&gt;
      var mbAttr = 'Map data &amp;copy; &lt;a href="http://openstreetmap.org"&gt;OpenStreetMap&lt;/a&gt; contributors, ' +
              '&lt;a href="http://creativecommons.org/licenses/by-sa/2.0/"&gt;CC-BY-SA&lt;/a&gt;, ' +
              'Imagery © &lt;a href="http://mapbox.com"&gt;Mapbox&lt;/a&gt;',
          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)
  &lt;/script&gt;
  &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p>I understand that this question may be considered a <a href="https://stackoverflow.com/questions/14208166/how-to-put-result-of-javascript-function-into-python-variable-pyqt" title="How to put result of JavaScript function into python variable. PyQt">duplicate</a> but I had difficulties in finding the exact same methods for a recent version of pyqt5 (>=5.7)</p>