iPyWidget-DatePicker与SelectionRangeSlider交互问题



我正在尝试将DatePicker与SelectionRangeSlider小部件交互。到目前为止,我可以设法将滑块与DatePicker链接起来,但我遇到了相反的问题。

使用此代码,周期滑块将更新DatePicker:

from datetime import datetime
import pandas as pd
import ipywidgets as widgets
start_date = datetime(2021, 7, 1)
end_date = datetime(2021, 7, 5)
dates = pd.date_range(start_date, end_date, freq='D')
options = [(date.strftime(' %d %b %Y '), date) for date in dates]
pick_start = widgets.DatePicker(
description='',
disabled=False,
value = start_date
)
pick_end = start_day = widgets.DatePicker(
description='',
disabled=False,
value=end_date
)
selection_range_slider = widgets.SelectionRangeSlider(
options=options,
index=(0, len(options) - 1),
description='Period',
orientation='horizontal',
layout=widgets.Layout(width='100%', padding='35px')
)

def update_pick(*args):
pick_start.value = datetime.strptime(selection_range_slider.value[0].strftime("%Y-%m-%d"), "%Y-%m-%d")
pick_end.value = datetime.strptime(selection_range_slider.value[1].strftime("%Y-%m-%d"), "%Y-%m-%d")
def update_slider(*args):
selection_range_slider.value[0] =  pick_start.value.strftime("%Y-%m-%d")
selection_range_slider.value[1] =  pick_end.value.strftime("%Y-%m-%d")
selection_range_slider.observe(update_pick, 'value')
pick_start.observe(update_slider, 'value')
pick_end.observe(update_slider, 'value')
center_layout = widgets.Layout(display='flex',
align_items='center',
width='100%')
day = widgets.HBox(children=[pick_start, selection_range_slider, pick_end], layout=center_layout)
display(day)

也尝试使用此功能,但没有结果:

def update_slider(*args):
start_date = datetime(pick_start.value.year, pick_start.value.month, pick_start.value.day)
end_date = datetime(pick_end.value.year, pick_end.value.month, pick_end.value.day)
dates = pd.date_range(start_date, end_date, freq='D')
options = [(date.strftime(' %d %b %Y '), date) for date in dates]

selection_range_slider.value[0] =  options[0]
selection_range_slider.value[1] =  options[len(options)-1]

需要帮助将DatePicker与SelectionRangeSlider 交互

谢谢!

您在这里创建了一个独立的问题,做得很好,谢谢。为您的下一个问题提供一些建议,以加快答案。

  1. 请包括您的导入,没有它们我无法运行您的代码:
from datetime import datetime
import pandas as pd
import ipywidgets as widgets
  1. 请发布代码运行时看到的任何错误消息。我得到了一个ValueError,它会进一步改进问题

错误表示分配元组的索引时出现问题,这是我的解决方案。

  • 直接分配整个元组,不能先更新selection_range_slider的索引0,然后更新索引1

  • 使用原始日期时间在小部件之间传递,您的混合字符串转换导致了一些问题。您仍然可以使用字典作为选项来更改日期在滑块中的显示方式。

from datetime import datetime
import pandas as pd
import ipywidgets as widgets
start_date = datetime(2021, 7, 1)
end_date = datetime(2021, 7, 5)
dates = pd.date_range(start_date, end_date, freq='D')
options = {date.strftime(' %d %b %Y '): date for date in dates}
pick_start = widgets.DatePicker(
description='',
disabled=False,
value = start_date
)
pick_end = start_day = widgets.DatePicker(
description='',
disabled=False,
value=end_date
)
selection_range_slider = widgets.SelectionRangeSlider(
options=options,
index=(0, len(options) - 1),
description='Period',
orientation='horizontal',
layout=widgets.Layout(width='100%', padding='35px')
)

def update_pick(*args):
pick_start.value = selection_range_slider.value[0]
pick_end.value = selection_range_slider.value[1]
def update_slider(*args):
selection_range_slider.value =  (pick_start.value, pick_end.value)
selection_range_slider.observe(update_pick, 'value')
pick_start.observe(update_slider, 'value')
pick_end.observe(update_slider, 'value')
center_layout = widgets.Layout(display='flex',
align_items='center',
width='100%')
day = widgets.HBox(children=[pick_start, selection_range_slider, pick_end], layout=center_layout)
display(day)

最新更新