我有一个相当复杂的 Dash 应用程序,其中根据某些输入显示不同的布局。这些输出布局(在回调中创建)包含一些输入。
由于这些输入尚未在布局中定义,因此出现错误“在 Dash 回调的
Input
中使用了不存在的对象。”
除了使用 CSS 样式“可见性”使它们存在于 HTML 代码中,但对用户来说不可见之外,现在还有其他方法可以消除此错误吗?
我尝试在创建应用程序时添加
suppress_callback_exceptions=True
,但它不起作用。
达世币版本:2.9.3
from dash import dcc, Dash, html, Input, Output, callback
app = Dash(__name__, suppress_callback_exceptions=True)
app.layout = html.Div(
children=[
dcc.Store(id="store_filters", storage_type="memory"),
dcc.RadioItems(
id="choice_filters",
options=["filters1", "filters2", "filters3"],
value="filters1",
inline=True,
),
html.Div(id="filters"),
]
)
@callback(Output("filters", "children"), Input("choice_filters", "value"))
def update_filters(choice_filters):
if choice_filters == "filters1":
layout = [dcc.Input(id="input1", type="text")]
elif choice_filters == "filters2":
layout = [dcc.Input(id="input2", type="text")]
elif choice_filters == "filters3":
layout = [dcc.Input(id="input3", type="text")]
else:
layout = []
return layout
@callback(
Output("store_filters", "data"), [Input("input1", "value"), Input("input2", "value"), Input("input3", "value")]
)
def filters_result(input1, input2, input3):
filters = {"filter1": input1, "filter2": input2, "filter3": input3}
print("Last filters entered : ")
print(filters)
return filters
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=8222)
我相信这种动态过滤是由模式匹配回调处理的。想法是这样的:
@callback(
Output('filters', 'children'),
Input('choice_filters', 'value'))
def update_filters(choice_filters):
filter_input = dcc.Input(
id={'type': 'filter', 'name': choice_filters},
type='text')
return [filter_input]
# from dash import ALL
@callback(
Output('store_filters', 'data'),
Input({'type': 'filter', 'name': ALL}, 'value'),
State({'type': 'filter', 'name': ALL}, 'id'),
prevent_initial_call=True)
def filters_result(filter_values, filter_ids):
filters = {id_value[0]['name']: id_value[1] for id_value in
zip(filter_ids, filter_values)}
print(f"Last filters entered : {filters}")
return filters