目前,我有一个DateRangeSlider。我想记录滑块的较低范围和较高范围的变化。我找到了一个答案,解释了关于鼠标的问题。 callback_policy。但是,这会立即将更改限制为其中一个滑块。因此,我想在读取更改的值之前等待一段时间,以便我可以记录新的较低范围和较高范围。如何实现这一目标?
以下代码一次更改较低范围或较高范围。
from datetime import date
from bokeh.models.widgets import DateRangeSlider
from bokeh.layouts import layout
from bokeh.models import CustomJS
from bokeh.models.sources import ColumnDataSource
from bokeh.io import curdoc
date_range_slider = DateRangeSlider(title="Date Range: ", start=date(2017, 1, 1), end=date.today(), value=(date(2017, 9, 7), date(2017, 10, 15)), step=1, callback_policy='mouseup')
def cb(attr, old, new):
print "Callback"
print date_range_slider.value_as_datetime[0].strftime("%Y-%m-%d"), date_range_slider.value_as_datetime[1].strftime("%Y-%m-%d")
source = ColumnDataSource(data=dict(value=[]))
source.on_change('data', cb)
date_range_slider.callback = CustomJS(args=dict(source=source), code="""
source.data = { value: [cb_obj.value] } """)
sizing_mode = 'fixed'
l = layout(children=[[date_range_slider]],sizing_mode='fixed')
curdoc().add_root(l)
curdoc().title = "DateRangeSlider"
curdoc().add_root(source)
更改服务器上的滑块值后,我得到以下输出:
回调
2017-05-05 2017-07-22
回调
2017-05-26 2017-07-22
而且,这就是我想要实现的目标:
回调
2017-05-05 2017-07-22
答案 0 :(得分:1)
随着更改的发生,Bokeh回调会立即执行,所以没有任何好的方法可以通过范围本身的回调来完成您想要的任何操作(它们将始终独立触发,以便更改为不同的滑块手柄)。我可以随意指出的最好的事情是在滑块上有回调,但是有一个“更新”按钮,它有一个使用滑块值的回调,当它们准备好应用更改时可以按下。
答案 1 :(得分:0)
您可以存储范围滑块的值,并且仅当两个值与存储值不同时才使回调执行填充,然后使用新值更新存储的值。
与bigreddot建议按钮相比,这样做的缺点是,每次要选择新范围时,您都需要更改这两个值。好处是你不需要按钮。
答案 2 :(得分:0)