MRocklin
MRocklin

Reputation: 57271

Create Jupyter Notebook object that changes after the cell has run

I want to make a progress bar that updates asynchronously within the Jupyter notebook (with an ipython kernel)

Example

In [1]: ProgressBar(...)
Out[1]: [|||||||||------------------]  35%  # this keeps moving

In [2]: # even while I do other stuff

I plan to spin up a background thread to check and update progress. I'm not sure how to update the rendered output though (or even if this is possible.)

Upvotes: 4

Views: 508

Answers (1)

mathisonian
mathisonian

Reputation: 1420

This might help put you on the right track, code taken from lightning-viz, which borrowed a lot of it from matplotlib. warning this is all pretty underdocumented.

In python you have to instantiate a comm object

from IPython.kernel.comm import Comm
comm = Comm('comm-target-name', {'id': self.id})

full code here https://github.com/lightning-viz/lightning-python/blob/master/lightning/visualization.py#L15-L19. The id is just there in case you want to manage multiple different progress bars for example.

then do the same in javascript:

var IPython = window.IPython;

IPython.notebook.kernel.comm_manager.register_target('comm-target-name', function(comm, data) {
      // the data here contains the id you set above, useful for managing
      // state w/ multiple comm objects

      // register the event handler here
      comm.on_msg(function(msg) {
      })
});

full example here. Note the javascript on_msg code is untested as I've only used comm to go from js -> python. To see what that handler looks like see https://github.com/lightning-viz/lightning-python/blob/master/lightning/visualization.py#L90

finally to send a message in python:

comm.send(data=data)

https://ipython.org/ipython-doc/3/api/generated/IPython.kernel.comm.comm.html#IPython.kernel.comm.comm.Comm.send

Upvotes: 3

Related Questions