Python中Dash回调函数(selected_columns)未触发原因咨询
问题原因及解决方案
核心问题1:回调函数未返回对应输出值
你的dummy回调函数定义了输出目标是datatable-interactivity的style_data_conditional属性,但函数内部仅做了打印操作,没有返回任何符合该属性要求的数据。Dash的回调机制要求每个Output必须有对应的返回值,否则会触发内部错误,导致后续的回调触发被阻断。
核心问题2:页面切换时重复创建组件,导致回调绑定失效
render_page_content回调在每次路由切换时,都会返回预先定义好的children1,这相当于在页面中重新渲染了一个全新的datatable-interactivity表格组件。初始的回调绑定的是第一次加载时的表格实例,新创建的表格并未和dummy回调建立关联,所以点击新表格的复选框自然不会触发回调。
修复步骤
1. 给dummy回调添加返回值
根据你注释掉的代码逻辑,返回符合要求的样式条件列表,修改后的回调如下:
@app.callback( Output('datatable-interactivity', 'style_data_conditional'), Input('datatable-interactivity', 'selected_columns') ) def dummy(selected_columns): print("aaaa") print(selected_columns) # 返回样式条件,空列表也需返回以满足Dash要求 return [{ 'if': { 'column_id': i }, 'background_color': '#D2F3FF' } for i in selected_columns]
2. 避免重复创建组件,复用同一实例
不要直接返回整个children1,而是复用同一个表格组件实例,确保回调绑定始终有效:
# 单独定义表格组件,后续复用该实例 datatable_component = dash_table.DataTable( id='datatable-interactivity', columns=[ {"name": i, "id": i, "deletable": True, "selectable": True} for i in df.columns ], data=df.to_dict('records'), editable=True, filter_action="native", sort_action="native", sort_mode="multi", column_selectable="single", row_selectable="multi", row_deletable=True, selected_columns=[], selected_rows=[], page_action="native", page_current= 0, page_size= 10, ) # 定义页面内容时复用表格组件 children1 = [html.H1('Kindergarten in Iran', style={'textAlign':'center'}), dcc.Graph(id='bargraph', figure=fig1), datatable_component] # 路由回调中同样复用该表格实例 def render_page_content(pathname): if pathname in ["/", "/page-1", "/page-2"]: return [html.H1('Kindergarten in Iran', style={'textAlign':'center'}), dcc.Graph(id='bargraph', figure=fig1), datatable_component] # 404提示部分保持不变 return dbc.Jumbotron( [ html.H1("404: Not found", className="text-danger"), html.Hr(), html.P(f"The pathname {pathname} was not recognised..."), ] )
内容的提问来源于stack exchange,提问作者olli
相关产品推荐
相关产品推荐

