不要使用交互式小部件

时间:2017-11-01 19:45:44

标签: python callback widget bokeh

CustomJS.from_py_func(回调)效果不佳。 我可以显示图形和小部件,但我无法很好地处理回调函数。

---示例代码

from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.plotting import Figure, output_file, show
from bokeh.models.widgets import Button

reset_output()
#output_file("button.html",mode="inline")
output_notebook(resources=INLINE)

x = [x for x in range(0, 10)]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

def line_visible(arg):
    if arg == 1: ll.visible = True
    else: ll.visible = False

plot = Figure(plot_width=200, plot_height=200)
ll = plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
line_visible(1) # visible = True: work well! line_visible(0) is OK, too.

def callback(source=source, window=None):
    data = source.data
    act = cb_obj.get('active') # 0:CHG,1:DSP,2:NOT
    if 0 in act: # CHG work well
        x, y = data['x'], data['y']
        for i in range(len(x)):
            x[i] = x[i]*1.1
            y[i] = y[i]*2.0
    if 1 in act: line_visible(1) # DSP: ?
    if 2 in act: line_visible(0) # NOT:visible=False: don't work.
    source.change.emit()

toggle1 = CheckboxButtonGroup(labels=["CHG","DSP","NOT"],
    active=[], # all are not active: if active=[0,1,2], all are active
    callback=CustomJS.from_py_func(callback)) #<= need Flexx(0.4.1)

layout = column(toggle1,plot)
show(layout)

---代码结束---

我有一个新版本。 conda更新anaconda conda update --all 但是效果不好

1 个答案:

答案 0 :(得分:1)

CustomJS.from_py_func()接受一个你编写为python代码的函数,并将其作为PyScript转换为JavaScript。这是一个有趣的功能,因为它可以让您编写可以在浏览器中运行的类似Python的代码。但是,from_py_func()生成的代码不是Python ,并且无法访问Python运行时环境。这意味着您的callback函数无权访问line_visiblell,因为它们是在python运行时中定义的,而不是在渲染绘图的浏览器和回调函数中定义的运行。

CustomJS()回调允许您通过args变量将变量从python环境传递到JavaScript代码中,但{{1}中似乎没有提供类似的功能}} 。这可以通过将变量作为默认参数(例如from_py_func())直接传递给回调函数来实现from_py_func()回调。重要的是要注意,这只适用于Bokeh对象而不是常规Python对象。以下是我能够使用的source=source的更新版本:

callback