如何在单击 Python Dash 的按钮上添加单独的 Html 元素

How to add separate Html elements on a button click on Python Dash

我正在尝试使用 Python 破折号来实现一个非常简单的场景。在每个按钮上添加相似的元素一个接一个地点击。

下面是代码。

app.layout = {
  html.Button(id='add-element-button', n_clicks=0, children='Add Input Element'),
  html.Div(id="layout")
}

@app.callback(Output('layout', 'children'),
              [Input('add-element-button', 'n_clicks')])
def add_strategy_divison(val):
    if val:
        return html.Div(id=f"heading_element_{val}",
            [
                html.H1(id=f"heading_{val}", children=f"{val} Heading"),
            ]
            )
    else:
        raise PreventUpdate

似乎正在发生的事情不是添加新元素,而是用新元素和新 ID 覆盖第一个标题元素(第一次点击时成功创建)。

有人知道会发生什么吗?谢谢!

您描述的行为非常有道理。您 return 一个新的 div-element,这意味着您覆盖了 layout 元素的 children 属性。这样您将始终替换现有的 children。

要使其按您希望的方式工作,您需要获取 layout 元素的当前 children 并将新元素添加到其中。将当前 children 作为 State object 传递给您的回调。现在将您的元素附加到 children 和 return 列表中。

@app.callback(
    Output('layout', 'children'),
    [Input('add-element-button', 'n_clicks')],
    [State('layout', 'children')],
)
def add_strategy_divison(val, children):
    if val:
        el = html.Div(id=f"heading_element_{val}", [
            html.H1(id=f"heading_{val}", children=f"{val} Heading"),
        ])
        children.append(el)
        return children
    else:
        raise PreventUpdate