在Python dash中-如何在从回调内存读取JSON文件后填充数据表
希望创建两个数据表(表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。在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
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()