Bokeh中MultiChoice控件控制DataTable列可见性失效问题
问题排查与修复
核心问题分析
- JavaScript语法错误:原回调代码使用了Python风格的大写
True,但JavaScript的布尔值是小写的true,直接导致回调执行失败,无任何响应。 - 选项与列字段不匹配:MultiChoice的
options设置为df.columns[2:-1],但DataTable的列是Li、Be,如果这两个列不在df.columns[2:-1]范围内,选择时根本找不到匹配的列,自然不会触发显示。 - 逻辑不完整:仅处理选中列的显示,未处理取消选择时的隐藏逻辑,导致列一旦显示就无法隐藏。
修复后的完整代码
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
相关产品推荐
相关产品推荐

