gpt4 book ai didi

python - 带有自定义选项的 Dash 动态下拉菜单

转载 作者:行者123 更新时间:2023-12-04 12:56:21 24 4
gpt4 key购买 nike

我正在尝试创建一个下拉菜单,上面写着“今天”、“昨天”、“过去 7 天”和“自定义”。当我在下拉菜单中选择一个选项时,我希望日历自动更新。对于“自定义”,我想拉出日历,这样我就可以选择我想要的任何日期。这是示例代码:

import dash
import dash_core_components as dcc
import dash_html_components as html
from datetime import date as dt, timedelta
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output

app = dash.Dash(external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div([
dcc.Dropdown(
id = 'timeframe_dropdown',
multi = False,
options = [
{'label': 'Today', 'value': 'Today'},
{'label': 'Yesterday', 'value': 'Yesterday'},
{'label': 'Last 7 days', 'value': 'Last 7 days'},
{'label': 'Custom', 'value': 'None'}
],
value='Today',
clearable=False,
),
dcc.DatePickerRange(
id='datepicker',
display_format='DD-MM-YYYY',
first_day_of_week=1,
min_date_allowed=dt(2019, 1, 1),
max_date_allowed=dt(2021, 2, 28),
),
])

@app.callback(
[Output('datepicker', 'start_date'), # This updates the field start_date in the DatePicker
Output('datepicker', 'end_date')], # This updates the field end_date in the DatePicker
[Input('timeframe_dropdown', 'value')],
)
def updateDataPicker(dropdown_value):
if dropdown_value == 'Today':
return dt.today(), dt.today()
elif dropdown_value == 'Yesterday':
return dt.today() - timedelta(1), dt.today() - timedelta(1)
elif dropdown_value == 'Last 7 days':
return dt.today() - timedelta(6), dt.today()
elif dropdown_value == 'Custom':
return None
else:
return dt.today() - timedelta(6), dt.today()

if __name__ == '__main__':
app.run_server(host="0.0.0.0")
下拉菜单和日历显示在该代码上,但是,它们没有链接在一起。当我选择其他选项时,日历中的日期不会改变,默认情况下它只是停留在今天的日期。

最佳答案

你快到了,只是两个小错误。
在您的下拉列表中,您正在向下拉列表中添加一个新选项 {'label': 'Custom', 'value': 'None'} .但是,您将其值设置为 None .下拉值是我们在回调函数中作为输入接收的值 [Input('timeframe_dropdown', 'value')] .所以在你的 if 语句中你正在检查 elif dropdown_value == 'Custom': .永远不会出现这种情况,因为您将自定义标签设置为具有值 None .
另一个小错误是我们声明了两个 Output回调中的值,都是 start_dateend_date ,所以我们需要总是返回两个值。 elif dropdown_value == 'Custom': return None应该改为 elif dropdown_value == 'Custom': return None, None .
带有修复的完整代码:

import dash
import dash_core_components as dcc
import dash_html_components as html
from datetime import date as dt, timedelta
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output

app = dash.Dash(external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div([
dcc.Dropdown(
id = 'timeframe_dropdown',
multi = False,
options = [
{'label': 'Today', 'value': 'Today'},
{'label': 'Yesterday', 'value': 'Yesterday'},
{'label': 'Last 7 days', 'value': 'Last 7 days'},
{'label': 'Custom', 'value': 'Custom'}
],
value='Today',
clearable=False,
),
dcc.DatePickerRange(
id='datepicker',
display_format='DD-MM-YYYY',
first_day_of_week=1,
min_date_allowed=dt(2019, 1, 1),
max_date_allowed=dt(2021, 2, 28),
),
])

@app.callback(
[Output('datepicker', 'start_date'), # This updates the field start_date in the DatePicker
Output('datepicker', 'end_date')], # This updates the field end_date in the DatePicker
[Input('timeframe_dropdown', 'value')],
)
def updateDataPicker(dropdown_value):
if dropdown_value == 'Today':
return dt.today(), dt.today()
elif dropdown_value == 'Yesterday':
return dt.today() - timedelta(1), dt.today() - timedelta(1)
elif dropdown_value == 'Last 7 days':
return dt.today() - timedelta(6), dt.today()
elif dropdown_value == 'Custom':
return None, None
else:
return dt.today() - timedelta(6), dt.today()

if __name__ == '__main__':
app.run_server()

关于python - 带有自定义选项的 Dash 动态下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66590162/

24 4 0