Очистить область виджета ячейки в блокноте Jupyter из блокнота

Мне интересно, можно ли очистить область виджета ячейки в записной книжке Jupyter со стороны записной книжки (то есть в Python). IPython.display.clear_output() очищает только область вывода ячейки, но не область виджетов.

Обновление: это все еще проблема в последних версиях Notebook и ipywidgets. Вот два минимальных примера, иллюстрирующих проблему, с которой я борюсь. Выходные данные виджета, которые я пытаюсь очистить, — это фреймы данных, отображаемые qgrid. В обоих случаях, несмотря на попытку очистить предыдущий вывод виджета, при последующем выборе таблица добавляется после предыдущей. Каждая новая таблица добавляется как div с классом 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))

Первая попытка использования взаимодействия:

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

Возможный дубликат выходных данных чистой ячейки записной книжки ipython в коде   —  person nedned    schedule 26.02.2018

См. также:  Что происходит с моей программой на Python, скажите, пожалуйста? Как оба утверждения if else могут быть истинными?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 4
  1. nedned

    It is! It’s IPython.display.clear_output():

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

    https://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)
    

    Я пробовал это, но похоже, что это очищает только подобласть вывода ячейки, но не подобласть виджета ячейки. то есть содержимое div с классом widget-subarea. Это неожиданно? person nedned; 15.03.2017

    Это исправлено в ipywidgets 6, но зависит от ноутбука 5, который доступен в виде бета-версии на PyPI и будет официально выпущен примерно через неделю. Подробнее см. github.com/ipython/ipywidgets/pull/1098. person nedned; 17.03.2017

    Я только что попытался использовать ноутбук 5 / ipywidgets 6, но, похоже, он все еще не работает. Обновили мой вопрос моими минимальными примерами, показывающими мои попытки. Любые идеи? person nedned; 08.04.2017

  2. nedned

    В блокноте Jupyter вы можете очистить всю информацию (текст и виджеты), выполнив «Cell / Current Outputs / Clear».

    Если вы хотите сделать это программно, вам нужно сделать clear_output(), чтобы очистить текст, и w.close() (будучи w виджетом) в каждом созданном вами виджете. Подробнее здесь («Закрытие виджетов«): https://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
    
  3. nedned

    Начиная с ipywidgets 7.0, виджеты отображаются так же, как и любой другой вывод. Как следствие, clear_output() очистит весь вывод ячейки, включая виджеты.

    Виджеты теперь отображаются в области вывода в классической записной книжке и обрабатываются как любой другой вывод. Это позволяет виджетам более естественно работать с выводом других ячеек. Чтобы удалить виджет, очистите вывод из ячейки. Вывод функций, запускаемых представлением виджета, добавляется к области вывода, содержащей представление виджета. Это означает, что напечатанный текст будет добавлен к выводу, а вызов clear_output () удалит весь вывод, включая представление виджета. (# 1274, # 1353)

    Источник: журнал изменений ipywidgets

  4. nedned

    Начиная с версии ipywidgets 7.0 и выше, виджеты рассматриваются как любой другой вывод. Чтобы предотвратить очистку виджетов (но очистку вывода текста) при выполнении clear_output(), используйте Виджет вывода. Что-то вроде этого :

    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)
    

    Отличный пример! Я пытаюсь использовать то, что вы clear_output() в моем примере, в котором мне нужно поместить код как часть Class. Не могли бы вы проверить мой пост, если знаете? stackoverflow.com/questions/59719207 / person nedned; 14.01.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: