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

Bokeh使用TapTool触发跨图表回调时出现generator无callback属性报错求助

问题原因与修复方案

报错根因

你触发报错的代码存在两处核心逻辑错误:

  • wP.select(tap)写法完全错误:select()是Bokeh模型的查找方法,返回符合条件的对象生成器,自然没有callback属性;同时你自定义的TapTool是属于左侧点位图p1的工具,根本不存在于柱状图字形wP的子对象中,查找逻辑完全不成立。
  • 回调绑定对象错误:TapTool的选中回调应该绑定到TapTool实例本身,而非柱状图的字形对象。

其他需要修复的兼容问题

  • 直接把Python的Numpy数组传入CustomJS会导致JS无法识别,需要提前转为普通Python列表
  • 自定义的TapTool需要手动添加到点位图p1的工具列表中生效,建议同时删除p1初始化参数里的默认tap工具避免冲突

修正后的代码片段

替换你原代码末尾的code定义、TapTool创建和绑定部分即可:

# 提前把numpy数组转为JS可识别的普通列表
yCol_js = [arr.tolist() for arr in yCol]

code = '''if (cb_data.source.selected.indices.length == 1){
            const selected_index = cb_data.source.selected.indices[0];
            // 直接操作柱状图的数据源即可
            vbar_source.data['y'] = yCol[selected_index]
            vbar_source.change.emit(); 
          }'''

# 创建自定义TapTool并绑定回调
tap = TapTool(renderers=[t2], behavior='select')
tap.callback = CustomJS(
    args = {'vbar_source': wP.data_source, 'yCol': yCol_js}, 
    code = code
)

# 把自定义TapTool添加到点位图中生效
p1.add_tools(tap)

另外建议修改p1初始化的tools参数,删除其中的默认tap工具,避免多个TapTool冲突:

# 把原来的tools参数里的tap删掉即可
p1 = figure(..., tools = 'pan, wheel_zoom, box_zoom, reset, save', ...)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:09:02