Смена слайдера Bokeh callback_policy с газа на мышку не работает

ArrayIndexOutOfBoundsException само имя объясняет, что если вы пытаетесь получить доступ к значению в индексе, который выходит за рамки размера массива, возникает такое исключение.

В вашем случае вы можете просто удалить знак равенства из цикла for.

for(int i = 0; i<name.length; i++)

Лучшим вариантом является итерация массива:

for(String i : name )
      System.out.println(i);
0
задан EddyG 4 March 2019 в 12:46
поделиться

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

0
ответ дан Tony 4 March 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: