Updating DateRangeSlider widget based on value of DiscreteSlider widget

Hi all,

I’m trying to update the year in a DateRangeSlider based on the value of a DiscreteSlider, with no luck. (The parameters of the DateRangeSlider do not update when I move the DiscreteSlider. Also, when I employ .param.trigger('value') it raises a ValueError: Date 'start' only takes datetime types, although I do employ datetime.)

My code is below. Any pointers would be greatly appreciated.

#Importing
import panel as pn
import datetime as dt
pn.extension()

#DiscreteSlider widget
pnDiscreteSlider = pn.widgets.DiscreteSlider(name='Study Year', options=[2025,2030],value=2025)

#DateRangeSlider widget
pnDateRangeSlider = pn.widgets.DateRangeSlider(
    name='Date Range',
    start=dt.datetime(pnDiscreteSlider.value,1,1),
    end=dt.datetime(pnDiscreteSlider.value,12,31),
    value=(dt.datetime(pnDiscreteSlider.value,1,1),dt.datetime(pnDiscreteSlider.value,12,31)),
)

#Attempting to update the year of the DateRangeSlider when pn.DiscreteSlider.value is changed
def callback(event):
    pnDateRangeSlider.start = dt.datetime(event.new,1,1),
    pnDateRangeSlider.end = dt.datetime(event.new,12,31),
    pnDateRangeSlider.value = (pnDateRangeSlider.start,pnDateRangeSlider.end)

watcher = pnDiscreteSlider.param.watch(callback,'value')

#Panel
pn.Column(pnDiscreteSlider, pnDateRangeSlider)
##pnDiscreteSlider.param.trigger('value') #Yields: ValueError: Date 'start' only takes datetime types.

Guided by the SciPy tutorial, I got it working using @pn.depends rather than param.watch.

#Importing
import panel as pn
import datetime as dt
pn.extension()

#Widget 1: DiscreteSlider
pnDiscreteSlider = pn.widgets.DiscreteSlider(name='Study Year', options=[2025,2030],value=2025)

#Widget 2: DateRangeSlider, which changes when pn.DiscreteSlider.value changes
@pn.depends(pnDiscreteSlider.param.value)
def callback(value):
    dtStart = dt.datetime(value,1,1)
    dtEnd = dt.datetime(value,12,31)
    pnDateRangeSlider = pn.widgets.DateRangeSlider(
    name='Date Range',
    start=dtStart,
    end=dtEnd,
    value=(dtStart,dtEnd)
    )
    return pnDateRangeSlider

#Panel
Pn = pn.Column(pnDiscreteSlider, callback)
Pn.show()

That’s really odd though, I’ll have to look into it more.

Oh it’s really not that odd, in your previous code you had trailing commas when setting the parameters:

    pnDateRangeSlider.start = dt.datetime(event.new,1,1),
    pnDateRangeSlider.end = dt.datetime(event.new,12,31),

A trailing comma declares a tuple so the types didn’t match. If you just removed the trailing commas you’d be fine:

    pnDateRangeSlider.start = dt.datetime(event.new,1,1)
    pnDateRangeSlider.end = dt.datetime(event.new,12,31)

Thanks very much, Philipp. Your fix works.