ipywidgets интерактивные с переменными контейнерами виджетов

Вопрос или проблема

Для интерактивного анализа данных с использованием Jupyter и ipywidgets я создаю несколько виджетов в зависимости от данных.

Именно, в конечном итоге у меня есть несколько GridBoxes с флажками, ползунками диапазона и выбором цвета, которые я размещаю в Tab-Widget.

Теперь я попробовал использовать

categories = ["A", "B", "C"] # извлечь из набора данных
cbox = widgets.GridBox(children=[ widgets.Checkbox(value=True, description=v) for v in categories ])
rbox = widgets.GridBox(children=[ widgets.IntRangeSlider(value=[1,10], max=20, min=0, description=v) for v in categories ])


def analysis(variables, ranges):
    print("Здравствуйте. В настоящее время я ничего не делаю с введенными данными!")

display(widgets.Tab(children=[cbox, rbox], titles=('Переменные', 'Диапазоны')))
display(widgets.interactive_output(analysis, {"variables":cbox, "ranges":rbox}))

Что не работает:

AttributeError: 'GridBox' has no attribute 'value'

Я также попробовал:

display(widgets.interactive_output(analysis, {"variables":cbox.children, "ranges":rbox.children}))

что тоже не работает.

Можно ли передать какой-либо тип контейнера в мою интерактивную функцию, или мне нужно прибегать к kwargs? А если да, то как вы бы сделали это эффективно?


Я использую версию ipywidgets 8.1.5

Ответ или решение

Для выполнения интерактивного анализа данных с использованием Jupyter и ipywidgets, особенно когда у вас есть динамически созданные контейнеры с виджетами, действительно необходимо учитывать правильный способ передачи значений из контейнеров в вашу функцию анализа.

Ваша ошибка возникает потому, что GridBox не имеет атрибута value, так как это просто контейнер для других виджетов. Вместо этого вам нужно извлекать значения непосредственно из каждого виджета внутри контейнера. Используйте widgets.interactive в сочетании с lambda фукцией или передавайте значения из каждого виджета с помощью kwargs.

Вот пример, как вы можете это реализовать:

import ipywidgets as widgets
from IPython.display import display

# Пример категорий — их можно получить из набора данных
categories = ["A", "B", "C"]

# Создадим GridBox с Checkboxes
cbox = widgets.GridBox(children=[widgets.Checkbox(value=True, description=v) for v in categories])

# Создадим GridBox с RangeSliders
rbox = widgets.GridBox(children=[widgets.IntRangeSlider(value=[1, 10], max=20, min=0, description=v) for v in categories])

# Функция анализа, принимающая значения из виджетов
def analysis(*args):
    variables = [checkbox.value for checkbox in cbox.children]
    ranges = [slider.value for slider in rbox.children]
    print("Переменные:", variables)
    print("Диапазоны:", ranges)

# Используем interactive_output для связывания значений виджетов с функцией анализа
def extract_values(*args):
    return [checkbox.value for checkbox in cbox.children] + [slider.value for slider in rbox.children]

# Отобразим вкладки с виджетами
tab = widgets.Tab(children=[cbox, rbox])
tab.set_title(0, 'Переменные')
tab.set_title(1, 'Диапазоны')
display(tab)

# Связываем интерактивность
output = widgets.interactive_output(analysis, {"variables": cbox.children, "ranges": rbox.children})
display(output)

# Вызываем функцию для инициализации и отображения
extract_values()

# Устанавливаем привязку к функциям для динамического обновления
for child in cbox.children + rbox.children:
    child.observe(lambda change: extract_values(), 'value')

В этом примере вы создаете два GridBox для чекбоксов и ползунков, а затем определяете функцию analysis, которая извлекает значения из каждого виджета и выводит их. Для того чтобы привести это в интерактивный формат, используется функция interactive_output.

Вы также можете добавлять наблюдателей (observe) к каждому виджету, чтобы функция extract_values вызывалась каждый раз, когда изменяются значения виджетов, что позволяет обновить состояние интерфейса. Это обеспечивает динамическое обновление при взаимодействии с пользовательским интерфейсом.

Таким образом, используя этих подход, вы сможете эффективно вызывать вашу функцию анализа с текущими значениями, извлекая их из контейнеров виджетов.

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

Капча загружается...