在单页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_...
函数中?
答案 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中