Dash:如何更新回调中的数百个元素?

Posted

技术标签:

【中文标题】Dash:如何更新回调中的数百个元素?【英文标题】:Dash: How to update hundreds of elements in callback? 【发布时间】:2020-10-17 18:21:44 【问题描述】:

在我的 Dash 应用程序中,我有多个 html.Div 组件(都具有几乎相同的外观和布局)。现在,当我点击一个复选框时,我想隐藏所有这些元素。 每个人都提出的解决方案是你有多个输出,并分别处理每个 id(见下面的代码)。问题是,我想隐藏大约 50 个这样的 Div,但我没有给它们一个不同的 ID。如果我按照此处代码中的方式进行操作,则必须有很多输出(大约 50 个),并且每次添加新输出时,都必须手动添加。

@app.callback(
    [Output(component_id='div-of-interest-1', component_property='style'),
     Output(component_id='div-of-interest-2', component_property='style'),
     .......]
    [Input(component_id='hide-checkbox', component_property='value')]
)
def hide_div(checked):
    if checked == 'True':
        return 'display': 'none'
    else:
        return 'display': 'block'

那么,有没有聪明的方法来解决这个问题?最简单的方法(但不允许)是为我想要隐藏的所有 div 使用相同的 id。但这在 Dash 中是被禁止的。 Html 中是否有类似的东西,以便我可以一次解决所有感兴趣的元素?

【问题讨论】:

您能否以编程方式生成 Div 组件的列表,以便您可以以编程方式为每个组件分配一个 ID。然后,您也可以通过编程方式为您的回调生成输入列表。 感谢您的回答。不幸的是,在当前架构中这实际上是不可能的。这将需要一些hacky代码才能使其工作。 html中没有“标签”之类的东西吗? 【参考方案1】:

根据 Div 的内容,您可以通过编程方式生成一个 Div 组件列表,以便您可以通过编程方式为每个组件分配一个 id。例如

divs = [html.Div(id=f"div_i" <...> ) for i, x in enumerate(list_of_div_contents)]

这些 html.Div 对象可能都是布局中其他 Div 的子对象:

html.Div(id="div_parent", children=divs)

您的回调可能会将div_parent 的子代设置为None

【讨论】:

以上是关于Dash:如何更新回调中的数百个元素?的主要内容,如果未能解决你的问题,请参考以下文章

Dash Plotly中的烛台图和折线图,它会随着回调而更新,但会消失

优化查询以更新 Oracle 中的数百万数据?

如何使用按钮触发回调更新?

通过回调更新 Dash 数据表

Plotly Dash 回调错误更新输出图

回调错误更新 plot-div.children (Plotly Dash)