如何基于dcc.RadioItems更新Plotly Dash的dcc.Dropdown组件?
问题描述
我编写了如下Plotly Dash代码:
data_type = [‘F’, ‘M’, ‘R’] data_dict = {‘F’: [‘x’, ‘y’], ‘M’:[‘z’, ‘t’], ‘R’: [‘f’, ‘r’] } plot_type = [‘Chi’, ‘AD’, ‘KS’] app = Dash() app.layout = html.Div(id = ‘main-div’, children=[ html.H4(‘Raw data Statistical tests’), html.P(‘Chose data type:’), dcc.RadioItems(data_type, data_type[0], id = ‘type-picker’), html.P(‘Chose data:’), dcc.Dropdown(id = ‘data-picker’, multi = True), html.P(‘Chose R-test type:’), dcc.RadioItems([‘Row’, ‘All’]), html.P(‘Chose plot:’), dcc.RadioItems(plot_type, plot_type[0], id=‘plot-picker’), dcc.Graph(id = ‘plot’) ] ) @app.callback(Output(‘data-picker’,‘value’), [Input(‘type-picker’, ‘value’)]) def data_picker(data_type): return data_dict[data_type] if name ==‘main’: app.run_server(debug=True, use_reloader=False)
我希望dcc.Dropdown菜单能根据上方的dcc.RadioItems选项动态更新,尝试使用@callback函数但未成功,请问有什么可行实现思路?
解决方案
你的代码存在几个关键问题,调整后即可实现动态更新需求:
- 替换中文引号:所有中文单引号
‘’需改为英文单引号'',Python无法识别中文引号,会直接引发语法错误。 - 修正Callback输出目标:当前Callback更新的是Dropdown的
value属性,但动态更新下拉选项应该修改options属性。 - 避免变量名冲突:Callback函数参数名
data_type与全局变量重名,会导致无法正确访问全局的data_dict,建议改为selected_type。 - 修复入口判断语法:启动代码的判断语句应为
if __name__ == '__main__':,缺失下划线会导致代码无法正常运行。 - 适配Dropdown选项格式:
dcc.Dropdown的options需为包含label和value的字典列表,不能直接传入字符串列表。
调整后的完整代码:
from dash import Dash, html, dcc, Input, Output data_type = ['F', 'M', 'R'] data_dict = {'F': ['x', 'y'], 'M':['z', 't'], 'R': ['f', 'r'] } plot_type = ['Chi', 'AD', 'KS'] app = Dash() app.layout = html.Div(id='main-div', children=[ html.H4('Raw data Statistical tests'), html.P('Chose data type:'), dcc.RadioItems(data_type, data_type[0], id='type-picker'), html.P('Chose data:'), dcc.Dropdown(id='data-picker', multi=True), html.P('Chose R-test type:'), dcc.RadioItems(['Row', 'All']), html.P('Chose plot:'), dcc.RadioItems(plot_type, plot_type[0], id='plot-picker'), dcc.Graph(id='plot') ] ) @app.callback( Output('data-picker', 'options'), Input('type-picker', 'value') ) def update_data_dropdown(selected_type): # 转换为Dropdown要求的选项格式 return [{'label': item, 'value': item} for item in data_dict[selected_type]] # 可选:切换类型时自动选中所有选项,不需要可删除此Callback @app.callback( Output('data-picker', 'value'), Input('data-picker', 'options') ) def set_default_value(options): return [opt['value'] for opt in options] if __name__ == '__main__': app.run_server(debug=True, use_reloader=False)
核心思路:
- 第一个Callback监听
type-picker的选中值,根据选中类型从data_dict取出对应列表,转换成Dropdown要求的格式后更新下拉选项。 - 第二个可选Callback用于在选项更新时自动选中所有内容,若不需要默认选中可直接删除。
内容的提问来源于stack exchange,提问作者user20309717
相关产品推荐
相关产品推荐

