Как захватить результат, возвращаемый вызовом функции обратного вызова в виджете Bokeh TextInput?
Я работаю над приложением Bokeh, которое, среди других виджетов, имеет TextInput
и MultiSelect
, (Поскольку в Bokeh нет собственного виджета поиска, я пытаюсь создать виджет, в котором есть поле для ввода и поле для отображения результатов, возвращаемых запросом в дБ на основе поля ввода.)
Код для TextInput
коробка ask_fruit
а также MultiSelect
используется для отображения результатов, возвращаемых запросом в дБ callback
функция используется TextInput
является db_query
,
def SearchDisplay():
ask_fruit = TextInput(value="Enter fruit name here",
title="Input box:"
)
ask_fruit.on_change("value", db_query)
available_fruits = MultiSelect(title=None,
value=["All"],
options=[]
)
return [ask_fruit, available_fruits]
def db_query(attr, old, new):
#conn = pyodbc.connect('fruit-db', autocommit=True)
#curs = conn.cursor()
#query = "select fruit_id from fruitdB"
#curs.execute(query)
#fruit_list = curs.fetchall()
fruit_list = ["Fuji", "Gala", "McIntosh"]
return fruit_list
Вопрос в том, как заселить MultiSelect
виджет с результатами, возвращаемыми обратным вызовом?
Можно ли просто сделать options=[ask_fruit.on_change("value", db_query)]
в коде для MultiSelect
?
Действие будет выглядеть так:
1 ответ
Вам нужно установить новое значение для .options
свойство мультиселектора виджета, и он автоматически синхронизируется с внешним интерфейсом:
from bokeh.io import curdoc
from bokeh.layouts import widgetbox
from bokeh.models.widgets import MultiSelect, TextInput
# ------------------ WIDGETS -------------------- #
ask_fruit = TextInput(
value='Enter fruit name here',
title='Input box:',
)
available_fruits = MultiSelect(
title=None,
value=[],
options=[]
)
# ------------------ EVENTS ---------------------- #
def db_query(attr, old, new):
# [...]
available_fruits.update(
options=[
("foo", "Foo"), ("bar", "BAR"),
("baz", "bAz"), ("quux", "quux")
]
)
ask_fruit.on_change('value', db_query)
def on_change_value_available_fruits(attr, old, new):
print('-- VALUE CHANGED TO: {}'.format(new))
available_fruits.on_change('value', on_change_value_available_fruits)
curdoc().add_root(widgetbox(ask_fruit, available_fruits))