Plotly FigureWidget中go.Image对象on_click点击事件未触发
问题根因
go.Image的on_click事件未触发,由以下几个问题共同导致:
- 未开启Figure的点击事件模式:Plotly FigureWidget默认不对
go.Image类型的图层派发点击事件,必须手动在layout中设置clickmode为event或event+select才会触发回调。 - 回调函数参数不匹配:
on_click绑定的回调函数固定接收3个参数:图层trace对象、点击命中的点数据、选择器状态,仅定义1个参数会导致事件触发时抛出静默错误,Jupyter前端不会直接展示该报错。 - 代码存在笔误与格式问题:
- 定义的base64编码函数名为
image_to_jpeg_b64,调用时误写为不存在的image_jpeg_b64变量 - 实际编码的是JPEG格式图像,source的MIME类型却写为
image/png,虽部分浏览器可兼容解析,但不符合规范。
- 定义的base64编码函数名为
修正后可运行代码
import plotly.graph_objects as go import numpy as np import base64 import cv2 def image_to_jpeg(frame, to_bgr=True) -> bytes: frame = frame if not to_bgr else cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) _, jpeg = cv2.imencode(".jpeg", frame) return jpeg.tobytes() def image_to_jpeg_b64(frame, to_bgr=True) -> str: return base64.b64encode(image_to_jpeg(frame, to_bgr=to_bgr)).decode("utf-8") # 替换为实际的图像读取逻辑,示例用随机生成的RGB图测试 test_frame = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8) image_b64_str = image_to_jpeg_b64(test_frame) # 修正MIME类型匹配JPEG格式 go_image = go.Image(source=f"data:image/jpeg;base64,{image_b64_str}") # 修正回调函数参数签名 def on_image_click(trace, points, state): print("点击事件触发,命中点信息:", points.point_inds) if points.xs: print(f"点击像素坐标 X: {points.xs[0]}, Y: {points.ys[0]}") go_image.on_click(on_image_click) f = go.FigureWidget( [go_image], # 关键配置:开启点击事件派发 layout=go.Layout(clickmode="event") ) f # Jupyter单元格中直接输出即可交互
补充说明
- 回调中
points参数的xs、ys属性对应点击位置的图像像素坐标,可直接用于选点标注、交互取值等逻辑。 - 如果需要同时支持框选交互,将
clickmode改为event+select即可,额外绑定on_selection事件可获取框选的坐标范围。 - 运行前需确认Plotly版本≥4.0,且Jupyter环境已正确安装
plotlywidget扩展,否则FigureWidget的所有交互事件都会失效。

内容的提问来源于stack exchange,提问作者ntakouris
相关产品推荐
相关产品推荐

