Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Bokeh send additional parameters to widget event handler

I want to send additional data to a bokeh event handler (e.g. an on_change or on_click method). A minimal example that increments or decrements an integer is below (I run this app with 'bokeh serve --show app.py). I had to write separate event handlers that do almost identical things in this example. To write this app with just one event handler function, I need to pass additional data or the event handler must know the calling object. How do I do that?

from bokeh.plotting import curdoc
from bokeh.models.widgets import Button, Paragraph
from bokeh.layouts import widgetbox

minus = Button(label='-')
plus = Button(label='+')
text = Paragraph(text='0')

def minus_callback():
    text.text = str(int(text.text) - 1)

def plus_callback():
    text.text = str(int(text.text) + 1)

minus.on_click(minus_callback)
plus.on_click(plus_callback)
# I would prefer to just use one callback and pass additional data to it:
# minus.on_click(callback, action='decrement')
# plus.on_click(callback, action='increment')

layout = widgetbox(minus, plus, text)
curdoc().add_root(layout)
like image 698
Russell Burdt Avatar asked Jan 29 '17 22:01

Russell Burdt


1 Answers

The standard functools.partial facility that is built into python works fine with Bokeh callbacks.

from functools import partial
from bokeh.plotting import curdoc
from bokeh.models.widgets import Button, Paragraph
from bokeh.layouts import widgetbox

minus = Button(label='-')
plus = Button(label='+')
text = Paragraph(text='0')

def callback(foo):
    print(foo)

minus.on_click(partial(callback, foo="minus"))
plus.on_click(partial(callback, foo="plus"))

layout = widgetbox(minus, plus, text)
curdoc().add_root(layout)
like image 195
bigreddot Avatar answered Oct 21 '22 16:10

bigreddot