Javascript 在QWebView pyqt中将js console.log作为python变量获取

Javascript 在QWebView pyqt中将js console.log作为python变量获取,javascript,python,pyqt,plotly,qwebview,Javascript,Python,Pyqt,Plotly,Qwebview,我试图构建一个应用程序,用python创建一些html+js代码,并将其加载到QWebView中 最后的html+js代码如下(原始代码可用): 当使用绘图的lasso selection工具时,上面的javascript函数仅在javascript控制台中返回绘图的选定点的ID 通过使用inspect工具进行检查,它在QWebView中也可以正常工作:每次元素位于选择范围内时,我都可以在console.log中看到点的相应id 这是从JSFIDLE(套索选择、点选择和console.log输出

我试图构建一个应用程序,用python创建一些
html+js
代码,并将其加载到QWebView中

最后的
html+js
代码如下(原始代码可用):

当使用绘图的
lasso selection
工具时,上面的javascript函数仅在javascript控制台中返回绘图的选定点的ID

通过使用
inspect
工具进行检查,它在QWebView中也可以正常工作:每次元素位于选择范围内时,我都可以在console.log中看到点的相应id

这是从JSFIDLE(套索选择、点选择和console.log输出)获取的静态图像:

运行代码可用,只需启用调试控制台并使用lasso选择工具选择某个点

我真正想要实现的是获取控制台的输出(因此是所选点的ID),并将它们重新注入到应用程序中,以便在每次进行选择时都有一个可用的python对象(列表、字典等)


是否有方法链接QWebPage的javascript控制台以获取python对象?

要获取
控制台.log()
输出,只需覆盖该方法

另外:我添加了两种访问点列表的方法,第一种是通过属性obj,第二种是通过信号

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))
完整示例:

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_())

非常感谢你的回答。我用你的代码,它的工作。但是,我无法将输出存储在一个可以在瞬间使用的变量中。通过在
javaScriptConsoleMessage
之前添加
obj=[]
来编辑代码,然后尝试返回对象
retunr self.obj
我总是得到相同的错误:
TypeError:LoggedPage.javaScriptConsoleMessage()的无效结果
。我错过什么了吗?再次感谢!完美的谢谢
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))
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_())