Как очистить оба виджета и удалить их другим виджетом

Я загружаю список файлов с checkbox для фильтрации с помощью ipywidgets:

from ipywidgets import Checkbox, interact, Layout, Button
import ipywidgets as widgets
import glob
from traitlets import traitlets
from IPython.display import display, clear_output

class LoadedButton(widgets.Button):
    def __init__(self, value=None, *args, **kwargs):
        super(LoadedButton, self).__init__(*args, **kwargs)
        # Create the value attribute.
        self.add_traits(value=traitlets.Any(value))

def file_list(**all_kwargs):
    cols = [k for k, v in all_kwargs.items() if v==True]
    return cols
    
def reload_files(rr):
    for c in all_files:
        c.close()
        clear_output()
    print('Unselect the csv files above *to EXCLUDE*')
    rr.value =interact(file_list, **all_kwargs)
    return rr

extension = 'csv'                # extention of file you want to read, csv, dat, etc.
all_file_list = [i for i in glob.glob('*.{}'.format(extension))]
all_files = [Checkbox(description=a, value=True) for a in all_file_list ]
all_kwargs = {c.description: c.value for c in all_files} 

lb = LoadedButton(description="Load/reload file list", value=None)
lb.on_click(reload_files)
display(lb)

Я хочу перезаписывать предыдущие выходные данные (как виджет, так и выходные данные виджета) каждый раз, когда я нажимаю кнопку, созданную с помощью виджета «Кнопка», но вместо перезаписи он создает другой экземпляр вывода. Я пробовал оба варианта clear_output и widget.close(), но ничего не помогает. Я знаю, что clear_output не должен очищать виджет, но я ожидаю, что это будет возможно с помощью close(). Кто-нибудь знает, как очистить/перезаписать ipywidgets, а также выходные данные ipywidget при перезагрузке с помощью кнопки? другой экземпляр вывода


person Ashish    schedule 04.08.2017    source источник
comment
Этот ответ сработал для вас? Если нет, если вы не против опубликовать более полный пример, тогда его будет легче решить.   -  person James Draper    schedule 07.08.2017
comment
Спасибо Джеймс за ответ. Это не сработало и по-прежнему дает результат, как на скриншоте выше. Извините, я не включил список пакетов для импорта, который теперь включен. В противном случае сценарий был завершен. Поскольку скрипт перечисляет все файлы с определенным расширением (например, «csv» в моем случае) в домашней папке, вы можете изменить это в соответствии с типом файла, который у вас есть, или можете создать несколько фиктивных файлов CSV во время тестирования.   -  person Ashish    schedule 07.08.2017
comment
хорошо, я обновляю свой ответ, я думаю, что теперь он может сработать для вас.   -  person James Draper    schedule 07.08.2017
comment
Спасибо, я также читал, что функция display вызывает проблему, как вы также узнали. Но предложенное решение теперь замораживает элементы контрольного списка ipywidgets, т. е. даже при замене csv-файлов на новые в каталоге отображаемый список файлов остается прежним в записной книжке. Он просто добавляет перезагрузку... каждый раз, когда я нажимаю кнопку перезагрузки, не заменяя существующий список новыми именами файлов.   -  person Ashish    schedule 08.08.2017
comment
Хорошо, только что обновил, думаю, на этот раз у меня получилось.   -  person James Draper    schedule 08.08.2017
comment
Слово спасибо за принятие ответа. Это аккуратный шаблон дизайна. люди, вероятно, будут использовать его в будущем. Также вы должны бросить свой голос;) Заранее спасибо!   -  person James Draper    schedule 08.08.2017


Ответы (1)


Если я правильно понимаю вопрос, я думаю, что это может сработать для вас;

from ipywidgets import Checkbox, interact, Layout, Button
import ipywidgets as widgets
import glob
from traitlets import traitlets
from IPython.display import display, clear_output

class LoadedButton(widgets.Button):
    def __init__(self, value=None, *args, **kwargs):
        super(LoadedButton, self).__init__(*args, **kwargs)
        # Create the value attribute.
        self.add_traits(value=traitlets.Any(value))

def file_list(**all_kwargs):
    cols = [k for k, v in all_kwargs.items() if v==True]
    return cols

def reload_files(rr):
    if rr.value is not None:
        # print("Reloading...")
        # Reset the panel to just the button.
        panel.children = [panel.children[0]]
        rr.value = None

    if rr.value is None:
        extension = 'csv' # extention of file you want to read, csv, dat, etc.
        all_file_list = [i for i in glob.glob('*.{}'.format(extension))]
        all_files = [Checkbox(description=a, value=True) for a in all_file_list ]
        all_kwargs = {c.description: c.value for c in all_files} 

        rr.value=widgets.interactive(file_list, **all_kwargs)
        panel.children += (rr.value,)
        # display(rr.value)


lb = LoadedButton(description="Load/reload file list", value=None)
lb.on_click(reload_files)

# A VBox for the Button and checkboxes.
panel = widgets.VBox([lb])
panel

Я думаю, что проблема возникла из-за использования функции display для представления виджета. Когда у вас есть один виджет, изменяющий видимость другого, лучшее, что вы могли бы сделать, это добавить и удалить их из виджета макета, такого как VBox или HBox. В любом случае дайте мне знать, как это работает.

Обновлять:

glob и все другие операции с именами файлов также должны обновляться при нажатии кнопки. так и сейчас делает.

Также здесь показано, как получить доступ к флажкам виджета interactive';

panel.children[1].children

OR

lb.value.children

Оба утверждения относятся к одному и тому же объекту.

person James Draper    schedule 07.08.2017
comment
В списке виджетов есть дополнительный объект Output, который, я думаю, происходит от Button, поэтому для доступа к флажкам мне пришлось читать его как lb.value.children[:-1]. В противном случае основная задача, которая была настоящей проблемой, теперь работает отлично. Большое спасибо! - person Ashish; 08.08.2017
comment
С удовольствием, @Ashish, это была забавная задача, которую можно было решить во время перерывов. Если вам нравится работать с ipywidgets, обратите внимание на Bokeh, Veax, ipyvolume и nglview. - person James Draper; 08.08.2017
comment
Спасибо за информацию. Действительно, мне нравятся ipywigets, и я знаю Bokeh, но Beax, ipyvolume и nglview будут для меня чем-то новым. :-) - person Ashish; 08.08.2017