说我有一个带有20个参数的模型,并且为每个参数制作了一个输入组件。
[dcc.Input(type = 'number', id = 'input %i'%i) for i in range(20)]
我想要一个按钮html.Button('populate parameters', id = 'button populate')
,该按钮应该为所有输入填充最佳的预拟合值。
代码如下所示,除非它不起作用。
for i in range(20):
@app.callback(
dash.dependencies.Output('input %i'%i, 'value'),
[dash.dependencies.Input('button populate', 'n_clicks')]
)
def update(ignore):
return np.random.uniform()
是否必须为具有相同功能的每个输出编写20个回调?我找不到一种可以一口气制作(循环吗?)的方法
答案 0 :(得分:2)
我已经处理了相同的问题,并找到了解决方案。您要做的是绕过装饰器并直接调用app.callback
函数:
def update(ignore):
return np.random.uniform()
for i in range(20):
app.callback(
dash.dependencies.Output('input %i' % i, 'value'),
[dash.dependencies.Input('button populate', 'n_clicks')]
)(update)
答案 1 :(得分:1)
您可以在dash >= 1.11.0中使用Pattern-Matching Callbacks。定义回调时无需循环。
dash.dependecies.ALL
:from dash.dependencies import Input, Output, State, ALL
MATCH
和ALLSMALLER
。id
id
是词典来定义组件。您可以选择任何键,但是例如type
和id
是相当合理的选择。因此,代替[dcc.Input(type = 'number', id = 'input %i'%i) for i in range(20)]
使用
[
dcc.Input(type='number',
id={
'type': 'my-input-type',
'id': 'input %i' % i
}) for i in range(20)
]
@app.callback
ALL
回调选择器:@app.callback(
dash.dependencies.Output({
'type': 'my-input-type',
'id': ALL
}, 'value'), [dash.dependencies.Input('button populate', 'n_clicks')])
def update(ignore):
return np.random.uniform()
答案 2 :(得分:0)
您可以根据需要在回调上具有任意多个输入参数/参数。 但是只有一个输出。
为我解决类似情况的是:
@app.callback(
[Output('output-id', 'children')],
[Input('button-trigger', 'n_clicks'],
[State('input-one', 'value'),
...
[State('input-twenty', 'value')]
)
def my_fancy_function(n_clicks, v1, ..., v20):
return sth_awesome
与输入State()
相对的{p> Input()
不会在更改输入值时触发回调。
n_clicks
每次点击都会更改+1,但无需使用。
如果您的参数相互依赖,则需要更多的回调。
但是...具有20个参数There must be a better way
答案 3 :(得分:0)
我已经做了类似的页面重载后填充我的布局组件的东西。
由于所述第一回调,所述组件的状态处于dcc.Store部件存储。 第二个回调是在状态更改或访问选项卡时填充布局组件(布局位于dcc.Tab中)
drawable-xx
请注意,您将无法访问函数(set_back_component(...))中的迭代值(component_id和component_property)