python-3.x - 从 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)
解决方案
推荐阅读
- r - SOM 奇怪的绘图代码,建模中有超过 14 个变量
- oracle - AWS RDS Oracle 数据泵错误 ORA-39001:参数值无效
- wordpress - Wordpress:如何在单独的子域上发布帖子(不是页面)?
- c# - 从 CSharp 中的 2D 列表中删除重复条目
- angular - 在没有 JPA 的情况下使用 Angular 2 & Spring Boot & PL/SQL
- python - Python 更新 rcParams 意外行为
- express - 在 electron 框架中使用 express JS 和 Vue.js
- c# - 如何获取字典中第一个键的名称?
- node.js - 将 # 作为密码存储在 .env 文件中
- linux - 将变量从 shell 脚本传递到配置文件