Я возился с dcc.Store (https://dash.plot.ly/dash-core-components/store)
Есть атрибут clear_data, но я не могу понять, как заставить его работать. Я хочу добавить кнопку html, чтобы очистить локальный магазин.
Все, что я делаю, это увеличиваю переменную, сохраняю ее и считываю обратно ... пример, приведенный Dash, не дает никаких указаний, как очистить значения
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Output, Input, State
from dash.exceptions import PreventUpdate
app = dash.Dash(__name__)
app.config['suppress_callback_exceptions']=True
app.layout = html.Div([
dcc.Store(id='buttonstore3', storage_type='local'),
html.Div([
html.Button('Local', id='my-button3')
]),
html.Div([
html.Button('Clear Local', id='my-button4')
]),
html.Div([
html.Table([
html.Thead([
html.Tr([
html.Th('Local clicks')
])
]),
html.Tbody([
html.Tr([
html.Td(0, id='local-clicks'),
])
])
])
])
])
####### Add to Local Store
@app.callback(Output('buttonstore3', 'data'),
[Input('my-button3', 'n_clicks')],
[State('buttonstore3', 'data')])
def on_click(n_clicks, data):
if n_clicks is None:
raise PreventUpdate
data = data or 0
data = data + 1
return data
@app.callback(Output('local-clicks', 'children'),
[Input('buttonstore3', 'modified_timestamp')],
[State('buttonstore3', 'data')])
def on_data(ts, data):
if ts is None:
raise PreventUpdate
data = data or 0
return data
if __name__ == '__main__':
app.run_server(debug=True, threaded=True)
В документах здесь сказано:
clear_data - Set to True to remove the data contained in data_key.
Таким образом, вы можете добавить следующий обратный вызов в свое приложение:
@app.callback(Output('buttonstore3', 'clear_data'),
[Input('my-button4', 'n_clicks')])
def clear_click(n_click_clear):
if n_click_clear is not None and n_click_clear > 0:
return True
return False
Вы также можете обновить свой обратный вызов on_click
, чтобы он принимал входные данные от обеих кнопок и выводил их в опору data
в зависимости от того, какая кнопка была нажата, например так:
####### Add to Local Store
@app.callback(Output('buttonstore3', 'data'),
[Input('my-button3', 'n_clicks'),
Input('my-button4', 'n_clicks')],
[State('buttonstore3', 'data')])
def on_click(n_clicks_add, n_clicks_clear, data):
if n_clicks_add is None:
n_clicks_add = 0
if n_clicks_clear is None:
n_clicks_clear = 0
if data is None:
data = 0
trigger = dash.callback_context.triggered[0]
if trigger['prop_id'] == 'my-button3.n_clicks':
data += 1
elif trigger['prop_id'] == 'my-button4.n_clicks':
data = 0
else:
raise ValueError('Unrecognized trigger: {}'.format(trigger['prop_id']))
return data
Отличный ответ, иногда я что-то пропускаю, когда читаю документацию.
Большое вам спасибо, @coralvanda, обе эти работы доставляют удовольствие. Я пытался захватить ввод обеих кнопок — информация об этом застряла в разделе часто задаваемых вопросов документации Dash. Хорошенький Эрик.