2016-07-14 24 views
7

我有一個Slider小部件的Bokeh應用程序,它使用Slider.on_change回調來更新我的圖形。但是,滑塊更新比我的回調函數可以處理得快得多,所以我需要一種方法來限制傳入的更改請求。這個問題非常突出,因爲滑塊在滑動過程中調用回調函數,而只有最後一個滑塊值(當用戶釋放鼠標時)纔是有意義的。在散焦應用程序中節流

我該如何解決這個問題?

回答

11

截至發行0.12這仍然有點笨重,但並非不可能。滑塊上有一個"mouseup"策略,但目前僅適用於CustomJS回調。但是,如果與「假」數據源相結合,能夠溝通,並觸發剛剛過去的值:

from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.plotting import figure 
from bokeh.models.callbacks import CustomJS 
from bokeh.models.sources import ColumnDataSource 
from bokeh.models.widgets import Slider 

# this is the real callback that we want to happen on slider mouseup 
def cb(attr, old, new): 
    print("UPDATE", source.data['value']) 

# This data source is just used to communicate/trigger the real callback 
source = ColumnDataSource(data=dict(value=[])) 
source.on_change('data', cb) 

# a figure, just for example 
p = figure(x_range=(0,1), y_range=(0,1)) 

# add a slider with a CustomJS callback and a mouseup policy to update the source 
slider = Slider(start=1, end=10, value=1, step=0.1, callback_policy='mouseup') 
slider.callback = CustomJS(args=dict(source=source), code=""" 
    source.data = { value: [cb_obj.value] } 
""") 

curdoc().add_root(column(slider, p)) 

# make sure to add the source explicitly 
curdoc().add_root(source) 

正如我所說的,這是不理想的。有一些開放功能請求可以改善這種情況。然而,這個團隊非常小,所以如果你有能力貢獻,請不要猶豫,伸出手(只有新的貢獻者可以幫助加快新功能的開發)

+0

感謝您的建議。怎麼樣創建一個工作線程,根據上次報告的值更新圖表?或者會引入線程安全問題?在那種情況下,我可以設置一個循環計時器來更新圖表嗎? (只是有些想法,因爲我預見了更多長時間運行的任務,不僅僅是滑塊更新造成的) – Emile

+1

這可能可行,但您需要學習/參閱[從線程更新](http:// bokeh)的用戶指南部分.pydata.org/en/0.12.0/docs/user_guide/server.html#updating-from-threads) – bigreddot

+0

此問題是否已在散景12.6中解決? – Thornhale