在Python dash中-如何在从回调内存读取JSON文件后填充数据表

在Python dash中-如何在从回调内存读取JSON文件后填充数据表,python,json,datatables,callback,hyphen,Python,Json,Datatables,Callback,Hyphen,希望创建两个数据表(表1、表2),其中有单独的数据帧作为输入数据。 需要根据表1中选择的行填充表2中的行。 无法返回data2,columns2以填充表2,如表1所示。 但是,当返回整个数据表时,这会起作用 问题是要对表2进行进一步处理,需要数据表属性,只有在回调函数返回data2,columns2时,数据表属性才可用 “好的,好的,好的” 在函数(更新表2)…返回数据2时,列2不起作用。但是当返回整个数据表时,它工作正常。需要保留表2的datatable属性,因此要返回data2,column

希望创建两个数据表(表1、表2),其中有单独的数据帧作为输入数据。 需要根据表1中选择的行填充表2中的行。 无法返回data2,columns2以填充表2,如表1所示。 但是,当返回整个数据表时,这会起作用

问题是要对表2进行进一步处理,需要数据表属性,只有在回调函数返回data2,columns2时,数据表属性才可用

“好的,好的,好的”

在函数(更新表2)…返回数据2时,列2不起作用。但是当返回整个数据表时,它工作正常。需要保留表2的datatable属性,因此要返回data2,columns2。在函数(update_table2)中…返回data2,columns2不起作用。但是当返回整个数据表时,它工作正常。需要保留表2的datatable属性,因此要返回data2,columns2。
import dash
from dash.dependencies import Input, Output, State
import dash_html_components as html
import dash_core_components as dcc
from datetime import date as dt
from datetime import timedelta
import dash_table
import pandas as pd
import os


os.chdir('C:\\Users\\......................')
from pbts import pbts_f

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

today = dt.today()
enddate = today.replace(day=1)
enddate = enddate - timedelta(days=1)

startdate = enddate - timedelta(days = 180)
startdate = startdate.replace(day=1)

enddate = startdate + timedelta(days = 3)

st = startdate
st = st.strftime('%Y%m%d')

ed = enddate
ed = ed.strftime('%Y%m%d')

n = 0.0
m = 0.0

(df1, df2) = pbts_f(st, ed, n, m)


app.layout = html.Div([
    html.Div([
            html.Div([                   
                 html.Label ('COB Date Range:', style = {'text-align' : 'left','padding-left' : 0}),
                        html.Div([
                             dcc.DatePickerRange(
                                     id = 'COBdates',
                                     min_date_allowed = dt(2019,1,1),
                                     max_date_allowed = str(today),
                                     start_date = startdate,
                                     end_date = enddate
                                     )
                             ], style = {'padding' : 5, 'display': 'inline-block'}),

                        html.Div([html.Button('Submit Date Range', id = 'button')]),

              ], style = {'width': '40%', 'display': 'inline-block'}),

        ], style = {'padding' : 20}),


        dcc.Tabs([    
                dcc.Tab(label='Tab1', children = [
                        html.Div([                                
                            html.Div([dash_table.DataTable(
                                id='table1',
                                columns = [{"name": i, "id": i} for i in df1.columns],
                                data = df1.to_dict('rows'),
                                sort_action='native',
                                filter_action='native',
                                row_selectable='multi',
                                )]),
                        ])
                ]),

            dcc.Tab(label='Tab2', children = [
                        html.Div([   
                        html.Div(id = 'table2_memory',  style = {'display' : 'none'}),
#                        html.Div(id='table3_div'),
                        html.Div([dash_table.DataTable(
                                id='table2',
                                data = [{}],
#                                data = df2.to_dict('rows'),
                                columns = [{"name": i, "id": i} for i in df2.columns],
                                sort_action='native',
                                filter_action='native',
                                row_selectable='multi',
                                )])
                        ])                 
                    ]),

        ], style = {'padding': 10}
    ),

])

@app.callback(
            [Output('table1','data'), Output('table1','columns'),Output('table2_memory','children')],  
            [Input('button','n_clicks')],            
            [State('COBdates', 'start_date'), State('COBdates', 'end_date')] 
            )   

def update_table1(n_clicks, start_date, end_date):
    x = start_date
    x = x[0:4] + x[5:7] + x[8:11]  
    st = x
    y = end_date
    y = y[0:4] + y[5:7] + y[8:11]  
    ed = y

    (df1, df2) = pbts_f(st, ed, n, m)

    columns1 = [{'name': i, 'id': i} for i in df1.columns]
    data1 = df1.to_dict('records')

    return data1, columns1,  df2.to_json(date_format = 'iso', orient = 'split')


@app.callback(
    [Output('table2', 'data'), Output('table2', 'columns')],
#    [Output('table3_div', 'children')],
    [Input('table1', "selected_rows"), Input('table2_memory', "children")],
    [State('table1', "data")])

def update_table2(selected_rows, data, rows):
    if selected_rows is None:
        selected_rows = []

    if rows is None:
        dff1 = df1
    else:
        dff1 = pd.DataFrame(rows)

    dff1 = dff1.iloc[selected_rows]    
    portfolioname = dff1['Portfolio_Name'].unique()

    dff2 = pd.read_json(data, orient='split')    
    dff2 = dff2[dff2['Portfolio_Name'].isin (portfolioname)]

    columns2 = [{"name": i, "id": i} for i in dff2.columns], 
    data2 = dff2.to_dict("rows")

    return data2, columns2,    

#    return [html.Div([
#            dash_table.DataTable(
#                    id='table2',
#                    columns = [{"name": i, "id": i} for i in dff2.columns],
#                    data = dff2.to_dict('rows'),
#                    style_cell = {'textAlign': 'left'},
#                    style_header = {'backgroundColor' : 'White', 'frontWeight' : 'bold'},
#                    sort_action='native',
#                    filter_action='native',
#                    row_selectable='multi',
#                    )]
#            )]

if __name__ == '__main__':
    app.run_server()