2016-07-06 32 views
0

В bokeh, я хотел бы настроить возможные варианты в одном Select виджетах в зависимости от выбранного значения в другом Select виджета. Мой минимально не-рабочий пример выглядит следующим образом:взаимозависимые виджеты в bokeh

from bokeh.io import output_notebook, show 
from bokeh.layouts import column 
from bokeh.models import CustomJS, ColumnDataSource 
from bokeh.models.widgets import Select 

output_notebook() 

# data source 
foods = {'fruit': ['apple', 'orange', 'cherry'], 
     'veg': ['carrot', 'celery']} 

source = ColumnDataSource(data=foods) 

def change_options_in_choice2(source=source): 
    '''this is probably the place for magic''' 
    f = cb_obj.get('value') 
    print(f) 

# first choice 
choice1 = Select(title="food group:", value='fruit', 
       options=list(foods.keys()), 
       callback=CustomJS.from_py_func(change_options_in_choice2)) 

# options for second choice depend on choice in first choice 
choice2 = Select(title='food items:', value='apple', 
       options=foods['fruit']) 


# merge them 
show(column(choice1, choice2)) 

Как это, я могу выбрать только среди яблок, апельсины или вишен для моих продуктов питания, даже если я переключаю группу еды к овощу. Почему-то я надеюсь, что смогу обновить возможные варианты в choice2, используя обратный вызов в choice1. Как мне это сделать?

+1

Установите '.options' в новый список параметров. Вот пример приложения, который делает это в python: https://github.com/bokeh/bokeh/blob/master/examples/app/stocks/main.py#L99-L105, но основной вопрос одинаков для обратного вызова CustomJS , – bigreddot

+0

Спасибо, что сработало для меня. Я не знаю, как это сделать в CustomJS, но решение для сервера bokeh подходит для моих целей. – DrSAR

ответ

1

Вдохновленный комментарием Брайана (bigreddot's) Я успешно пробовал это. Он может обслуживаться bokeh serve main.py

''' 
with inspiration from 
https://github.com/bokeh/bokeh/blob/master/examples/app/stocks/main.py 
''' 
from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.models.widgets import Select 
# data source 
foods = {'fruit': ['apple', 'orange', 'cherry'], 
     'veg': ['carrot', 'celery']} 
def change_options_in_choice2(attrname, old, new): 
    '''this is probably the place for magic''' 
    choice2.options = foods[new] 
# first choice 
choice1 = Select(title="food group:", value='fruit', 
       options=list(foods.keys())) 
choice1.on_change('value', change_options_in_choice2) 
# options for second choice depend on choice in first choice 
choice2 = Select(title='food items:', value='apple', 
       options=foods['fruit']) 
widgets = column(choice1, choice2) 
# initialize 
curdoc().add_root(widgets) 
curdoc().title = "Eat healthy!" 
Смежные вопросы