Dash,如何根据单击哪个按钮进行回调?

Dash, how to callback depending on which button is being clicked?

我有一个动态创建一组按钮的函数:

def generate_team_button(team_shortName):
    return dbc.Button(
                str(team_shortName),
                className="btn btn-primary",
                id=str(team_shortName),
                style={
                "margin-right": "10px",
                "margin-bottom": '10px',
                },
                n_clicks=0,

            )

这些按钮通过循环显示一组项目

import dash
import dash_core_components as dcc
import dash_html_components as html

import dash_bootstrap_components as dbc

from dash.dependencies import Input
from dash.dependencies import Output
from dash.dependencies import State

import pandas as pd

data = {'teams': ['team1', 'team2', 'team3', 'team4']}
df_teams = pd.DataFrame(data)

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div(
    [

        dbc.Row([
                dbc.Col(
                    children=[generate_team_button(i) for i in df_teams['teams']]
                ), 

        ]),

        dbc.Row([
                dbc.Col(
                    id='section',
                    #WANT TO UPDATE THIS SECTION BASED ON WHICH BUTTON IS BEEING CLICKED


                ), 

        ]),
    ]
),

我想做的是根据按下的按钮更新 id=section。为此,我需要如下所示的 @app.callback。但是我得到的是一个元组,其中包含每个按钮被按下的次数。

@app.callback(
    [
        Output('league-table', 'value'),
    ],
    [
        Input(str(i), 'n_clicks') for i in df_teams['teams']
    ] 

)

def update_league_table(*args):
    print(args)
    return f'{args}'

如何根据单击的按钮更新部分?

此信息可通过 callback_context 对象获得。这是一个小例子,

import dash
import dash_html_components as html
from dash.dependencies import Output, Input
from dash import callback_context

n_buttons = 5
# Create example app.
app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div([html.Button("Button {}".format(i), id=str(i)) for i in range(n_buttons)] + [html.Div(id="log")])


@app.callback(Output("log", "children"), [Input(str(i), "n_clicks") for i in range(n_buttons)])
def func(*args):
    trigger = callback_context.triggered[0] 
    return "You clicked button {}".format(trigger["prop_id"].split(".")[0])


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

有关其他详细信息,请参阅 documentation on advanced callbacks