将编辑后的 DataTable 存储在 Dash 中
Store edited DataTable in Dash
我正在尝试将编辑后的 Python Dash 数据Table 存储到带有按钮组件的 dcc.store 容器中,并在稍后使用保存的数据。但是,一旦我更改了原始数据Table,存储的容器也会发生变化。我找到了以下 post (save a modified dash datatable to dataframe) 但无法弄明白。
我的核心问题是如何在 Python dash 应用程序中存储(复制)一些数据,然后在不更改存储的副本的情况下操作原始数据。
# Libraries
import pandas as pd
import dash
from dash import html, dash_table
import dash_core_components as dcc
from dash.dependencies import Input, Output
# Data
test_data = pd.DataFrame([[1,2],[3,4]], columns=['Col1', 'Col2'])
saved_test_data = None
# App
app = dash.Dash(__name__)
app.layout = html.Div(children=[dash_table.DataTable(columns = [{"name": i, "id": i} for i in test_data.columns],
data = test_data.to_dict('records'),
id = 'test_data_table',
editable=True,
),
html.Button('Save data', id='save_test_data', n_clicks=0),
dcc.Store(id = 'test_data_store'),
dash_table.DataTable(id = 'check_table', data=saved_test_data),
],
style={'width': '50%', 'display': 'inline-block', 'padding-left':'25%', 'padding-right':'25%'}
)
# Callbacks
@app.callback(Output('test_data_store', 'data'),
[Input('save_test_data', 'n_clicks'), Input('test_data_table', 'data')])
def save_test_data(n, data):
if n == 0:
saved_test_data = None
else:
saved_test_data = data
return saved_test_data
@app.callback(Output('check_table', 'data'),
Input('test_data_store', 'data'))
def restore_saved_test_data(data):
return data
if __name__ == '__main__':
app.run_server(debug=True, use_reloader=False)
如果我在按下按钮后更改上部 table 中的值,下部 table 也会更改,但它应该显示点击前保存的值,即
- 原版Table
按下按钮保存table。
存储table应该显示在下面
- 更改上部 table 不应在再次按下按钮之前更改下部 table,但会立即更改。
有两个问题。首先,您将原始 table 作为 Input
,每次更改时都会触发回调。这应该是 State
而不是
State('test_data_table', 'data')
其次,如果您进行上述更改,这个条件可能并不那么重要,if n == 0:
。单击该按钮后,它将始终为 False
。从那里开始,每次 table 更新。
我正在尝试将编辑后的 Python Dash 数据Table 存储到带有按钮组件的 dcc.store 容器中,并在稍后使用保存的数据。但是,一旦我更改了原始数据Table,存储的容器也会发生变化。我找到了以下 post (save a modified dash datatable to dataframe) 但无法弄明白。
我的核心问题是如何在 Python dash 应用程序中存储(复制)一些数据,然后在不更改存储的副本的情况下操作原始数据。
# Libraries
import pandas as pd
import dash
from dash import html, dash_table
import dash_core_components as dcc
from dash.dependencies import Input, Output
# Data
test_data = pd.DataFrame([[1,2],[3,4]], columns=['Col1', 'Col2'])
saved_test_data = None
# App
app = dash.Dash(__name__)
app.layout = html.Div(children=[dash_table.DataTable(columns = [{"name": i, "id": i} for i in test_data.columns],
data = test_data.to_dict('records'),
id = 'test_data_table',
editable=True,
),
html.Button('Save data', id='save_test_data', n_clicks=0),
dcc.Store(id = 'test_data_store'),
dash_table.DataTable(id = 'check_table', data=saved_test_data),
],
style={'width': '50%', 'display': 'inline-block', 'padding-left':'25%', 'padding-right':'25%'}
)
# Callbacks
@app.callback(Output('test_data_store', 'data'),
[Input('save_test_data', 'n_clicks'), Input('test_data_table', 'data')])
def save_test_data(n, data):
if n == 0:
saved_test_data = None
else:
saved_test_data = data
return saved_test_data
@app.callback(Output('check_table', 'data'),
Input('test_data_store', 'data'))
def restore_saved_test_data(data):
return data
if __name__ == '__main__':
app.run_server(debug=True, use_reloader=False)
如果我在按下按钮后更改上部 table 中的值,下部 table 也会更改,但它应该显示点击前保存的值,即
- 原版Table
按下按钮保存table。
存储table应该显示在下面
- 更改上部 table 不应在再次按下按钮之前更改下部 table,但会立即更改。
有两个问题。首先,您将原始 table 作为 Input
,每次更改时都会触发回调。这应该是 State
而不是
State('test_data_table', 'data')
其次,如果您进行上述更改,这个条件可能并不那么重要,if n == 0:
。单击该按钮后,它将始终为 False
。从那里开始,每次 table 更新。