将Bokeh Slider callback_policy从节流更改为mouseup无法正常工作

问题描述 投票:0回答:1

我想在滑块的两个回调策略,“mouseup”和“throttle”之间自由移动。

转而我可以从“mouseup”更改为“throttle”,但是当回调策略为“throttle”时,似乎覆盖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)
python callback bokeh
1个回答
1
投票

在下面的代码中设置了滑块元素上的callback_policy,但只有一个方向:从“mouseup”到“throttle”。将其设置回“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一起运行

© www.soinside.com 2019 - 2024. All rights reserved.