我有一个应用程序,它包含一个带有回调功能的按钮,可以创建无限数量的下拉列表,它将自动标识为‘DropDown-I’. 困难在于,我似乎无法在另一个回调函数中实际使用我在这些下拉列表中输入的值(那只是try 打印它们).

我如何检索这些值,或者您将如何检索这些值?

显然,第value=dcc.Dropdown(id=dropdown_id).value部分不起作用.

import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State

app = dash.Dash(__name__)

app.layout = html.Div([
    html.Button("Add Dropdown and Number Field", id="add-button"),
    html.Div(id="input-container", children=[]),
    html.Div(id="output"), 
])

@app.callback(
    Output("input-container", "children"),
    Input("add-button", "n_clicks"),
    State("input-container", "children")
)
def add_input(n_clicks, existing_children):
    if n_clicks is None:
        return existing_children
    
    new_input = dbc.Row([
        dbc.Col(dcc.Dropdown(
            options=[
                {'label': 'Option 1', 'value': 'option-1'},
                {'label': 'Option 2', 'value': 'option-2'},
                # Add more dropdown options as needed
            ],
            value='option-1',
            id=f'dropdown-{n_clicks}'
        )),
        dbc.Col(dcc.Input(
            type='number',
            value=0,
            id=f'weight-{n_clicks}'
        )),
    ])
    
    existing_children.append(new_input)
    
    return existing_children

@app.callback(
    Output("output", "children"),
    Input("add-button", "n_clicks"),
    State("input-container", "children")
)
def process_dropdowns(n_clicks, dropdown_children):
    if n_clicks is None:
        return []

    # Create a list to store the selected values from each dropdown
    selected_values = []

    # Iterate through the dropdowns to retrieve their values
    for i, child in enumerate(dropdown_children):
        dropdown_id = f'dropdown-{i+1}'
        selected_value = dcc.Dropdown(id=dropdown_id).value
        selected_values.append(selected_value)

    # Process the selected values or use them as needed
    return f"Selected Dropdown Values: {', '.join(selected_values)}"

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

推荐答案

这是利用pattern-matching callback selectors的典型用例.

模式匹配回调 Select 器MATCHALLALLSMALLER允许 您可以编写响应或更新任意或 组件的动态数量.

其思想是使用复合id(类型+索引),使用字典而不是字符串,这样我们就可以将给定的组件标识为特定类型的第n个组件.

我还更新了第一个回调函数,使其变为partial property updates,而不是在网络上来回发送所有数据,这使其效率更高.

from dash import Dash, dcc, html, Input, Output, ALL, Patch, callback, no_update
import dash_bootstrap_components as dbc

app = Dash(__name__)

app.layout = html.Div([
    html.Button("Add Dropdown and Number Field", id="add-button"),
    html.Div(id="input-container", children=[]),
    html.Div(id="output"),
])


@app.callback(
    Output("input-container", "children"),
    Input("add-button", "n_clicks")
)
def add_input(n_clicks):
    if n_clicks is None:
        return no_update

    patched_children = Patch()

    new_input = dbc.Row([
        dbc.Col(dcc.Dropdown(
            id={'type': 'dropdown', 'index': n_clicks},
            options=[
                {'label': 'Option 1', 'value': 'option-1'},
                {'label': 'Option 2', 'value': 'option-2'},
                # Add more dropdown options as needed
            ],
            value='option-1',
        )),
        dbc.Col(dcc.Input(
            id={'type': 'weight', 'index': n_clicks},
            type='number',
            value=0,
        )),
    ])

    patched_children.append(new_input)
    return patched_children


@callback(
    Output("output", "children"),
    Input({"type": "dropdown", "index": ALL}, "value"),
)
def process_dropdowns(values):
    return html.Div(
        ['Selected Dropdown Values:'] +
        [html.Div(f"Dropdown {i + 1} = {value}") for (i, value) in enumerate(values)]
    )

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

Python相关问答推荐

更改Seaborn条形图中的x轴日期时间限制

添加包含中具有任何值的其他列的计数的列

将HLS纳入媒体包

使用SciPy进行曲线匹配未能给出正确的匹配

Django管理面板显示字段最大长度而不是字段名称

Polars LazyFrame在收集后未返回指定的模式顺序

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

为什么这个带有List输入的简单numba函数这么慢

发生异常:TclMessage命令名称无效.!listbox"

如何从数据库上传数据到html?

索引到 torch 张量,沿轴具有可变长度索引

如何在Python中获取`Genericums`超级类型?

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

Python pint将1/华氏度转换为1/摄氏度°°

不允许 Select 北极滚动?

如何强制向量中的特定元素在Gekko中处于优化解决方案中

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

如何使用加速广播主进程张量?

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC