#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]