如何在Bokeh中镜像小部件?

时间:2018-05-08 13:32:41

标签: python python-3.x bokeh

想象一下,你有两对Bokeh小部件:

widget1 = widgetbox(input1=TextInput(...), multiselect1=MultiSelect(...))
widget2 = widgetbox(input2=TextInput(...), multiselect2=MultiSelect(...))

multiselect1multiselect2最初都填充了相同的选项,让我们说['apples', 'oranges', 'grapes']
两个输入input1input2用于收集用户的输入,并根据该输入过滤(更新)multiselect窗口小部件中的对象。
例如,如果用户在apples中输入input1multiselect1将会更新并仅显示apples,并放弃其他人。

问题是如何使两个小部件协同工作或者如果你愿意的话让它们相互镜像?因此,无论用户是在input1还是input2中输入文字,这两个小部件都会显示相同的对象。

我尝试将widget2创建为widget1的副本,认为两者都会引用同一个对象,因此,当对象更新时,引用widget1和{ {1}},将显示更新的对象,但它不起作用 我推测,当Bokeh在JavaScript中呈现Python代码时,它会为每个对象分配一个唯一的ID,从这里它们就变得独立了。 如果您有任何想法,请让我听听! 干杯!

1 个答案:

答案 0 :(得分:1)

stocks示例是一个很好的参考:

https://github.com/bokeh/bokeh/blob/master/examples/app/stocks/main.py

它正朝着相反的方向发展,即它正在从另一个中移除一个自动收报机中的任何内容,但原理是相同的,用您需要的任何内容更新窗口小部件的options属性。以下是stocks示例的相关部分:

DEFAULT_TICKERS = ['AAPL', 'GOOG', 'INTC', 'BRCM', 'YHOO']

def nix(val, lst):
    return [x for x in lst if x != val]

def ticker1_change(attrname, old, new):
    ticker2.options = nix(new, DEFAULT_TICKERS)
    update()

def ticker2_change(attrname, old, new):
    ticker1.options = nix(new, DEFAULT_TICKERS)
    update()

因此,如果用户从第一个选择中选择AAPL,那么AAPL将从第二个中删除。在您的情况下,您将在输入上进行回调,将选择选项适当地设置为您的用例。

如果这不在Bokeh服务器应用程序的上下文中,那么您也可以使用CustomJS callbacks而不是Python回调来完成相同的操作。