2017-05-27 22 views
4

私はさまざまなウィジェットイベントのPythonコールバックを利用するBokehアプリケーションを持っています。特定のイベントでは、Python関数へのコールバックを行う前にJavaScriptコードを実行したいと思います。これは可能ですか?Bokehウィジェットは、単一イベントに対してCustomJSとPythonコールバックを呼び出しますか?

この場合、Pythonコールバックは長時間実行される可能性があります。長期実行Pythonコードの実行前後でJavascriptスピナーオブジェクトを開始して停止したいと思います。

答えて

5

次の2つのリリースのいずれかで、「ビジー」/「完了」イベント(スピンナーやその他のUIイベントのトリガーを有効にする)が計画されています。 (私は彼らが0.12.6にそれを作るそうでない場合、彼らは0.12.7になることを願っています。)

平均時間では、あなたの最善の策はCustomJSコールバックをトリガするために、いくつかの「ダミー」モデルを使用することです。たとえば、目に見えないグリフを追加し、その上に任意のプロパティーを「ビジー」イベントのプロキシーとしてトリガーしてCustomJSをトリガーすることができます。これは厄介ですが、保守可能です。

ここでは非常に概略的な例を示します。最初のアラートがすぐにポップアップ表示されます。それを閉じて、5秒後に次のアラートがポップアップします。

import time 

from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.models import Button, CustomJS 
from bokeh.plotting import figure 

p = figure() 
p.circle([1,2,3,4,5], [2,6,3,1,6]) 

dummy = p.circle([1], [2], alpha=0) 
dummy.glyph.js_on_change('size', CustomJS(code=""" 
alert(cb_obj.size.value) 
""")) 

b = Button() 
def cb(): 
    dummy.glyph.size = 10 
    time.sleep(5) 
    dummy.glyph.size = 20 

b.on_click(cb) 

curdoc().add_root(column(b, p)) 
+0

「ダミー」モデルのインスタンスで、私のpythonコールバックとプロパティの変更の両方にイベント(ボタンクリック)を接続する方法がわかりません。 Pythonのコールバックがプロパティを変更した場合、コールバックが完了するまでクライアント側はその変更を見ません(これは私のスピナーを止めるのに有効です)。しかし、私はどのように開始イベントを処理/キャプチャするか分からない。 – tbc

+0

"pythonコールバックがプロパティを変更した場合、コールバックが完了するまで、クライアント側はその変更を認識しません。「そうではありません。更新された回答のサンプルコードを見てください。 – bigreddot

+0

パーフェクト - 私はそれを試みます。ありがとう!!! – tbc

関連する問題