【发布时间】:2022-01-01 19:12:02
【问题描述】:
我正在尝试创建一个 Dash 示例,该示例可以通过使用此处的文档来利用实时更新:https://dash.plotly.com/live-updates
在代码中有一个关键部分可以让 app.call back 知道输入和输出是什么:
@app.callback(Output('live-update-text', 'children'),
Input('interval-component', 'n_intervals')
这适用于一个组件,但是如果说我有五个不同的数据集要更新(都使用相同的逻辑),那么我自然希望像函数参数一样动态传递 @app.callback .即,理想情况下,如果我有 5 个输出,我可以这样做:
@app.callback(Output('live-update-text-MyParam', 'children'),
Input('interval-component', 'n_intervals')
然后我可以使用 myParam = 1/2/3/4/5 来调用它。
有可能吗?
UPDATE 20220105:根据@coralvanda 和@EricLavault 的建议,这是我的想法:
def updateGraphsAndData(output, input):
@app.callback([output['text'],
output['graph']],
[input['n_intervals'],input['name']])
def updateGraphAndMetricForEach(n, name):
return update_metrics(name), update_graph_live(name)
for param in lstParams:
updateGraphsAndData(output={'text':Output(f'live-update-text-{param}','children'),'graph':Output(f'live-update-graph-{param}','figure')},
input={'n_intervals':Input(f'interval-component-{param}','n_intervals'),'name':Input(param, 'value')})
我正在尝试一次性更新图形和文本,update_metrics 是更新文本部分(返回 html.Span() 和 .Br()s 的列表),而 update_graph_live 返回一个 go.Figure对象)。
但是,当我运行此页面时,该页面不会返回任何要更新的图表或文本,并单击右下角的“回调”,我看到子项指向 null(即使我可以看到它是作为 'live-update-text-PARAM' 传入,我可以确认 update_metrics 以获取有效的名称输入)。
我还有什么遗漏的地方吗?
UPDATE 20220106:app.layout 代码的一部分:
dbc.Col([
html.Div(id=f'live-update-text-{param1}'),
dcc.Graph(id=f'live-update-graph-{param1}'),
dcc.Interval(
id=f'interval-component-{param1}',
interval=2*1000, # in milliseconds
n_intervals=0
),
html.Hr(),
], width={'size': 4, 'offset': 0, 'order': 1}),
然后对 param1/param2/param3/param4/param5 重复此操作
【问题讨论】:
-
查看this answer,这可能就是您想要的。
-
为什么不直接有 5 个输出?或者,如果要动态更改组件的数量,您可以使用包含所有“live-update-text-X”组件的包装器,并使用单个输出来更新包装器的子级。
-
谢谢@EricLavault,我认为你的回答在那里提出了一条很好的道路,所以基本上你的意思是在
@app.callback我可以做类似的事情:@app.callback(Output('live-update-text-1', 'children'),Output('live-update-text-2', 'children'),Output('live-update-text-3', 'children'),Output('live-update-text-4', 'children'),Output('live-update-text-5', 'children'), Input('interval-component', 'n_intervals')?这是我不知道的。 -
我对包含所有 live-update-text-X 的包装器有点困惑,你的意思是我们可以在输出中返回一个列表并以某种方式解析
app.layout部分中的列表代码? -
啊,没关系,我在@coralvanda 提供的链接上阅读了一些内容,我认为这可能是您的建议:stackoverflow.com/a/63255593/1528840,非常感谢,我想现在我可以弄清楚了: )
标签: python plotly-dash