Dash双输入Callback编写:两个下拉框选择值覆盖更新文本域内容
问题原因
你原有代码的Callback输入输出定义没有问题,缺的是区分触发源的逻辑:Dash的回调只要任意一个Input参数变化就会触发,触发时所有Input的当前值都会同步传入函数,没有额外判断的话无法识别用户最后操作的是哪个下拉列表,自然没法输出最新选中的值。
解决方案
方案1:使用callback_context判断触发源(推荐,Dash 1.13.0及以上版本支持)
通过Dash内置的回调上下文工具直接获取触发本次回调的组件ID,直接返回对应组件的选中值即可:
from dash import callback_context @app.callback( Output(component_id='text_output', component_property='value'), Input(component_id='lista_file_mt', component_property='value'), Input(component_id='lista_file_crt', component_property='value'), prevent_initial_call=True # 可选,避免页面初始化时自动触发回调清空文本域 ) def update_text(mt_val, crt_val): # 提取触发回调的组件ID trigger_id = callback_context.triggered[0]['prop_id'].split('.')[0] # 根据触发组件返回对应选中值 if trigger_id == 'lista_file_mt': return mt_val if mt_val is not None else '' elif trigger_id == 'lista_file_crt': return crt_val if crt_val is not None else '' return ''
方案2:拆分独立回调(写法更简洁,Dash 2.4.0及以上版本支持)
给两个下拉列表分别写独立的回调,同时输出文本域的值,给Output参数添加allow_duplicate=True允许重复输出即可:
# 响应第一个下拉列表的选择 @app.callback( Output('text_output', 'value', allow_duplicate=True), Input('lista_file_mt', 'value'), prevent_initial_call=True ) def update_from_mt(val): return val if val is not None else '' # 响应第二个下拉列表的选择 @app.callback( Output('text_output', 'value', allow_duplicate=True), Input('lista_file_crt', 'value'), prevent_initial_call=True ) def update_from_crt(val): return val if val is not None else ''
内容的提问来源于stack exchange,提问作者Nick9214
相关产品推荐
相关产品推荐

