Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bokeh widget callback to select all checkboxes

Tags:

python

bokeh

I have run into a couple problems in trying to setup a Bokeh CheckboxGroup widget. The Checkbox group it self is large (50 states) and I would like to initialize the selection as all active.

Also (and more importantly) since this group is intended to be highly interactive, I would like to add buttons to "Select All" and "Clear All". I understand that I will need some callback mechanism to do this, but after searching the examples, documentation and stackoverflow, was not able to figure out just how. I include a simplified version of my code below. My preference is to use the standard widget Callback rather than the JS callback.

Any help appreciated!

from bokeh.plotting import curdoc, output_file
from bokeh.models.widgets import Button, CheckboxGroup
from bokeh.layouts import widgetbox, row
from bokeh.models import ColumnDataSource, Callback 

output_file("states.html", title="states")

states = ["Alabama", "Alaska ", "Arizona", "Arkansas", "California", \
        "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", \
        "Hawaii", "Idaho ", "Illinois", "Indiana", "Iowa", "Kansas", \
        "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", \
        "Michigan ", "Minnesota", "Mississippi", "Missouri", "Montana",\
        "Nebraska", "Nevada ", "New Hampshire", "New Jersey",\
        "New Mexico", "New York", "North Carolina", "North Dakota", \
        "Ohio", "Oklahoma","Oregon", "Pennsylvania", "Rhode Island", \
        "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah",\
        "Vermont", "Virginia","Washington", "West Virginia", \
        "Wisconsin", "Wyoming"]

states = CheckboxGroup(
        labels = states,
        active=[0,1])

select_all = Button(label="select all")
# need some help here

group = widgetbox(select_all, states)

layout = row(group)

curdoc().add_root(layout)
curdoc().title = "states"
like image 565
Mack Shippen Avatar asked Feb 06 '23 02:02

Mack Shippen


1 Answers

The basic function of the Bokeh server is to keep all Bokeh objects in sync on both the Python and JS sides. The active property of the CheckboxGroup specifies which boxed are checked, at all times, not just initialization. So to check all the boxes, you only need to set it appropriately in the callback:

from bokeh.plotting import curdoc, output_file
from bokeh.models.widgets import Button, CheckboxGroup
from bokeh.layouts import widgetbox, row
from bokeh.models import ColumnDataSource, Callback

output_file("states.html", title="states")

states_list = ["Alabama", "Alaska ", "Arizona", "Arkansas", "California", \
        "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", \
        "Hawaii", "Idaho ", "Illinois", "Indiana", "Iowa", "Kansas", \
        "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", \
        "Michigan ", "Minnesota", "Mississippi", "Missouri", "Montana",\
        "Nebraska", "Nevada ", "New Hampshire", "New Jersey",\
        "New Mexico", "New York", "North Carolina", "North Dakota", \
        "Ohio", "Oklahoma","Oregon", "Pennsylvania", "Rhode Island", \
        "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah",\
        "Vermont", "Virginia","Washington", "West Virginia", \
        "Wisconsin", "Wyoming"]

states = CheckboxGroup(
        labels = states_list,
        active=[0,1])

select_all = Button(label="select all")

def update():
    states.active = list(range(len(states_list)))
select_all.on_click(update)

group = widgetbox(select_all, states)

layout = row(group)

curdoc().add_root(layout)
curdoc().title = "states"
like image 177
bigreddot Avatar answered Feb 08 '23 15:02

bigreddot