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
相关产品推荐
相关产品推荐

