plotly dash: создать несколько обратных вызовов (с циклом?) - PullRequest
0 голосов
/ 24 декабря 2018

Скажем, у меня есть модель с 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 обратных вызовов для каждого выхода с идентичной функциональностью?Я не могу найти способ сделать их за один раз (цикл?)

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Я имел дело с той же проблемой и нашел решение.Вы обходите декоратор и напрямую вызываете функцию 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)
0 голосов
/ 31 января 2019

Я сделал нечто подобное, чтобы заполнить свой компонент макета после перезагрузки страницы.

Благодаря первому обратному вызову состояние компонентов сохраняется в компоненте dcc.Store.Второй обратный вызов - заполнение компонентов макета при изменении их состояния или при доступе к вкладке (макет находится в dcc.Tabs)

dash_layout_components = {
'time_slider_app2': 'value',
'backtest_choice_app2': 'values',
'asset_selection_app2': 'value',
'graph_selection_app2': 'values'
}

stored_layout_value_name = [key[:key.rfind('a')] + value for key, value in 
dash_layout_components.items()]

set_back_and_display_graph_input = {
    'store_layout_data': 'modified_timestamp',
    'tabs': 'value'
}


@app.callback(
Output('store_layout_data', 'data'),
[Input(key, value) for key, value in dash_layout_components.items()])
def store_layout(time_slider_value, backtest_choice_values, assets_selection_values, graph_selection_values):

    data_json = {
        'time_slider_value': time_slider_value,
        'backtest_choice_values': backtest_choice_values,
        'asset_selection_value': assets_selection_values,
        'graph_selection_values': graph_selection_values
   }
   return data_json


for component_id, component_property in dash_layout_components.items():
@app.callback(
    Output(component_id, component_property),
    [Input(key, value) for key, value in set_back_and_display_graph_input.items()],
    [State('store_layout_data', 'data'),
     State(component_id, 'id')]
)
def set_back_component(bouton_ts, tabs_value, layout_state_data, component):  # dynamiser l'arrivée des paramètres. piste, en créer une liste entre le for et le callback

    if tabs_value != '/app2':
        raise PreventUpdate

    if layout_state_data is None:
        return []

    else:
        store_layout_component_name = stored_layout_value_name[list(dash_layout_components.keys()).index(component)]
        return layout_state_data[store_layout_component_name]

Обратите внимание, что у вас не будет доступа к повторяющимся значениям.(component_id и component_property) внутри функции (set_back_component (...))

0 голосов
/ 25 декабря 2018

вы можете иметь столько входных параметров / аргументов для обратного вызова, сколько захотите.Но только один выход .

Для меня был решен похожий случай:

@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() в отличие от Input() не вызывает обратный вызов, когдаизменено входное значение.

n_clicks изменяется +1 с каждым щелчком, но его не нужно использовать.

Если ваши параметры зависят друг от друга, вам потребуется больше обратных вызовов.Но ... с 20 параметрами There must be a better way

...