如何根据选定的下拉值在Dash DataTable中动态添加列

时间:2019-08-29 12:25:58

标签: python plotly-dash

我想使用Dash根据选定的下拉值在DataTable中动态添加列。 我的表也是基于两个下拉菜单动态创建的(我有一个返回整个DataTable定义的回调)。

我尝试了Adding or removing columns部分中的示例,但是仅当您尝试使用按钮添加列时,该示例才起作用。

这是我添加列的代码:

@app.callback(
[Output(‘main_table’, ‘columns’)],
[Input(‘second_dropdown’, ‘value’)],
[State(‘main_data’, ‘data’), State(‘main_table’, ‘columns’)]
)
def add_columns(values, data, existing_columns):
if existing_columns is None:
return None
for value in values:
if value not in existing_columns:
existing_columns.append({
‘id’: value,
‘name’: value
})
print(existing_columns)
return existing_columns

'main_data'存储在一个json文件中,该文件包含更改第二个下拉列表中的值时应显示的数据。 因此,我希望有一个表,其中的列与所选下拉值的数量相同。

我是Dash的新手,所以如果有人可以帮助我,我将非常感谢。

1 个答案:

答案 0 :(得分:0)

如果有人也遇到相同的问题,请采用以下解决方法(非常感谢Marc-Andre):

import dash
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate

from dash_table import DataTable, FormatTemplate
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Dropdown(
        id='dropdown',
        options=[{
            'label': 'label: ' + id,
            'value': id
        } for id in ['b', 'c', 'd', 'e', 'f']]
    ),
    DataTable(
        id='table',
        columns=[{
            'name': x,
            'id': x,
            'selectable': True
        } for x in ['a']],
        column_selectable="single",
        data=[{
            'a': 'a' + str(x),
            'b': 'b' + str(x),
            'c': 'c' + str(x),
            'd': 'd' + str(x),
            'e': 'e' + str(x),
            'f': 'f' + str(x)
        } for x in range(0,100)]
    )
])

@app.callback(
    Output('table', 'columns'),
    [Input('dropdown', 'value')],
    [State('table', 'columns')]
)
def update_columns(value, columns):
    if value is None or columns is None:
        raise PreventUpdate

    inColumns = any(c.get('id') == value for c in columns)

    if inColumns == True:
        raise PreventUpdate

    columns.append({
        'label': 'label: ' + value,
        'id': value
    })
    return columns

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