首页 > 解决方案 > 从 Bokeh Multiselect 获取字符串值

问题描述

我的目标是创建一个 Bokeh 小部件框,您可以使用它来为表单提供输入,但是唯一允许我将输入从 Bokeh 的 javascript 端返回到 Python 变量的小部件是 RadioButtonGroups。否则,Multiselect、AutocompleteInput 和其他只能以整数形式返回我的输入。这是在 Jupyter NB 中使用 Python 和 Bokeh 0.13.0 完成的,如果您碰巧有任何问题或我遗漏了任何内容,请随时告诉我。

请看下面的代码:

import os, time, sys
from bokeh.layouts import widgetbox
from bokeh.models.widgets import RadioButtonGroup, Button, TextInput
from bokeh.models.widgets.inputs import MultiSelect
from bokeh.models.widgets import AutocompleteInput
from bokeh.models.callbacks import CustomJS
from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource
from bokeh.models.widgets.markups import Div
from bokeh.resources import INLINE
output_notebook(resources=INLINE)


ipies=[str(i.strip('.ipynb')) for i in os.listdir() if i.endswith('.ipynb')]
minutes=0
hours=0
days=0
months=0
daysmonth=0
days=0

minute_options=[str(i) for i in range(1,60)]
minute_options.append("*")
minute_callback = CustomJS(args=dict(a=minute_options), code="""   
    var options=a;
    console.log(options[parseInt(cb_obj.active)]);
    var ind=options[parseInt(cb_obj.active)];
    IPython.notebook.kernel.execute('minutes='+ind+'');
""")
minute_rbg = RadioButtonGroup(
        labels=minute_options, callback=minute_callback, active=len(minute_options)-1)
min_title=Div(text="Which minute on the hour, * for every minute")

hour_options=[str(i) for i in range(24)]
hour_options.append("*")
hour_callback = CustomJS(args=dict(a=hour_options), code="""   
    var options=a;
    console.log(options[parseInt(cb_obj.active)]);
    var ind=options[parseInt(cb_obj.active)];
    IPython.notebook.kernel.execute('hours='+ind+'');
""")
hour_rbg = RadioButtonGroup(
        labels=hour_options,callback=hour_callback,active=len(hour_options)-1)
hour_title=Div(text="Which hour in a day, * for every hour")

day_month_options=[str(i) for i in range(1,32)]
day_month_options.append("*")
day_month_callback = CustomJS(args=dict(a=day_month_options), code="""   
    var options=a;
    console.log(options[parseInt(cb_obj.active)]);
    var ind=options[parseInt(cb_obj.active)];
    IPython.notebook.kernel.execute('daysmonth='+ind+'');
""")
day_month_rbg = RadioButtonGroup(
        labels=day_month_options,callback=day_month_callback,active=len(day_month_options)-1)
day_month_title=Div(text="Which day in a month, * for every day of the month")

month_options=[str(i) for i in range(1,13)]
month_options.append("*")
month_callback = CustomJS(args=dict(a=month_options), code="""   
    var options=a;
    console.log(options[parseInt(cb_obj.active)]);
    var ind=options[parseInt(cb_obj.active)];
    IPython.notebook.kernel.execute('months='+ind+'');
""")
month_rbg = RadioButtonGroup(
        labels=month_options, callback=month_callback,active=len(month_options)-1)
month_title=Div(text="Which month in a year, * for every month")

day_week_options=[str(i) for i in range(7)]
day_week_options.append("*")
day_week_callback = CustomJS(args=dict(a=day_week_options), code="""   
    var options=a;
    console.log(options[parseInt(cb_obj.active)]);
    var ind=options[parseInt(cb_obj.active)];
    IPython.notebook.kernel.execute('days='+ind+'');
""")
day_week_rbg = RadioButtonGroup(
        labels=day_week_options, callback=day_week_callback, active=len(day_week_options)-1)
days_week_title=Div(text="Which day in a week, * for every day of the week")
import pandas as pd
ipies_pd = pd.DataFrame({"a":ipies})
#Selection source: IPIES CDS
cds = ColumnDataSource(data=ipies_pd)

#Selection source: autocompleteinput & multiselect widgets
selection_callback = CustomJS(args=dict(source=cds), code="""
    // THIS CALLBACK ONLY BRINGS BACK SELECTIONS IF THEY ARE INTEGERS
    var cbobj = cb_obj.value;
    IPython.notebook.kernel.execute("auto_c_value = "\"+ cbobj + "\");
    """)
ms = MultiSelect(title="power", callback=selection_callback, options=ipies)
auto_c=AutocompleteInput(completions=ipies, height=100, callback=selection_callback)


button_callback = CustomJS(code="""
    var cur_index = IPython.notebook.get_selected_index()+1;
    var end_index=IPython.notebook.ncells();
    IPython.notebook.execute_cell_range(IPython.notebook.get_selected_index()+1, IPython.notebook.ncells());
""")
button = Button(label="button~!", button_type="primary", callback=button_callback)

w_box = widgetbox(min_title, minute_rbg, hour_title, hour_rbg, day_month_title, day_month_rbg,
                 month_title, month_rbg,days_week_title, day_week_rbg, button,
                  ms, auto_c, width=800, sizing_mode='scale_both')

show(w_box)

标签: python-3.xjupyterbokeh

解决方案


推荐阅读