如何响应用户引起的事件与定期回调引起的事件不同?

时间:2019-05-12 01:33:01

标签: bokeh

更具体地说,我有一个滑块(我称为clock),其值随着周期性回调而增加:

clock = Slider(start=0, end=1000, value=0, step=1, title='clock')

def increase_slider_value():
    clock.value = (clock.value + 1) % 1000

period_ms = 50
curdoc().add_periodic_callback(increase_slider_value, period_ms)

当时钟值更改时,某些图的来源也会更新:

clock.on_change('value', update_sources)

使用补丁和时钟语句的if语句更新源非常昂贵且经过了相当优化。 如果回调改变了时钟,这可以很好地工作。但是,如果用户抓住滑块并将其移动到补丁周围,将不再创建所需的源,即创建源和垃圾图的无效状态。 我看到的解决此问题的唯一半优雅的方法是将用户引起的值更改与回调引起的值更改区别对待。用户引起的更新将需要对源进行新的计算,而定期回调将继续利用补丁。

A)这对您有意义吗?您是否批准?

B)如何获得clock.on_change(..)来区分触发更改的事件?是否有“滑块拖动”事件?

1 个答案:

答案 0 :(得分:2)

没有任何直接区分事件的方法。我建议您使用Throttling in Bokeh application中所述的稍微有点笨拙但可维护的方法。这有两个目的:

  • 您可以在“伪”数据源上指定与clock.on_change(...)不同的回调。

  • 您实际上可以将用户更新从滑块限制为仅“完成”状态,这样就不会不必要地频繁执行昂贵的回调。