Clearing decorator ipywidgets

Question:

I have a function which plots a graph with a couple ipywidgets as inputs:

from IPython.display import clear_output
def on_clicker(button):
   clear_output()
   @widgets.interact(dropdown=widgets.Dropdown(...),
                  datepicker=widgets.DatePicker(...)
   def grapher(dropdown, datepicker):
      global recalculate
      ... some graphing stuff
      display(recalculate)
      recalculate.on_click(on_clicker)

The idea is that clicking recalculate calls the graph again and clears the past output. However, when I try this the widgets in the decorator remain under repeated use of recalculate:

Stacked widgets

Is there any way to clear these widgets as clear_output() does not seem to work?

Asked By: maptuv

||

Answers:

You can use the clear_output() function to clear the output of the current cell in a Jupyter notebook. However, this will not clear the widgets that you have defined in your code. In order to clear the widgets, you will need to re-initialize them each time the on_clicker() function is called.

One way to do this would be to move the code that initializes the widgets inside the on_clicker() function, so that they are re-initialized each time the function is called.

Here is an example of how you could modify your code to achieve this:

from IPython.display import clear_output

def on_clicker(button):
   clear_output()
   # Define the widgets inside the on_clicker function
   dropdown = widgets.Dropdown(...)
   datepicker = widgets.DatePicker(...)
   @widgets.interact(dropdown=dropdown, datepicker=datepicker)
   def grapher(dropdown, datepicker):
      global recalculate
      ... some graphing stuff
      display(recalculate)
      recalculate.on_click(on_clicker)

This way, when the on_clicker() function is called, it will clear the output and re-initialize the widgets, which should solve your problem.

Answered By: shanginn
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.