How to dynamically set a default value in a dcc.Dropdown when options come from a callback?
How to dynamically set a default value in a dcc.Dropdown when options come from a callback?
这是 Dash 应用程序代码的最小示例 (app.py):
# Libraries
import csv
import pandas as pd
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output, State
# CSV files generation
row_list = [
["SN", "Name", "Quotes"],
[1, "Buddha", "What we think we become"],
[2, "Mark Twain", "Never regret anything that made you smile"],
[3, "Oscar Wilde", "Be yourself everyone else is already taken"]
]
with open('quotes.csv', 'w', newline='') as file:
writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC, delimiter=',')
writer.writerows(row_list)
import csv
with open('innovators.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["SN", "Name", "Contribution"])
writer.writerow([1, "Linus Torvalds", "Linux Kernel"])
writer.writerow([2, "Tim Berners-Lee", "World Wide Web"])
writer.writerow([3, "Guido van Rossum", "Python Programming"])
# Style
external_stylesheets = ['assets/style.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
# Layout
app.layout = html.Div([
html.Div([
dcc.Dropdown(
id='dropdown_div',
options=[
{'label': 'Quotes', 'value': 'quotes.csv'},
{'label': 'Innovators', 'value': 'innovators.csv'}
],
value='quotes.csv'
)
]),
html.Div([
dcc.Dropdown(
id='count_div'
)
])
])
# Callback function
@app.callback(
dash.dependencies.Output('count_div', 'options'),
[dash.dependencies.Input('dropdown_div', 'value')])
def loadfile(path):
df = pd.read_csv(path)
return [{'label': i, 'value': i} for i in df['Name'].drop_duplicates()]
# Main
if __name__ == '__main__':
app.run_server(debug=True)
我需要将第二个下拉列表的第一个值动态设置为其默认值。
在此示例中,第二个下拉列表将显示
- 当 Quotes 是第一个下拉列表的选定值时,Buddha 为默认值。
- 当创新者是第一个下拉列表的选定值时,Linus Torvalds 作为默认值。
解决办法是
- 向回调函数添加一个输出,将默认值发送到第二个 ddc.Dropdown
- 将默认值添加到
return
# Callback function
@app.callback(
[dash.dependencies.Output('count_div', 'options'),
dash.dependencies.Output('count_div', 'value')],
[dash.dependencies.Input('dropdown_div', 'value')])
def loadfile(path):
df = pd.read_csv(path)
return [{'label': i, 'value': i} for i in df['Name'].drop_duplicates()], df['Name'].drop_duplicates()[0]
这是 Dash 应用程序代码的最小示例 (app.py):
# Libraries
import csv
import pandas as pd
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output, State
# CSV files generation
row_list = [
["SN", "Name", "Quotes"],
[1, "Buddha", "What we think we become"],
[2, "Mark Twain", "Never regret anything that made you smile"],
[3, "Oscar Wilde", "Be yourself everyone else is already taken"]
]
with open('quotes.csv', 'w', newline='') as file:
writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC, delimiter=',')
writer.writerows(row_list)
import csv
with open('innovators.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["SN", "Name", "Contribution"])
writer.writerow([1, "Linus Torvalds", "Linux Kernel"])
writer.writerow([2, "Tim Berners-Lee", "World Wide Web"])
writer.writerow([3, "Guido van Rossum", "Python Programming"])
# Style
external_stylesheets = ['assets/style.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
# Layout
app.layout = html.Div([
html.Div([
dcc.Dropdown(
id='dropdown_div',
options=[
{'label': 'Quotes', 'value': 'quotes.csv'},
{'label': 'Innovators', 'value': 'innovators.csv'}
],
value='quotes.csv'
)
]),
html.Div([
dcc.Dropdown(
id='count_div'
)
])
])
# Callback function
@app.callback(
dash.dependencies.Output('count_div', 'options'),
[dash.dependencies.Input('dropdown_div', 'value')])
def loadfile(path):
df = pd.read_csv(path)
return [{'label': i, 'value': i} for i in df['Name'].drop_duplicates()]
# Main
if __name__ == '__main__':
app.run_server(debug=True)
我需要将第二个下拉列表的第一个值动态设置为其默认值。
在此示例中,第二个下拉列表将显示
- 当 Quotes 是第一个下拉列表的选定值时,Buddha 为默认值。
- 当创新者是第一个下拉列表的选定值时,Linus Torvalds 作为默认值。
解决办法是
- 向回调函数添加一个输出,将默认值发送到第二个 ddc.Dropdown
- 将默认值添加到
return
# Callback function
@app.callback(
[dash.dependencies.Output('count_div', 'options'),
dash.dependencies.Output('count_div', 'value')],
[dash.dependencies.Input('dropdown_div', 'value')])
def loadfile(path):
df = pd.read_csv(path)
return [{'label': i, 'value': i} for i in df['Name'].drop_duplicates()], df['Name'].drop_duplicates()[0]