Как отразить виджеты в боке? - PullRequest
0 голосов
/ 08 мая 2018

Представьте, что у вас есть две пары виджетов 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 и widget2, отобразит обновленный объект, но он не работает.
Я предполагаю, что когда Bokeh отображает код Python в JavaScript, он присваивает уникальный идентификатор каждому объекту, и с этого момента они становятся независимыми. Если у вас есть идея, пожалуйста, дайте мне ее услышать!
Ура!

1 Ответ

0 голосов
/ 08 мая 2018

Пример 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 обратными вызовами вместо обратных вызовов Python.

...