Python: как сделать множественный выбор в боке? - PullRequest
0 голосов
/ 21 мая 2019

Я бы хотел выбрать подраздел из списка.

У меня есть такой фрейм данных.

df = pd.DataFrame()
df['People'] = ['Eva', 'John', 'Paul','Mr a', 'Miss b', 'Mrs c' ]
df['Type']   = ['Students', 'Students', 'Students', 'Teachers', 'Teachers', 'Teachers']

Допустим, у нас есть Student и Teachers.

select  =  Select(title="People",  options=['Student', 'Teachers' ])

Тогда у нас есть три ученика: Eva, John, Paul и три учителя Mr a, Miss b и Mrs c

Как мы можем создатьвторой выбор select2, который выбирает Eva, John, Paul, если мы выбираем учителей, и Mr a, Miss b и Mrs c, если мы выбираем Teachers.

select2  =  Select(title="Selected",  options=[ (`Eva`, `John`, `Paul`), (Mr a`, `Miss b`, `Mrs c`)] ])

Это то, что я имею в виду

select_data = Select(title="Type",  options=['None', 'Students', 'Teachers' ], value = '')
dynamic_select = Select(title = 'People', value = ''  , 
                        options = ['None','Eva', 'John', 'Paul','Mr a', 'Miss b', 'Mrs c' ] )
controls = widgetbox(select_data, dynamic_select)
layout = column(row(controls))

def update_layout(attr, old, new):
        if select_data.value == 'Students':
            dynamic_select = Select(title = 'People', value = '', options = ['Eva', 'John', 'Paul'])
        if select_data.value == 'Teachers':
            dynamic_select = Select(title = 'People', value = '', options = ['Mr a', 'Miss b', 'Mrs c'])
        if select_data.value == 'None':
            dynamic_select = Select(title = 'People', value = '', options = ['None'])     


select_data.on_change('value', update_layout)
dynamic_select.on_change('value', update_layout)
curdoc().add_root(layout)

1 Ответ

1 голос
/ 22 мая 2019

С помощью этого кода вы можете динамически добавлять / удалять второй Select виджет.Это то, что вы хотели?

from bokeh.plotting import curdoc, show
from bokeh.models import Select, Column, Div
from datetime import datetime, timedelta
import numpy as np

students = ['Eva', 'John', 'Paul']
teachers = ['Mr a', 'Miss b', 'Mrs c']
select_data = Select(title="People",  options=['', 'Students', 'Teachers' ], value = '')
layout = Column(select_data)

def update_layout(attr, old, new):
    if new:
        if len(layout.children) > 1 and layout.children[len(layout.children) - 1].title != new:
            layout.children.remove(layout.children[len(layout.children) - 1])

        options = students if new == 'Students' else teachers
        dynamic_select = Select(title = '{}'.format(new), value = '', options = options)
        layout.children.append(dynamic_select)

select_data.on_change('value', update_layout)
curdoc().add_root(layout)

enter image description here

...