将Bokeh Slider Callback_policy从油门更改为鼠标UP不起作用



我想在滑块的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

运行

最新更新