如何在Dash中将动态创建的DataTable数据传入回调函数?
动态生成Dash DataTable的多表数据获取方案
问题背景
已通过以下代码动态生成5个可编辑的Dash DataTable:
@app.callback(Output(component_id="my-tables-out", component_property="children")) def update_output_div(): params = ["A", "B"] num_tables = 5 result = [] for i in range(5): table = dash_table.DataTable( id=f"table-{i}", columns=([{"id": p, "name": p} for p in params]), # type: ignore data=[ dict(**{param: None for param in params}) # type: ignore for i in range(num_species) ], editable=True, ) result.append(table) return result
需要实现回调函数获取所有动态表的data数据,但不确定多动态表场景下Input的component_id如何指定,原尝试的回调框架如下:
@app.callback( Output("data", "children"), Input(component_id="table_<i>", component_property="data") ) def display_output(rows, columns): pass
解决方案
方法1:显式声明所有动态表的Input
已知动态生成的表ID为table-0到table-4,可直接将每个表的data属性作为回调Input:
from dash import Input, Output, callback @app.callback( Output("data", "children"), [Input(f"table-{i}", "data") for i in range(5)] ) def display_output(*all_table_data): # all_table_data为元组,依次对应table-0到table-4的data数据 table_data_dict = {f"table-{i}": data for i, data in enumerate(all_table_data)} # 可根据需求处理数据,比如转为字符串展示 return str(table_data_dict)
该方法适合已知动态表数量的场景,代码直观,但表数量变化时需手动修改Input列表。
方法2:使用Pattern-Matching Callbacks(推荐)
若动态表数量不确定或后续可能变化,使用Dash模式匹配回调更灵活,需先修改动态表的ID格式,再用通配符匹配:
第一步:修改动态生成表的ID
@app.callback(Output(component_id="my-tables-out", component_property="children")) def update_output_div(): params = ["A", "B"] num_tables = 5 result = [] for i in range(5): table = dash_table.DataTable( id={"type": "dynamic-table", "index": i}, # 改为字典格式ID columns=([{"id": p, "name": p} for p in params]), data=[ dict(**{param: None for param in params}) for _ in range(num_species) # 修复原代码变量名冲突问题 ], editable=True, ) result.append(table) return result
第二步:编写模式匹配回调
from dash import Input, Output, callback, ALL @app.callback( Output("data", "children"), Input({"type": "dynamic-table", "index": ALL}, "data") ) def display_output(all_table_data): # all_table_data为列表,元素顺序对应index从小到大的表数据 table_data_dict = {f"table-{i}": data for i, data in enumerate(all_table_data)} return str(table_data_dict)
该方法无需关注具体表数量,所有type为dynamic-table的表都会被自动匹配,扩展性更强。
内容的提问来源于stack exchange,提问作者shmsi
相关产品推荐
相关产品推荐

