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)
我有 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)