想象一下,你有两对Bokeh小部件:
widget1 = widgetbox(input1=TextInput(...), multiselect1=MultiSelect(...))
widget2 = widgetbox(input2=TextInput(...), multiselect2=MultiSelect(...))
multiselect1
和multiselect2
最初都填充了相同的选项,让我们说['apples', 'oranges', 'grapes']
。
两个输入input1
和input2
用于收集用户的输入,并根据该输入过滤(更新)multiselect
窗口小部件中的对象。
例如,如果用户在apples
中输入input1
,multiselect1
将会更新并仅显示apples
,并放弃其他人。
问题是如何使两个小部件协同工作或者如果你愿意的话让它们相互镜像?因此,无论用户是在input1
还是input2
中输入文字,这两个小部件都会显示相同的对象。
我尝试将widget2
创建为widget1
的副本,认为两者都会引用同一个对象,因此,当对象更新时,引用widget1
和{ {1}},将显示更新的对象,但它不起作用
我推测,当Bokeh在JavaScript中呈现Python代码时,它会为每个对象分配一个唯一的ID,从这里它们就变得独立了。
如果您有任何想法,请让我听听!
干杯!
答案 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回调来完成相同的操作。