首页 > 解决方案 > Python Dash - 可以循环创建 dbc.Row 吗?

问题描述

我有以下代码创建 5 行:

dbc.Row(
    dcc.Checklist(
        id='cl1',
        options=[{'label': x, 'value': x} for x in ['World', 'AE', 'EME']],
        value= ['World'],
        labelStyle={'display': 'inline-block'},
    ),
    align='center',
    style={'text-align': 'center', 'padding-bottom': '8pt'}
),

dbc.Row(
    dcc.Checklist(
        id='cl2',
        options=[{'label': x, 'value': x} for x in ['USA', 'CAN', 'DEU', 'FRA', 'ITA', 'ESP', 'GBR']],
        value= [],
        labelStyle={'display': 'inline-block'},
    ),
    align='center',
    style={'text-align': 'center', 'padding-bottom': '8pt'}
),

dbc.Row(
    dcc.Checklist(
        id='cl3',
        options=[{'label': x, 'value': x} for x in ['JPN', 'SGP', 'HKG', 'TWN', 'KOR']],
        value=[],
        labelStyle={'display': 'inline-block'},
    ),
    align='center',
    style={'text-align': 'center', 'padding-bottom': '8pt'}
),

dbc.Row(
    dcc.Checklist(
        id='cl4',
        options=[{'label': x, 'value': x} for x in ['MYS', 'THA', 'PHL', 'IDN', 'VNM']],
        value=[],
        labelStyle={'display': 'inline-block'},
    ),
    align='center',
    style={'text-align': 'center', 'padding-bottom': '8pt'}
),

dbc.Row(
    dcc.Checklist(
        id='cl5',
        options=[{'label': x, 'value': x} for x in ['IND', 'BRA', 'RUS', 'MEX', 'ZAF']],
        value=[],
        labelStyle={'display': 'inline-block'},
    ),
    align='center',
    style={'text-align': 'center', 'padding-bottom': '5vh'}
),

如您所见,行之间的唯一区别是它们的 id 和它们引用的列表。

为了提高效率,我想知道是否有办法在循环中创建这些行?像这样的东西:

for name, list in zip(names, lists):
    dbc.Row(
        dcc.Checklist(
            id=name,
            options=[{'label': x, 'value': x} for x in list],
            value= ['World'],
            labelStyle={'display': 'inline-block'},
        ),
        align='center',
        style={'text-align': 'center', 'padding-bottom': '8pt'}
    ),

以上只是抛出一个语法错误。

标签: pythonplotly-dash

解决方案


诀窍是在循环中创建清单:

cl = {}
cl_options = [['World', 'AE', 'EME'],
              ['USA', 'CAN', 'DEU', 'FRA', 'ITA', 'ESP', 'GBR'],
              ['JPN', 'SGP', 'HKG', 'TWN', 'KOR'],
              ['MYS', 'THA', 'PHL', 'IDN', 'VNM'],
              ['IND', 'BRA', 'RUS', 'MEX', 'ZAF']]
for i in range(1,6):
    cl['cl{0}'.format(i)] = dcc.Checklist(
                                id='cl{0}'.format(i),
                                options=[{'label': x, 'value': x} for x in cl_options[i-1]],
                                value=[],
                                labelStyle={'display': 'inline-block'},
                            ),

然后您可以简单地执行此操作以轻松初始化行:

dbc.Row(dbc.Col(cl['cl1'], style={'text-align': 'center'})),
dbc.Row(dbc.Col(cl['cl2'], style={'text-align': 'center'})),
dbc.Row(dbc.Col(cl['cl3'], style={'text-align': 'center'})),
dbc.Row(dbc.Col(cl['cl4'], style={'text-align': 'center'})),
dbc.Row(dbc.Col(cl['cl5'], style={'text-align': 'center'})),

理论上,您也可以在循环中创建行对象,但我发现以这种方式自定义样式更灵活。


推荐阅读