如何在plotly Dash 中将下拉输入连接到DataTable 输出

问题描述 投票:0回答:1

我尝试构建一个带有绘图破折号的仪表板,其中有一个下拉菜单作为输入年份,输出是数据框,它将由下拉列表中的输入进行过滤。当我运行该应用程序时,什么也没有发生。

这是我的代码:

app= dash.Dash(__name__)

app.layout= html.Div([
    html.H1("Total Medals of Each Country", style={'text-alugn':'center', 'color':'white'}),
    dcc.Dropdown(id='select_year',
                 options=np.array(medals_by_country.year.unique(), dtype=np.int64),
                 multi=True,
                 value= ' ',
                 style={'width':'40%'}
    ),
html.Br(),    
html.Div([
    dash_table.DataTable(
        id='datatable_id',
        data=medals_by_country.to_dict('records'),
        columns=[
            {"name":i, "id":i, "deletable":False, "selectable":False} for i in medals_by_country.columns
        ],
        editable=False,
#         filter_action="native",
#         sort_action="native",
#         sort_mode="multi",
        row_selectable="multi",
        row_deletable=False,
        selected_rows=[],
        page_action="native",
        page_current=0,
        page_size=6,
#         page_action='none',
#         style_cell={'whiteSpace': "normal"},
#         fixed_rows={'headers':True, 'data':0},
#         virtualization=False,
        style_cell_conditional=[{'width':'40%'}],
        )
]),

])

@app.callback(
    Output(component_id='datatable_id', component_property='selected_rows'),
    Input(component_id='select_year', component_property='value')
)
def update_table(option_selected):
    dff= medals_by_country.copy()
    dff= dff[dff['year']== option_selected]
    
    return dff

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

我不知道如何在下拉列表和数据表之间连接,任何建议都会有帮助。 另一个问题:如果我的 DataTable 具有过滤列的能力,filter_action =“native”,我的 @app.callback 是否需要来自 DataTable 本身的输入 id?

谢谢你

python datatable plotly-dash
1个回答
0
投票

使用具有选项

Dropdown
multi = True
,您不能在代码中使用
dff= dff[dff['year']== option_selected]
,但可以使用
isin

您的

callback
应如下所示:

@app.callback(
    Output('datatable_id', 'data'),
    Input('select_year', 'value')
)
def update_table(option_selected):
    dff= medals_by_country.copy()
    dff= dff[dff['year'].isin(option_selected)]
    
    return dff.to_dict('records)

if __name__ == '__main__':
    app.run_server(debug=True)
© www.soinside.com 2019 - 2024. All rights reserved.