7
我有一個Slider小部件的Bokeh應用程序,它使用Slider.on_change回調來更新我的圖形。但是,滑塊更新比我的回調函數可以處理得快得多,所以我需要一種方法來限制傳入的更改請求。這個問題非常突出,因爲滑塊在滑動過程中調用回調函數,而只有最後一個滑塊值(當用戶釋放鼠標時)纔是有意義的。在散焦應用程序中節流
我該如何解決這個問題?
我有一個Slider小部件的Bokeh應用程序,它使用Slider.on_change回調來更新我的圖形。但是,滑塊更新比我的回調函數可以處理得快得多,所以我需要一種方法來限制傳入的更改請求。這個問題非常突出,因爲滑塊在滑動過程中調用回調函數,而只有最後一個滑塊值(當用戶釋放鼠標時)纔是有意義的。在散焦應用程序中節流
我該如何解決這個問題?
截至發行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)
正如我所說的,這是不理想的。有一些開放功能請求可以改善這種情況。然而,這個團隊非常小,所以如果你有能力貢獻,請不要猶豫,伸出手(只有新的貢獻者可以幫助加快新功能的開發)
感謝您的建議。怎麼樣創建一個工作線程,根據上次報告的值更新圖表?或者會引入線程安全問題?在那種情況下,我可以設置一個循環計時器來更新圖表嗎? (只是有些想法,因爲我預見了更多長時間運行的任務,不僅僅是滑塊更新造成的) – Emile
這可能可行,但您需要學習/參閱[從線程更新](http:// bokeh)的用戶指南部分.pydata.org/en/0.12.0/docs/user_guide/server.html#updating-from-threads) – bigreddot
此問題是否已在散景12.6中解決? – Thornhale