2017-02-02 6 views
1

JavaScriptを使用せずに、つまりbokehのドキュメントAdding A Custom Widgetに従わずにカスタムbokehウィジェットを作成したいと思います。以下の例は、PyQt4でカスタムウィジェットを作成する方法を示しています(私はこれをたくさん使っています)。そして、私が得るエラーメッセージと一緒にbokehで動作することを期待しています。JavaScriptを使用しないカスタムPython bokehウィジェットを追加

JavaScriptを使用せずにbokehでカスタムウィジェットを作成する他の方法はありますか?具体的には、スライダを1ステップずつインクリメント/デクリメントする左右のボタンがあるカスタムスライダを作成しようとしています。私はこのカスタムウィジェットを多くのアプリケーションで使いたいので、スライダーのon_changeメソッドにリンクされたon_changeメソッドを持つ独自のクラスとして定義します。 bokehには私が作りたい(JSなしで)他のカスタムウィジェットがあり、これが可能かどうかを知りたいと思います。

# this works as a base to develop custom PyQt4 widgets 
from PyQt4 import QtGui 
import sys 

class NewWidget(QtGui.QWidget): 
    def __init__(self): 
     super().__init__() 

app = QtGui.QApplication([]) 
widget = NewWidget() 
widget.show() 
sys.exit(app.exec_()) 


# this does not work as a base to develop custom bokeh widgets 
# when run, a tab opens with the message 
# Bokeh Error 
# Model `NewWidget' does not exist. This could be due to a widget 
# or a custom model not being registered before first usage. 
from bokeh.plotting import show 
from bokeh.layouts import widgetbox 
from bokeh.models.widgets import Widget 

class NewWidget(Widget): 
    def __init__(self): 
     super().__init__() 

new = NewWidget() 
show(widgetbox(new)) 

UPDATE:私が作成しようとしています特定のカスタムウィジェットは、各側のボタンとスライダーです(ラベル左側の「 - 」、「+」ラベル右側)によってスライダーの値を変更1ステップ。これは、Sliderの値を微調整して、マウスが目標値に正確に当たる必要がないようにするために使用されます。デフォルトのSliderオブジェクトとButtonオブジェクトをリンクしてこのカスタムウィジェットを作成し、ブラウザでレンダリングしますが、コールバック機能が動作していません(特にSliderのon_changeメソッド)。

Slider With Buttons

ボケとJSで実装するのは簡単、このカスタム・ウィジェットですか? JSの中で深く潜ることなくヒントを提供するオンラインリファレンスがありますか?

+0

':ここ


はスライダーを更新するためにボタンをCustomJSコールバックを使用する完全な例です。これはサーバーアプリケーションでは動作しないと言っていますか?または、これはサーバーアプリケーションのコンテキストではありませんか?いずれにしても、これはもっと一般的にJSと '.js_on_change'コールバック:http://bokeh.pydata.org/en/latest/docs/user_guide/interaction/callbacksの1行か2行で可能になるはずです。html#customjs-for-generic-eventsのためにサーバを必要としない – bigreddot

+0

特にボタンの場合、 'callback'プロパティを使用して' CustomJS'コールバックを設定したいと思うでしょう。下記をご覧ください – bigreddot

答えて

3

Bokehは、最新のブラウザ(または埋め込みHTMLウィジェット)でプロットおよびビジュアライゼーションアプリケーションを生成するためのライブラリです。それは2つの重要な部分で構成されています。 BokehのPython側は、実際には宣言的なJSONドキュメントを生成する洗練された "ラッパー"または "バインディング"であり、実際にブラウザですべての作業を行うJavaScriptライブラリ(BokehJS)を駆動します。

Bokehを拡張するということは必ず、その方程式の両辺を提供することを意味します。拡張のPython宣言を提供する必要があります。これは実際には上記のJSON形式を自動的に生成するのに必要な情報を指定するだけです。また、拡張機能用のJavaScript(またはCoffeeScript)実装を提供する必要があります。これは実際にブラウザですべての作業を行います。

ブラウザにはPythonコードを実行する能力がないため、実装は必ずJavaScriptでなければなりません。

FlexxやBrythonなどのPythonをJavaScriptに変換するライブラリがあります。 JavaScriptを直接書くのを避ける手段として役立つかもしれませんが、これらのライブラリには、特定のユースケースで不具合や特定の欠点があることが多いので、YMMVです。ボケサーバー(つまり、Pythonのコールバックが実行されますどこだ)あなたがいるが必要です.on_change`

from bokeh.models import Button, CustomJS, Slider 
from bokeh.layouts import row 
from bokeh.io import output_file, show 

slider = Slider(start=0, end=10, value=0, step=0.1) 

button = Button() 
button.callback = CustomJS(args=dict(slider=slider), code=""" 
    slider.value += 0.1 
""") 

output_file("foo.html") 

show(row(slider, button)) 
+0

ありがとうございます。 JSなしでカスタムbokehウィジェットを作成する方法がないことが分かりました。私の元の投稿へのUPDATEを読んで、ここで何かガイダンスを提供できるかどうか教えてください。 _Transpiling_は堅牢なアプローチのようには聞こえません。再度、感謝します! –

関連する問題