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

Bokeh中MultiChoice控件控制DataTable列可见性失效问题

问题排查与修复

核心问题分析

  1. JavaScript语法错误:原回调代码使用了Python风格的大写True,但JavaScript的布尔值是小写的true,直接导致回调执行失败,无任何响应。
  2. 选项与列字段不匹配:MultiChoice的options设置为df.columns[2:-1],但DataTable的列是Li、Be,如果这两个列不在df.columns[2:-1]范围内,选择时根本找不到匹配的列,自然不会触发显示。
  3. 逻辑不完整:仅处理选中列的显示,未处理取消选择时的隐藏逻辑,导致列一旦显示就无法隐藏。

修复后的完整代码

filtered_table_data = df[["Li","Be"]]

filtered_table_source = ColumnDataSource(data=filtered_table_data)

filtered_table_cols = []
filtered_table_cols.append(TableColumn(field='Li', title='Li', width=750, visible=False))
filtered_table_cols.append(TableColumn(field='Be', title='Be', width=750, visible=False))
 
filtered_table = DataTable(source=filtered_table_source, columns=filtered_table_cols)

# 确保options包含DataTable列对应的field值,可根据df实际列调整
multi_choice = MultiChoice(value=[], options=["Li", "Be"], title='Select elements:')

callback2 = CustomJS(args=dict(multi_choice=multi_choice, filtered_table=filtered_table), code="""
    // 先隐藏所有列
    for (var i=0; i < filtered_table.columns.length; i++) {
        filtered_table.columns[i].visible = false;
    }
    // 遍历选中项,显示对应列
    for (var j=0; j < multi_choice.value.length; j++) {
        var selectedField = multi_choice.value[j];
        for (var i=0; i < filtered_table.columns.length; i++) {
            if (filtered_table.columns[i].field === selectedField) {
                filtered_table.columns[i].visible = true;
            }
        }
    }
    filtered_table.change.emit()                
""")

multi_choice.js_on_change("value", callback2)

关键修改说明

  • 修正JavaScript布尔值写法:将True改为true,确保回调代码能正常执行。
  • 匹配选项与列字段:调整MultiChoice的options,使其包含DataTable列对应的field值,保证选择时能找到对应列。
  • 完善显示逻辑:先统一隐藏所有列,再根据选中项显示对应列,解决取消选择时列无法隐藏的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:33:26