如何捕获Bokeh TextInput小部件上的回调函数调用返回的结果?

时间:2018-03-30 22:51:40

标签: python bokeh bokehjs

我正在开发一个Bokeh应用程序,除其他小部件外,还有TextInputMultiSelect。 (由于Bokeh没有本机搜索小部件,我尝试构建一个具有输入框的框和一个框,以显示基于输入字段的dB查询返回的结果。)

TextInput框的代码为ask_fruitMultiSelect用于显示dB查询返回的结果。 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

行动将如下所示:

enter image description here

1 个答案:

答案 0 :(得分:1)

您需要为多选widger的.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))