Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clear widget area of a cell in a Jupyter notebook from within notebook

I'm wondering if it's possible to clear the widget area of a cell in a Jupyter notebook from the notebook side (ie within Python). IPython.display.clear_output() only clears the cell's output area not the widget area.

Update: this still seems to be a problem in latest Notebook and ipywidgets. Here are two minimal examples illustrating the problem I'm struggling with. The widget output that I'm trying to clear in particular are the data frames rendered by qgrid. In both cases, despite trying to clear the previous widget output, subsequent selections cause a table to be appended after the previous one. Each new table is appended as a div with the class p-Widget.

import pandas as pd
import numpy as np
import qgrid
from ipywidgets import interact
from IPython.display import display, clear_output
import notebook
import ipywidgets

print('Jupyter Notebook version: {}'.format(notebook.__version__))
print('ipywidgets version: {}'.format(ipywidgets.__version__))

max_columns = 10
max_rows = 10    
col_opts = list(range(1, max_columns + 1))
row_opts = list(range(1, max_rows + 1))

First attempt using interact:

@interact(columns=col_opts, rows=row_opts)
def submit(columns, rows):
    df = pd.DataFrame(np.random.randint(0, 100, size=(rows, columns)))
    clear_output()
    display(qgrid.QGridWidget(df=df)

Second attempt using the Output widget:

output = ipywidgets.Output()
display(output)

def submit2(change):
    rows = row_input.value
    columns = col_input.value
    df = pd.DataFrame(np.random.randint(0, 100, size=(rows, columns)))

    with output:
        output.clear_output()
        display(qgrid.QGridWidget(df=df))

col_input = ipywidgets.Dropdown(options=col_opts)
row_input = ipywidgets.Dropdown(options=row_opts)

col_input.observe(submit2, 'value')
row_input.observe(submit2, 'value')

display(col_input)
display(row_input)
like image 588
nedned Avatar asked Mar 14 '17 10:03

nedned


People also ask

How do you clear a particular cell in a Jupyter notebook?

Press 'control-shift-p', that opens the command palette. Then type 'clear cell output'. That will let you select the command to clear the output.

What does Clear_output () do in Python?

To clear output in the Notebook you can use the clear_output() function. If you are clearing the output every frame of an animation, calling clear_output() will create noticeable flickering. You can use clear_output(wait=True) to add the clear_output call to a queue.

How do I hide sections in Jupyter notebook?

There are two ways to hide content: To hide Markdown, use the {toggle} directive. To hide or remove code cells or their outputs, use notebook cell tags.

How do you clear cell output in Colab?

Yes, it's now possible to clear outputs of a single cell. If you want to do so, use the Alt+Delete shortcut or right-click and select that option.


2 Answers

Since ipywidgets 7.0 the widgets are rendered in the same way as any other output. As a consequence clear_output() will clear all the output of cell including widgets.

Widgets are now displayed in the output area in the classic notebook and are treated as any other output. This allows the widgets to work more naturally with other cell output. To delete a widget, clear the output from the cell. Output from functions triggered by a widget view is appended to the output area that contains the widget view. This means that printed text will be appended to the output, and calling clear_output() will delete the entire output, including the widget view. (#1274, #1353)

Source: ipywidgets changelog

like image 132
Kon Pal Avatar answered Sep 24 '22 20:09

Kon Pal


From ipywidgets version 7.0 onwards, widgets are considered like any other output. To prevent the widgets from clearing(but clearing the text output) when you do clear_output(), use the Output widget. Something like this :

from IPython.display import display, clear_output
import ipywidgets as widgets
import random

b = widgets.Button(
    description='Show Random',
    disabled=False,
    button_style='info',
    tooltip='Click me',
    icon='check'
)
display(b)

out = widgets.Output()
display(out)

def on_button_clicked(b):
    with out:
        clear_output()
        print("New hello from each button click!. This hello from {}.".format(random.choice(list(range(100)))))

b.on_click(on_button_clicked)
like image 28
Deepak Saini Avatar answered Sep 21 '22 20:09

Deepak Saini