如何在Dash / Plotly应用中自动为多个图形添加回调

时间:2019-01-23 02:45:14

标签: python dashboard python-decorators plotly-dash

在单页Dash by Plotly应用中,我想显示许多相似的图形。

为此,我创建了一个“工厂类”,该类可以生成许多图形。

此类公开了Dash应用程序的app.layout@app.callback代码中使用的方法。带有两个图表的示例app.py如下所示:

import ...

app = dash.Dash(__name__)

graph_A = GraphFactory(feature="A")
graph_B = GraphFactory(feature="B")

app.layout = html.Div([
            graph_A.graph(),
            graph_B.graph(),
            ])

@app.callback(
    graph_A.callback_output(), graph_A.callback_inputs()
)
def update_A(value):
    return graph_A.callback_update(value)

@app.callback(
    graph_B.callback_output(), graph_B.callback_inputs()
)
def update_B(value):
    return graph_B.callback_update(value)

这很好。但是,我想显示GraphFactory对象列表中的许多图形。创建对象并将它们放置在应用布局中很容易:

graph_list = [ GraphFactory(feature=f) for f in feature_list ]

app.layout = html.Div([ 
            g.graph() for g in graph_list
            ])

但是**如何添加许多callback_output()callback_inputs()callback_update(value)电话?有没有办法只编写一次装饰器和函数并将调用添加到其中的callback_...函数中?

2 个答案:

答案 0 :(得分:0)

通过深入研究装饰器,我自己找到了一个解决方案:您可以直接在对象的callback_update函数上调用Dash装饰器。因此,对于该问题的示例,您可以编写:

for g in graph_list:
    dash_app.callback(g.callback_output(),
                      g.callback_inputs())(g.callback_update)

请注意,g.callback_update没有(),因为app.callback函数应用于g.callback_update 函数/方法,而不是照常返回其返回值

答案 1 :(得分:0)

万一其他人正在寻找另一种方法,Dash 0.39-Multiple Outputs中引入了一个解决方案。

https://community.plotly.com/t/multiple-outputs-in-dash-now-available/19437

使用Output的列表/元组作为回调中的输出。 从回调返回元组/值列表 返回的列表的长度必须与输出列表的长度相同 输出道具按照它们在输出>列表中声明的顺序应用。

'Applied'=在回调中声明的输出从上到下依次应用在app.layout中