Plotly Dash:如何通过for循环生成dbc.Button?解决嵌套列表报错
Let's break down the two main problems causing your errors and fix them step by step:
Problem 1: Nested List of Components
Your generate_team_button function is returning a tuple (notice the trailing comma after dbc.Button(...)), not a single Button component. When you use this in a list comprehension, you end up with a list of tuples like [(Button1,), (Button2,)], which Dash interprets as a nested list of children—hence the error about the children property being a list of lists.
Problem 2: Incorrect Team Name Value
You're using df_teams.iterrows() to loop through your DataFrame, which returns pairs of (index, row_object) instead of just the team names. That's why your button text/ID is showing the row's string representation instead of "team1", "team2", etc. You should iterate directly over the teams column values instead.
Fixed Code
Here's the corrected version of your code with both issues resolved:
# -*- coding: utf-8 -*- import dash import dash_html_components as html import dash_bootstrap_components as dbc import pandas as pd data = {'teams': ['team1', 'team2', 'team3', 'team4']} df_teams = pd.DataFrame(data) def generate_team_button(team_shortName): # Remove the trailing comma to return a single Button component return dbc.Button( team_shortName, # No need to cast to str since values are already strings color="primary", className="mr-1", id=team_shortName, ) app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) app.layout = html.Div( [ dbc.Row([ dbc.Col( # Iterate directly over the 'teams' column values [generate_team_button(team) for team in df_teams['teams']] ) ]), ], ) if __name__ == '__main__': app.run_server(debug=True)
Key Changes Made
- Removed the trailing comma in
generate_team_buttonso it returns a singledbc.Buttoninstead of a tuple. - Replaced
df_teams.iterrows()withdf_teams['teams']to loop through actual team name strings instead of row objects. - Removed unnecessary
str()casts since the team names are already string values in the DataFrame.
This will generate properly formatted buttons with the correct team names as text and IDs, and eliminate the nested list error.
内容的提问来源于stack exchange,提问作者MisterButter

