You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中读取PyQt5 QWebEngine内JavaScript返回的Plotly点击点位数据

PyQt5 QWebEngine中Plotly点击数据回传到Python的实现方案

你可以通过Qt提供的QWebChannel实现JavaScript和Python的双向通信,具体实现步骤如下:


1. 导入依赖模块

首先引入通信需要的Qt核心模块:

from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtWebChannel import QWebChannel

2. 定义JS-Python桥接类

创建继承自QObject的桥接类,通过pyqtSlot装饰器暴露可被JavaScript调用的Python方法:

class PlotlyBridge(QObject):
    # 接收x、y浮点坐标的槽函数
    @pyqtSlot(float, float)
    def handle_click(self, x, y):
        # 此处可直接处理接收到的数据,或存入属性供其他逻辑调用
        print(f"获取到点击坐标:x={x}, y={y}")
        self.last_click_point = {"x": x, "y": y}

    # 如果需要接收完整点位信息,可新增接收JSON字符串的槽函数
    @pyqtSlot(str)
    def handle_full_click(self, point_json):
        import json
        point_data = json.loads(point_json)
        print(f"完整点位信息:{point_data}")

3. 注册桥接对象到Web视图

在初始化QWebEngineView的逻辑中添加通信通道注册代码:

self.browser = QtWebEngineWidgets.QWebEngineView(self)
vbox.addWidget(self.browser)
vbox.setSpacing(0)
vbox.setContentsMargins(0, 0, 0, 0) 

# 新增通信通道配置
self.plotly_bridge = PlotlyBridge()
web_channel = QWebChannel()
web_channel.registerObject("plotlyBridge", self.plotly_bridge)
self.browser.page().setWebChannel(web_channel)

self.show_graph(input_dict)

4. 修改Plotly注入的JS逻辑

把原来的alert弹窗替换为桥接方法调用,修改show_graph方法的post_script参数:

def show_graph(self, input_dict):
    # 原有绘图逻辑保持不变
    ...
    fig = go.FigureWidget(fig.to_dict()) 
    # 替换为通信逻辑的JS代码
    custom_post_script = """
    new QWebChannel(qt.webChannelTransport, function(channel) {
        // 绑定Python端暴露的桥接对象
        window.plotlyBridge = channel.objects.plotlyBridge;
        // 绑定Plotly点击事件
        document.getElementsByClassName('plotly-graph-div')[0].on('plotly_click', function(data){
            const point = data.points[0];
            // 传基础x、y坐标
            plotlyBridge.handle_click(point.x, point.y);
            // 若需要传完整点位信息可使用下行代码
            // plotlyBridge.handle_full_click(JSON.stringify(point));
        });
    });
    """
    self.browser.setHtml(fig.to_html(include_plotlyjs='cdn', post_script=custom_post_script))

内容的提问来源于stack exchange,提问作者Davide Serafini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:01