Dash - 带有 2 个输入的回调

Dash - Callback with 2 input

我有 2 个下拉列表和 1 个文本区域。 我需要文本区域不加区别地接受来自两个下拉列表的输入(一次一个,根据用户select),但只显示最后一个值selected(每一次我select 来自两个下拉列表之一的值,它会覆盖最后一个 selected).

如何编写回调?

我以为我可以简单地写:

@app.callback(
Output(component_id='text_output', component_property='value'),
Input(component_id='lista_file_mt', component_property='value'),
Input(component_id='lista_file_crt', component_property='value'))

但是,显然,它不起作用

动态文本输出连接 multi=True 下拉选项

是这样的吗?:

import dash

from dash import dcc
from dash import html
from dash import no_update
from dash.dependencies import Input
from dash.dependencies import Output


app = dash.Dash(__name__)

app.layout = html.Div(
    [
        dcc.Dropdown(
            id="dropdown-1",
            options=[
                {"label": "a", "value": "a"},
                {"label": "b", "value": "b"},
                {"label": "c", "value": "c"},
            ],
            multi=True,
        ),
        dcc.Dropdown(
            id="dropdown-2",
            options=[
                {"label": "d", "value": "d"},
                {"label": "e", "value": "e"},
                {"label": "f", "value": "f"},
            ],
            multi=True,
        ),
        html.Div(id="textarea-1", children=[]),
    ]
)


@app.callback(
    Output("textarea-1", "children"),
    [Input("dropdown-1", "value"), Input("dropdown-2", "value")],
    prevent_initial_call=True,
)
def update_text_input(dd1, dd2):
    text = []
    if dd1:
        text += ["".join(dd1)]
    if dd2:
        text += ["".join(dd2)]
    return text


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

动态文本仅从任何现有下拉列表中不分青红皂白地输出单个值

好吧,这有点复杂,需要使用 dcc.Store,以便能够辨别下拉列表何时更改,是哪个具有不同于当前已经 [last] 显示的值。

import sys

import dash
from dash import html
from dash import dcc
from dash import no_update
from dash.dependencies import Input, Output, State


app = dash.Dash(__name__)

app.layout = html.Div(
    [
        dcc.Store(id="session", storage_type="session"),
        dcc.Dropdown(
            id="dropdown-1",
            options=[
                {"label": "a", "value": "a"},
                {"label": "b", "value": "b"},
                {"label": "c", "value": "c"},
            ],
            placeholder="Choose a value",
            value=None,
        ),
        dcc.Dropdown(
            id="dropdown-2",
            options=[
                {"label": "d", "value": "d"},
                {"label": "e", "value": "e"},
                {"label": "f", "value": "f"},
            ],
            placeholder="Choose a value",
            value=None,
        ),
        html.Div(id="textarea-1", children=[]),
    ]
)


@app.callback(
    [Output("textarea-1", "children"), Output("session", "data")],
    [Input("dropdown-1", "value"), Input("dropdown-2", "value")],
    State("session", "data"),
    # prevent_initial_call=True,
)
def update_text_input(dd1, dd2, data):
    print(dd1, dd2, data, file=sys.stderr)
    if not data:
        print(dd1, dd2, data, file=sys.stderr)
        return no_update, {"dd1": None, "dd2": None}
    if dd1 and (dd1 != data["dd1"]):
        return [dd1], {"dd1": dd1, "dd2": data["dd2"]}
    if dd2 and (dd2 != data["dd2"]):
        return [dd2], {"dd1": data["dd1"], "dd2": dd2}

    return no_update, data


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