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

如何基于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)

核心思路:

  1. 第一个Callback监听type-picker的选中值,根据选中类型从data_dict取出对应列表,转换成Dropdown要求的格式后更新下拉选项。
  2. 第二个可选Callback用于在选项更新时自动选中所有内容,若不需要默认选中可直接删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:55:34