Dash 抑制错误“Dash 回调的‘Input’中使用了不存在的对象”

问题描述 投票:0回答:1

我有一个相当复杂的 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)
plotly-dash
1个回答
0
投票

我相信这种动态过滤是由模式匹配回调处理的。想法是这样的:

添加组件

@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
© www.soinside.com 2019 - 2024. All rights reserved.