Ich versuche, eine Anwendung zu erstellen, die einige html + js
-Code mit Python erstellt und lädt es in einem QWebView.Get js console.log als Python-Variable in QWebView pyqt
Der letzte html + js
Code ist der folgende (Roh-Code verfügbar here):
<head><meta charset="utf-8" /><script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head><div id="myDiv" style="height: 100%; width: 100%;" class="plotly-graph-div"></div><script type="text/javascript">window.PLOTLYENV=window.PLOTLYENV || {};window.PLOTLYENV.BASE_URL="https://plot.ly";Plotly.newPlot("myDiv", [{"type": "scatter", "x": [6.81, 6.78, 6.49, 6.72, 6.88, 7.68, 7.69, 7.38, 6.76, 6.84, 6.91, 6.74, 6.77, 6.73, 6.68, 6.94, 6.72], "y": [1046.67, 1315.0, 1418.0, 997.33, 2972.3, 9700.0, 6726.0, 6002.5, 2096.0, 2470.0, 867.0, 2201.7, 1685.6, 2416.7, 1618.3, 2410.0, 2962.0], "mode": "markers", "ids": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}], {"showlegend": true}, {"linkText": "Export to plot.ly", "showLink": false})</script>
<script>
var plotly_div = document.getElementById('myDiv')
var plotly_data = plotly_div.data
plotly_div.on('plotly_selected', function(data){
featureId = plotly_data[0].ids[data.points[0].pointNumber]
featureIds = []
data.points.forEach(function(pt) {
featureIds.push(parseInt(pt.id))
})
console.log(featureIds)
})
</script>
Dieser Code erstellt eine grafische Darstellung dank plotly
Python-API. Durch das Speichern der Handlung in einer lokalen Datei (zB /home/matteo/plot.html
) Ich bin in der Lage es in der QWebView mit der folgenden Code zu laden:
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtWebKitWidgets import *
from PyQt5.QtCore import QUrl
import json
plot_view = QWebView()
plot_view.page().setNetworkAccessManager(QgsNetworkAccessManager.instance())
plot_view_settings = plot_view.settings()
plot_view_settings.setAttribute(QWebSettings.WebGLEnabled, True)
plot_view_settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
plot_view_settings.setAttribute(QWebSettings.Accelerated2dCanvasEnabled, True)
plot_path = '/home/matteo/plot.html'
plot_url = QUrl.fromLocalFile(plot_path)
plot_view.load(plot_url)
plot_view.show()
Die Javascript-Funktion von oben einfach die IDs der ausgewählten Punkte Rückkehr von die Handlung in der Javascript-Konsole, wenn das lasso selection
Werkzeug der Handlung verwendet.
Mit dem Tool inspect
überprüfen, funktioniert es auch in der QWebView: Jedes Mal, wenn ein Element innerhalb der Auswahl ist, in der console.log kann ich die entsprechende ID des Punktes sehen.
Dies ist ein statisches Bild aus jsfiddle genommen (Lasso-Auswahl, Punkt ausgewählt und console.log Ausgang):
der Laufcode ist here verfügbar, nur die Debugging-Konsole aktiviert und einen Punkt wählen mit dem Lasso-Auswahlwerkzeug.
Was ich wirklich erreichen möchte, ist die Ausgabe der Konsole (also die Ids der ausgewählten Punkte), und injizieren sie in die Anwendung, um ein verwendbares Python-Objekt (Liste, Wörterbuch (was auch immer) jedes Mal wenn ich eine Auswahl mache.
Gibt es eine Möglichkeit, die JavaScript-Konsole von QWebPage zu verknüpfen, um Python-Objekte zu erhalten?
Vielen Dank für die Antwort. Ich habe dich benutzt und es funktioniert. Allerdings kann ich die Ausgabe nicht in einer Variablen speichern *, die ich in einem zweiten Moment verwenden kann. Bearbeiten Sie Ihren Code, indem Sie '' obj = [] '' direkt vor '' javaScriptConsoleMessage'' hinzufügen und dann versuchen, das Objekt '' retunr self.obj'' zurückzugeben. Ich bekomme immer den gleichen Fehler: 'TypeError: ungültiges Ergebnis von _LoggedPage .javaScriptConsoleMessage() '. Fehle ich etwas? Danke noch einmal! – matteo
perfekt! Vielen Dank! – matteo