ノートブック (VS コード) に Bokeh フィギュアがあり、変更されたときに更新したいと考えていx_range
ます。JS から Python へのコールバックを有効にするために、Figure を Panel でラップしますpanel
。
from bokeh.plotting import figure, curdoc
import panel as pn
pn.extension(comms='vscode')
fig = figure()
fig.circle([1, 2, 3], [4, 5, 6])
tai = pn.widgets.input.TextAreaInput(sizing_mode='stretch_both')
panel = pn.Row(pn.pane.Bokeh(fig), tai)
def change_callback(attr, old, new):
tai.value += f'{fig.x_range.start}, {fig.x_range.end}\n'
fig.x_range.on_change('start', change_callback)
fig.x_range.on_change('end', change_callback)
panel
この例では、Figure を実際に更新する代わりに、TextAreaInput
コールバック イベントをログに記録するための追加があります。これは次のようになります。
問題は、 を変更するたびx_range
に4 つのイベントが発生し、Figure の更新に 1 秒かかる場合があることです。(2 つのコールバックがあるため、2 つのイベントは理にかなっていますが、すべてのイベントが 2 回送信されるのはなぜですか?) したがって、更新が 4 回実行されないようにしたいと考えています。
Bokeh のドキュメントを見ると、メソッドがありadd_next_tick_callback
ます。イベントが発生するたびにこのコールバックを追加しますが、古いコールバックが存在する場合は削除します。何かのようなもの
ntc = None
def tick_callback():
tai.value += f'{fig.x_range.start}, {fig.x_range.end}\n'
def change_callback(attr, old, new):
global ntc
doc = curdoc()
if ntc is not None:
doc.remove_next_tick_callback(ntc)
ntc = doc.add_next_tick_callback(tick_callback)
tai.value += f'{ntc}\n'
fig.x_range.on_change('start', change_callback)
fig.x_range.on_change('end', change_callback)
次に、図の更新が で実行されtick_callback
ます。
これはうまくいきません。change_callback
まだ呼び出されて一連のNextTickCallback
オブジェクトを作成しますが、tick_callback
呼び出されることはありません。
curdoc()
これは、Panel のコンテキストで正しい Bokeh ドキュメントを返さないことが原因である可能性があると考えました。もありますがfig.document
、これは と同じドキュメントを提供しcurdoc()
ます。そして、メソッドはpn.state
ありますが、ありません。add_periodic_callback
add_next_tick_callback
add_next_tick_callback
パネルでラップされたボケ フィギュアの使用方法を教えてください。