我正在尝试创建一个在两个不同的 Bokeh Tabs上复制的小部件过滤器(由TextInput
和组成) 。所需的功能是过滤结果应该保留在选项卡之间,无论哪个过滤器接收要过滤掉的文本。MultiSelect
下面的代码(它是工作代码)构建了Filter
实例化为filter1
和的小部件filter2
。回调是update
执行实际过滤并更新MultiSelect
过滤器部分的函数。
from bokeh.io import curdoc
from bokeh.layouts import column, widgetbox, row, layout, gridplot
from bokeh.models import Slider, Select, TextInput, MultiSelect
from bokeh.models.widgets import Panel, Tabs
import pandas as pd
from functools import partial
df = pd.DataFrame(["apples", "oranges", "grapes"], columns=["fruits"])
multiselect = None
input_box = None
def update(widget, attr, old, new):
print("df['fruits']: {}".format(list(df['fruits'])))
print("{} : {} changed: Old [ {} ] -> New [ {} ]".format(widget, attr, old, new))
if widget == 'input':
col_data = list(df[df['fruits'].str.contains(new)]['fruits'])
print("col_date: {}".format(col_data))
multiselect.update(options = sorted(list(col_data)))
def init():
global multiselect
multiselect = MultiSelect(title = 'multiselect',
name = 'multiselect',
value = [],
options = list(df["fruits"]))
multiselect.on_change('value', partial(update, multiselect.name))
global input_box
input_box = TextInput(title = 'input',
name ='input',
value='Enter you choice')
input_box.on_change('value', partial(update, input_box.name))
class Filter:
def __init__(self):
self.multiselect = multiselect
self.input_box = input_box
self.widget = widgetbox(self.input_box, self.multiselect)
init()
filter1 = Filter().widget
filter2 = Filter().widget
curdoc().add_root(row(filter1, filter2))
上面的代码生成/组装小部件,如下所示:
此外,两个镜像过滤器的功能也随心所欲;在其中一个框中输入文本时,结果将显示在两个过滤器上。
现在,这是我需要帮助的地方,我想要具有相同功能的相同过滤器,但我需要在两个不同的选项卡中使用它们;一个选项卡中的一个过滤器和另一个选项卡中的另一个过滤器。
用于构建两个选项卡结构的代码是:
p1 = Panel(child = filter1, title = "Panel1")
p2 = Panel(child = filter2, title = "Panel2")
tabs = Tabs(tabs=[ p1, p2 ])
curdoc().add_root(layout(tabs))
在结果方面,代码保留了所需的功能,但过滤器显示在同一页面上。不仅如此,甚至还没有构建面板/选项卡。
知道缺少什么吗?(如果您想使用代码,如果您安装了散景,它应该可以立即工作。)