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

如何解决Jupyter中Plotly Python的on_click点击事件无效问题?

解决Jupyter Notebook中Plotly on_click事件无响应的问题

你的代码在Jupyter环境下不生效主要有两个核心原因:

  • Jupyter中Plotly默认渲染模式对trace级别的事件支持有限,且事件触发后的输出无法直接在Notebook中显示
  • print(TEST)在fig.show()后立即执行,但fig.show()在Jupyter中是非阻塞的,此时点击事件还未触发,所以输出的是初始值

以下是修正后的代码,同时解决这两个问题:

import plotly
from plotly.subplots import make_subplots
import plotly.graph_objects as go
from ipywidgets import Output

# 创建Output组件,用于捕获事件触发时的输出
out = Output()

fig = make_subplots(1,1)
fig.add_trace(go.Scatter(x=[1,2], y=[1,4]))
scatter = fig.data[0]

TEST = "Was not called"

@out.capture()  # 用Output捕获函数内的输出
def saver(trace, points, selector):
    global TEST
    print('Hello')
    TEST = "Was called"
    # 可以在这里直接打印更新后的TEST值
    print(f"当前TEST值: {TEST}")

scatter.on_click(saver)
# 指定渲染器为notebook,确保交互事件生效
fig.show(renderer="notebook")
# 显示Output组件,这样点击后的print内容会在这里输出
display(out)

# 如果要查看TEST的最终值,不要直接在fig.show()后打印,而是可以在事件触发后手动执行以下代码:
# print(TEST)

关键改动说明:

  • 引入ipywidgets.Output组件:Jupyter中Plotly事件的输出不会直接显示在单元格里,需要通过Output捕获并展示
  • 使用@out.capture()装饰器:让回调函数内的print输出被Output组件捕获
  • 指定renderer="notebook":确保Plotly图在Jupyter Notebook中以支持交互事件的模式渲染
  • 调整print(TEST)的时机:因为fig.show()是非阻塞的,直接在其后打印会得到初始值,建议在回调内打印更新后的值,或者事件触发后手动执行print(TEST)查看

额外注意事项:

  • 确保已安装必要依赖:执行pip install plotly ipywidgets
  • 如果使用JupyterLab,可能需要额外安装扩展:jupyter labextension install @jupyter-widgets/jupyterlab-manager plotlywidget

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:27:37