从笔记本内部清除Jupyter笔记本中单元格的小部件区域

时间:2017-03-14 10:04:04

标签: python ipython jupyter-notebook ipywidgets

我想知道是否可以从笔记本电脑侧(即在Python中)清除Jupyter笔记本中的单元格的小部件区域。 IPython.display.clear_output()仅清除单元格的输出区域而不是小部件区域。

更新:这在最新的Notebook和ipywidgets中似乎仍然存在问题。这里有两个最小的例子来说明我正在努力解决的问题。我试图清除的小部件输出特别是qgrid呈现的数据帧。在这两种情况下,尽管尝试清除先前的窗口小部件输出,但后续选择会导致在前一个窗口之后附加表。每个新表都附加为具有类p-Widget的div。

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))

首次尝试使用互动:

@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)

使用“输出”小部件进行第二次尝试:

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)

4 个答案:

答案 0 :(得分:2)

是的!这是IPython.display.clear_output()

from IPython.display import clear_output
for i in range(10):
    clear_output()
    print(i)

http://ipython.org/ipython-doc/dev/api/generated/IPython.display.html#IPython.display.clear_output

<强>更新

from IPython.display import clear_output
from ipywidgets import widgets

widgets.IntSlider(1)
clear_output()
# Note that `clear_output` will not clear widgets displayed using `display(widgets.IntSlider(1))`
widgets.IntSlider(100)

答案 1 :(得分:1)

从Jupyter笔记本,您可以清除所有信息(文本和小工具)“ Cell / Current Outputs / Clear ”。

如果您想以以编程方式执行此操作,则必须执行clear_output()以清除文本并w.close() w 小部件)在您创建的每个小部件中。更多信息(“关闭小部件”): http://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Basics.html

在你的例子中(至少在你的第二次尝试中),你需要添加:

col_input.close()
row_input.close()

我已经使用这些版本进行了测试:

Jupyter Notebook version: 5.0.0
ipywidgets version: 6.0.0

答案 2 :(得分:1)

从ipywidgets 7.0版开始,小部件被视为与其他任何输出一样。为防止在执行clear_output()时清除小部件(但清除文本输出),请使用Output小部件。 像这样:

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

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("A new hello on each button click")

b.on_click(on_button_clicked)

答案 3 :(得分:0)

从ipywidgets 7.0开始,小部件的呈现方式与其他任何输出相同。因此clear_output()将清除包含小部件的单元格的所有输出。

  

窗口小部件现在显示在经典笔记本的输出区域中,并被视为任何其他输出。这允许小部件与其他单元输出更自然地工作。要删除窗口小部件,请清除单元格的输出。由窗口小部件视图触发的函数的输出将附加到包含窗口小部件视图的输出区域。这意味着打印文本将附加到输出,调用clear_output()将删除整个输出,包括小部件视图。 (#1274,#1353)

     

来源:ipywidgets changelog