Hello @Efidler12,
Still not very sure about what you want. From what I understand, I added a hidden div to “save” the cities dropdown value at each callback.
import dash, json
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
USA = [
"New York",
"San Francisco",
"Cincinnati",
]
CANADA = [
"Montréal",
"Toronto",
"Ottawa",
]
country_dict = dict(USA = USA, CANADA = CANADA)
app = dash.Dash()
app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})
app.layout = html.Div([
dcc.Dropdown(
id = "countries_dropdown",
options = [
{ 'label': 'America', 'value': 'USA' },
{ 'label': 'Canada', 'value': 'CANADA' },
],
value = [ "USA" ],
multi = True,
),
dcc.Dropdown(
id = "cities_dropdown",
multi = True,
),
html.Div(id = "hidden_city", style = dict(display = "none"))
])
@app.callback(
Output("cities_dropdown", "options"),
[ Input("countries_dropdown", "value") ],
)
def update_cities_options(countries):
cities = []
for country in countries:
cities += [ dict(label = cities, value = cities) for cities in country_dict[country] ]
return cities
@app.callback(
Output("cities_dropdown", "value"),
[ Input("cities_dropdown", "options") ],
[ State("hidden_city", "children") ],
)
def update_cities_value(cities, jcities):
if jcities is None:
return cities[0]
else:
return json.loads(jcities)
@app.callback(
Output("hidden_city", "children"),
[ Input("cities_dropdown", "value") ],
)
def update_hidden_city(cities):
return json.dumps(cities)
if __name__ == "__main__":
app.run_server(debug = True)
This code “remembers” what you selected for each country. For instance, if you select Ottawa and Montréal in Canada, change to USA and switch back to Canada, Ottawa and Montréal will still be selected.
If you want to have New York when only Canada is selected, I guess it might be a little bit tricky as Dash aims for UI consistency.