Python Bokeh向widget事件处理程序发送其他参数

时间:2017-01-29 22:05:42

标签: python events bokeh

我想将其他数据发送到散景事件处理程序(例如on_change或on_click方法)。下面是一个递增或递减整数的最小示例(我使用' bokeh服务--show app.py运行此应用程序)。我必须编写单独的事件处理程序,在这个例子中做几乎相同的事情。要使用一个事件处理函数编写此应用程序,我需要传递其他数据或事件处理程序必须知道调用对象。我该怎么做?

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)

2 个答案:

答案 0 :(得分:7)

python中内置的标准functools.partial工具可以很好地处理Bokeh回调。

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)

答案 1 :(得分:0)

扩展到@bigreddot's answer,此代码将更新后的值输出到text对象的Paragraph属性。

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


def callback(update):
    text.text = str(int(text.text) + update)


minus = Button(label='-')
plus = Button(label='+')
text = Paragraph(text='0')
minus.on_click(partial(callback, update=-1))
plus.on_click(partial(callback, update=+1))

layout = column(minus, plus, text)
curdoc().add_root(layout)