Python Plotly Dash : Как вставить новые значения для фильтрации после обратного вызова? (Фильтр обновления)

#python #callback #plotly-dash

Вопрос:

Моя ситуация такова, что я получаю таблицу по идентификатору пользователя только после того, как он вошел в систему.

Например :

 app = dash.Dash(__name__)  #Filter with static values Month_Selector = dcc.Dropdown(id='month_dropdown',  options=[  {"label": "November 2021", "value": "November 2021"},  {"label": "October 2021", "value": "October 2021"},  {"label": "September 2021", "value": "September 2021"},  ],  placeholder="Select Month",  value = datetime.today().strftime('%B %Y'),  searchable=False  )  app.layout = html.Div(  children=[  html.Div(Month_Selector, style={'width': '200px'}),  dcc.Graph(id='chart')  ] )    @dash_app.callback(  [  Output(component_id='chart', component_property='figure')  ],  [Input(component_id="submit-button-state", component_property="n_clicks"),  Input(component_id="month_dropdown", component_property="value")]  )  def get_user_name(n_clicks, selected_month):    # Can get a table only after user authorization.  df= get_table_by_an_authorized_user_id    #filter table by slicer value  filtered_df= df[ (df['Month Name'] == selected_month)]    # This new values that need to insert to slicer Month_Selector  new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]    fig = px.bar(filtered_df, x='Month Name', y='Sales')  return fig  # Run Local Server if __name__ == '__main__':  app.run_server(debug=True, use_reloader=False)   

Поэтому перед @callback я могу использовать только статические значения фильтра. Как я могу обновить или заменить значения фильтра динамическими значениями, которые я получаю после обратного вызова@?

Ответ №1:

Вы хотите обновить options свойство раскрывающегося списка, чтобы вы могли добавить вывод с новыми параметрами и заставить обратный вызов возвращать их вместе с обновленным рисунком :

 @dash_app.callback(  [Output(component_id='chart', component_property='figure'),  Output(component_id='month_dropdown', component_property='options')],  [Input(component_id="submit-button-state", component_property="n_clicks"),  Input(component_id="month_dropdown", component_property="value")] ) def get_user_name(n_clicks, selected_month):    # Can get a table only after user authorization.  df= get_table_by_an_authorized_user_id    #filter table by slicer value  filtered_df= df[ (df['Month Name'] == selected_month)]    # This new values that need to insert to slicer Month_Selector  new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]    fig = px.bar(filtered_df, x='Month Name', y='Sales')  return [fig, new_options_for_month_selector]