将编辑后的 ​​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 也会更改,但它应该显示点击前保存的值,即

  1. 原版Table

  1. 按下按钮保存table。

  2. 存储table应该显示在下面

  1. 更改上部 table 不应在再次按下按钮之前更改下部 table,但会立即更改。

有两个问题。首先,您将原始 table 作为 Input,每次更改时都会触发回调。这应该是 State 而不是

State('test_data_table', 'data')

其次,如果您进行上述更改,这个条件可能并不那么重要,if n == 0:。单击该按钮后,它将始终为 False。从那里开始,每次 table 更新。