2017-11-01 10 views
-1

CustomJS.from_py_func(コールバック)がうまくいきません。 グラフとウィジェットを表示できますが、コールバック関数をうまく処理できません。コードのinterractiveウィジェットを動作させない

---サンプルコード

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) 

---終わり---

私は新しいバージョンを得ました。うまく

+0

あなたはよりもはるかに詳細にあなたの問題を説明する必要があるとしている「うまく機能しません。」 – kindall

+0

この問題は、コールバック関数で目に見える原因を処理することではありません。 可視属性はコールバック関数の外部でうまく機能します。 これは "CustomJS.from_py_func()"のバグだと思っていました。 – SoccerKing

+0

line_visible()は問題ありません。ウィジェットを使用すると、callback()が機能します。 CHGボタンでデータを変更することができます。ただし、NOTボタンを押すと表示される属性を変更できます。 – SoccerKing

答えて

1

CustomJS.from_py_func()を動作しません--all が、 conda更新アナコンダ conda更新はJavaScriptに、PyScriptとして、あなたはPythonのコードとして書かれているその機能を取り、それをtranspiles。これは興味深い機能です。ブラウザで実行できるPythonライクなコードを書くことができるからです。しかし、from_py_func()を生成するコードは、Pythonではなく、Pythonランタイム環境にアクセスすることはできません。つまり、callback関数はline_visibleまたはllにアクセスできません。これは、プロットがレンダリングされ、コールバック関数が実行されるブラウザではなく、Pythonランタイムで定義されているためです。

CustomJS()コールバックは、あなたがargs変数を介してJavaScriptコードにPython環境から変数を渡すことができが、from_py_func()で提供同様の機能があるようには思えません。これは、source=sourceのようなデフォルトの引数としてコールバック関数に変数を直接渡すことによってfrom_py_func()コールバックが実現できます。これは、Bokehオブジェクトに対してのみ機能し、通常のPythonオブジェクトに対しては機能しないことに注意することが重要です。以下は、私が作業を取得することができたcallbackの更新版です。

def callback(source=source, ll=ll, window=None): 
    def line_visible(arg): 
     if arg == 1: ll.visible = True 
     else: ll.visible = False 

    data = source.data 
    act = cb_obj.get('active') 
    if 0 in act: 
     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) 
    if 2 in act: line_visible(0) 
    source.change.emit() 
+0

慎重なアドバイスをありがとうございます。 – SoccerKing

+0

慎重なアドバイスをありがとうございます。私は以下のサイトのサンプルを見て解決しました。 https://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#visible-property – SoccerKing

+0

これは興味深いものです。私は、引数が別の方法で渡される可能性があることを知らなかった。 'CustomJS'のドキュメントを詳しく見て、ソースコードのいくつかを見て、Bokehオブジェクトを' from_py_func() 'コールバックに直接渡すことが可能であることに気付きました。私は 'from_py_func()'でうまくいくべき解決策で私のaswerを更新しました。 –

関連する問題