Pulling ipywidget value manually

I have the ipython code:

import ipywidgets as widgets
from IPython.display import display
import time

w = widgets.Dropdown(
    options=['Addition', 'Multiplication', 'Subtraction'],
    value='Addition',
    description='Task:',
)

def on_change(change):
    print("changed to %s" % change['new'])

w.observe(on_change)

display(w)

      

Works as expected. When the value of the widget changes, the function is triggered on_change

. However, I want to run a long computation and periodically check for updates for the widget. For example:

for i in range(100):
    time.sleep(1)
    # pull for changes to w here.
    # if w.has_changed:
    #     print(w.value)

      

How can I achieve this?

+3


source to share


3 answers


For reference, I seem to be able to do the poll I want with

import IPython
ipython = IPython.get_ipython()
ipython.kernel.do_one_iteration()

      



(I would still like to get some feedback on whether this works by accident or by design.)

0


source


I think you need to use streams and hook into the ZMQ event loop. This example illustrates an example:

https://gist.github.com/maartenbreddels/3378e8257bf0ee18cfcbdacce6e6a77e



Also see https://github.com/jupyter-widgets/ipywidgets/issues/642 .

0


source


To develop self-help AF, it works. This forces the widgets to sync with the kernel at an arbitrary point in the loop. This can be done right before accessing the widget.value

.

So the complete solution would be:

import IPython
ipython = IPython.get_ipython()

last_val = 0
for i in range(100):
    time.sleep(1)
    ipython.kernel.do_one_iteration()
    new_val = w.value
    if new_val != old_val:
        print(new_val)
        old_val = new_val

      

0


source







All Articles