0

ノートブック (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_range4 つのイベントが発生し、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_callbackadd_next_tick_callback

add_next_tick_callbackパネルでラップされたボケ フィギュアの使用方法を教えてください。

4

0 に答える 0