2017-10-20 51 views
0

目前,我有一个DateRangeSlider。我想记录滑块的较低范围和较高范围的更改。我遇到了一个解释'mouseup'callback_policy的答案。但是,这会将变化限制在一个滑块上。所以,我想等一段时间才能读取更改后的值,以便我可以记录新的下限和上限。这怎么能实现?Python Bokeh:范围为滑块的回调超时

以下代码一次更改较低范围或较高范围。

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年5月5日2017年7月22日

回调

2017-05-26 2017-07-22

而且,这是我想达到的目标:

回调的变化发生

2017年5月5日2017年7月22日

回答

1

散景回调立即执行,所以实际上没有什么好方法可以通过范围本身的回调来实现你想要的(它们总是会独立启动,以便更改为不同的滑块句柄)。我可以提前建议的最好的事情就是在滑块上进行回调,而是有一个“更新”按钮,该按钮具有使用滑块值的回调,可以在准备应用更改时使用该回调。

0

您可以存储范围滑块的值,并且只有当两个值都与存储值不同时,回调才会执行操作,然后使用新值更新存储的值。

与bigreddot建议的按钮相比,这样做的不利之处在于,您每次需要选择新范围时都需要更改这两个值。好处是你不需要一个按钮。