Get js console.log as python variable in QWebView pyqt
我正在尝试构建一个使用python创建
最终的
1 2 3 4 5 6 7 8 9 10 11 12 | <head><meta charset="utf-8" /><script src="https://cdn.plot.ly/plotly-latest.min.js"></head><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}) 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) }) |
由于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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() |
当使用图的
使用
这是从jsfiddle中获取的静态图像(套索选择,点选择和console.log输出):
您可以在此处找到正在运行的代码,只需启用调试控制台并使用套索选择工具选择某个点即可。
我真正想要实现的是获取控制台的输出(即选定点的ID),然后将它们重新注入到应用程序中,以便每个都有一个可用的python对象(列表,字典等)。我选择的时间。
有没有一种方法可以链接QWebPage的JavaScript控制台以获得python对象?
要获取
另外:我添加了两种访问点列表的方法,第一种是通过属性obj,第二种是通过信号。
1 2 3 4 5 6 7 8 | class _LoggedPage(QWebPage): obj = [] # synchronous newData = pyqtSignal(list) #asynchronous def javaScriptConsoleMessage(self, msg, line, source): l = msg.split(",") self.obj = l self.newData.emit(l) print ('JS: %s line %d: %s' % (source, line, msg)) |
完整的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class _LoggedPage(QWebPage): obj = [] # synchronous newData = pyqtSignal(list) #asynchronous def javaScriptConsoleMessage(self, msg, line, source): l = msg.split(",") self.obj = l self.newData.emit(l) print ('JS: %s line %d: %s' % (source, line, msg)) def onNewData(data): print("asynchronous", data) app = QApplication(sys.argv) plot_view = QWebView() page = _LoggedPage() page.newData.connect(onNewData) plot_view.setPage(page) plot_path = '/home/qhipa/plot.html' plot_url = QUrl.fromLocalFile(plot_path) plot_view.load(plot_url) 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) # synchronous request simulation timer = QTimer(plot_view) timer.timeout.connect(lambda: print("synchronous", page.obj)) timer.start(1000) plot_view.show() sys.exit(app.exec_()) |