bokeh / jupyter_bokeh

An extension for rendering Bokeh content in JupyterLab notebooks
BSD 3-Clause "New" or "Revised" License
251 stars 48 forks source link

Adding callbacks after BokehModel creation #153

Open axil opened 2 years ago

axil commented 2 years ago

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 commented 2 years ago

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
bryevdv commented 2 years ago

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.

axil commented 2 years ago

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.

mattpap commented 2 years ago

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