jupyter_bokeh icon indicating copy to clipboard operation
jupyter_bokeh copied to clipboard

Adding callbacks after BokehModel creation

Open axil opened this issue 3 years ago • 4 comments

Hi,

The event callbacks registered before a call to BokehModel work fine:

def f(event):
    print('hi')
b = bm.Button()
b.on_click(f)
w = BokehModel(b)
w

Is it possible to register the callbacks after BokehModel has been created?

def f(event):
    print('hi')
b = bm.Button()
w = BokehModel(b)
b.on_click(f)    # or w._model.on_click
w

axil avatar May 30 '22 05:05 axil

Ok. Got it:

def f(event):
    print('hi')
b = bm.Button()
w = BokehModel(b)
b.on_click(f)
w.render_bundle = w._model_to_traits(b)
b._update_event_callbacks()
w

axil avatar May 30 '22 09:05 axil

Just noting that private APIs can change or be removed at any time so using those methods is purely at your own risk.

We could consider crafting a supported, public API for this, but I think we'd need to understand the use-case better. The intended usage of BokehModel is to be a "last mile" bridge for certain jupyter integrations. I.e. the intent is to set up all your Bokeh models normally up front, then only use BokehModel as the last step.

bryevdv avatar May 31 '22 16:05 bryevdv

This makes the following layout impossible to implement:

Bokeh plot1
Ipywidget Slider
Bokeh plot2

(or rather a horizontal version of this widget sequence)

I realize that I could use the bokeh slider instead of the ipywidgets one. But not all ipywidget widgets have their counterparts in bokeh.

axil avatar Jun 02 '22 10:06 axil

We need to let BokehModel listen to the underlying model's changes and refresh its render_bundle.

mattpap avatar Jun 02 '22 11:06 mattpap