我想在滑块的2个回调策略," mouseup"one_answers" throttle"之间自由移动。
我可以从" mouseup"更改为"油门",但是当回调策略为"油门"时,似乎callback_policy属性的覆盖物无能为力,并且滑块仍处于"油门"模式中。
我在这里俯瞰一些东西吗?
from bokeh.layouts import column
from bokeh.models.callbacks import CustomJS
from bokeh.models.sources import ColumnDataSource
from bokeh.models.widgets import Slider, RadioButtonGroup
from bokeh.application.handlers import FunctionHandler
from bokeh.application import Application
# this is the real callback that we want to happen on slider mouseup
def modify_doc(doc):
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)
# 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] }
""")
def changeMode(attr, old, new):
if modeSelect.active==0:
slider.callback_policy='throttle'
print('settings adjusted to throttle')
print(slider.callback)
print(slider.callback_policy)
print(slider.callback_throttle)
else:
slider.callback_policy='mouseup'
print('settings adjusted to mouseup')
print(slider.callback)
print(slider.callback_policy)
print(slider.callback_throttle)
modeSelect = RadioButtonGroup(labels=["continuous", "on release"], active=1,button_type='success')
modeSelect.on_change('active', changeMode)
doc.add_root(column(modeSelect,slider))
handler = FunctionHandler(modify_doc)
app = Application(handler)
show(app)
在下面的代码中设置滑块元素上的callback_policy起作用,但只有一个方向:从"鼠标"到"油门"。将其设置回" MouseUp"没有任何效果。也许这是Bokeh v1.0.4中的一个错误,或者应该操纵Bokehjs模型中的更多属性。
from bokeh.layouts import column
from bokeh.models.callbacks import CustomJS
from bokeh.models.sources import ColumnDataSource
from bokeh.models.widgets import Slider, RadioButtonGroup
from bokeh.plotting import curdoc
source = ColumnDataSource(data = dict(value = []))
def cb(attr, old, new):
print("UPDATE", source.data['value'])
source.on_change('data', cb)
mode_select_callback = CustomJS(code = """
var slider = Bokeh.documents[0].get_model_by_name('my_slider')
if (cb_obj.active == 1)
slider.callback_policy = "mouseup"
else (cb_obj.active == 0)
slider.callback_policy = "throttle" """)
modeSelect = RadioButtonGroup(labels = ["continuous", "on release"], active = 1, button_type = 'default', width = 300)
modeSelect.callback = mode_select_callback
slider = Slider(start = 1, end = 10, value = 1, step = 0.1, callback_policy = 'mouseup', width = 200, name = 'my_slider')
slider.callback = CustomJS(args = dict(source = source), code = "source.data = { value: [cb_obj.value] }")
curdoc().add_root(column(modeSelect, slider))
在这种情况下,最简单的工作是用不同的callback_policy动态创建和删除滑块。请参阅下面的简化示例(Bokeh V1.0.4)
from bokeh.layouts import column
from bokeh.models.callbacks import CustomJS
from bokeh.models.sources import ColumnDataSource
from bokeh.models.widgets import Slider, RadioButtonGroup
from bokeh.plotting import curdoc
layout = column()
def create_slider(callback_policy):
slider = Slider(start = 1, end = 10, value = 1, step = 0.1, callback_policy = callback_policy, width = 200)
slider.callback = CustomJS(args = dict(source = source), code = "source.data = { value: [cb_obj.value] }")
return slider
def cb(attr, old, new): print("UPDATE", source.data['value'])
source = ColumnDataSource(data = dict(value = []))
source.on_change('data', cb)
slider = create_slider(callback_policy = 'mouseup')
def changeMode(attr, old, new):
global slider
if modeSelect.active == 0:
layout.children.remove(slider)
slider = create_slider(callback_policy = 'throttle')
layout.children.append(slider)
else:
layout.children.remove(slider)
slider = create_slider(callback_policy = 'mouseup')
layout.children.append(slider)
modeSelect = RadioButtonGroup(labels = ["continuous", "on release"], active = 1, button_type = 'default', width = 300)
modeSelect.on_change('active', changeMode)
layout.children.append(modeSelect)
layout.children.append(slider)
curdoc().add_root(layout)
两个示例都应使用bokeh serve --show app.py