web-dev-qa-db-ja.com

ノートブック内からJupyterノートブックのセルのウィジェット領域をクリアする

Jupyterノートブックのセルのウィジェット領域をノートブック側(つまりPython内)からクリアできるかどうか疑問に思っています。 IPython.display.clear_output()は、ウィジェット領域ではなく、セルの出力領域のみをクリアします。

更新:これは、最新のノートブックとipywidgetsではまだ問題のようです。これが私が苦労している問題を説明する2つの最小限の例です。特にクリアしようとしているウィジェット出力は、 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)

出力ウィジェットを使用した2回目の試行:

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

です! 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)
4
senornestor

Ipywidgetsバージョン7.0以降、ウィジェットは他の出力と同様に見なされます。 clear_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)
4
Deepak Saini

Jupyterノートブックから、 "Cell/Current Outputs/Clear"を実行してすべての情報(テキストとウィジェット)をクリアできます。

プログラムで実行したい場合、テキストをクリアするためにclear_output()w.close()を実行する必要があります。 (wウィジェットであること)作成したすべてのウィジェット。詳細はこちら( "ウィジェットを閉じる"): http://ipywidgets.readthedocs.io/en/latest/examples/Widget% 20Basics.html

あなたの例では(少なくとも2回目の試みでは)、以下を追加する必要があります。

col_input.close()
row_input.close()

私はこれらのバージョンでそれをテストしました:

Jupyter Notebook version: 5.0.0
ipywidgets version: 6.0.0
1
rvilla

Ipywidgets 7.0以降、ウィジェットは他の出力と同じ方法でレンダリングされます。結果として、clear_output()はウィジェットを含むセルのすべての出力をクリアします。

ウィジェットはクラシックノートブックの出力領域に表示され、他の出力と同様に扱われるようになりました。これにより、ウィジェットは他のセル出力とより自然に連携できます。ウィジェットを削除するには、セルからの出力をクリアします。ウィジェットビューによってトリガーされた関数からの出力は、ウィジェットビューを含む出力領域に追加されます。これは、印刷されたテキストが出力に追加され、clear_output()を呼び出すと、ウィジェットビューを含む出力全体が削除されることを意味します。 (#1274、#1353)

ソース: ipywidgets changelog

0
Kon Pal