Цель: массив ipywidgets, который можно расширить нажатием кнопки в пользовательском интерфейсе.
import ipywidgets as widgets
from IPython.display import display
# Keeps track of default and dynamically added widgets
widgets_list = [widgets.Text(value='Give me')]
w_out_widgets_list = widgets.Output()
# display defaults
w_out_widgets_list.append_display_data(widgets.HBox(widgets_list))
def add_new_widget(b):
with w_out_widgets_list:
widgets_list.append(widgets.Text(value='more and '))
w_out_widgets_list.clear_output()
display(widgets.HBox(widgets_list))
w_new_widget = widgets.Button(description='Add Widget')
w_new_widget.on_click(add_new_widget)
display(widgets.VBox([w_out_widgets_list, w_new_widget]))
Это работает, как и ожидалось, в моем локально работающем ноутбуке Jupyter.
В блокноте блоков данных наблюдается странное поведение:
widget_list
, но не обновляет отображаемые виджеты.ipywidgets находятся на версии 7.7.2.
Есть идеи, в чем причина такого поведения?
<продолжение> а пока просто прокомментируйте в инструкциях для пользователя, что это может занять пару раз, чтобы заставить его работать, но, может быть, вы не хотите, чтобы он отображал более двух?
Спасибо @Wayne. Я не был уверен, что этот подход не был чистым и просто случайно работал локально. Из вашего ответа я понял, что проблема скорее связана с окружающей средой, и я не злоупотребляю/неправильно использую функциональные возможности ipywidgets. Связанный пример работает. Я попытался сформулировать проблему в более краткой форме. Для эффективной задачи может потребоваться более 5 виджетов.
Я определенно думаю, что вы используете хороший код. Странно, что в старых ipywidgets что-то глючит. У меня нет под рукой старой версии, чтобы проверить, действительно ли это так или что-то необычное в datbricks.
Я предполагаю, что идентификация текущего активного виджета. Вывод варьировался от блоков данных до локального блокнота Jupyter.
Обертывание функциональности в класс также позволяет воссоздать ожидаемое поведение внутри блоков данных:
import ipywidgets as widgets
class App:
def __init__(self):
self.widgets_list = [widgets.Text(value = "Give me")]
self.w_new_widget = widgets.Button(description = "Add Widget")
self.w_new_widget.on_click(self.add_new_widget)
self.app_out = widgets.Output()
self.generate_layout()
def generate_layout(self):
self.app_out.clear_output()
with self.app_out:
display(widgets.VBox([widgets.HBox(self.widgets_list),
self.w_new_widget]))
def add_new_widget(self, *args):
self.widgets_list.append(widgets.Text(value = "more and "))
self.generate_layout()
app = App()
display(app.app_out)
Добавьте к своему заголовку что-то вроде «сбой в блокноте с блоками данных», чтобы оно соответствовало разделу «Напишите заголовок, отражающий конкретную проблему» в Как мне задать хороший вопрос? . Ваш код определенно работает с ipywidgets 8.0.2. Подходит ли вам пример с
button.on_click(on_button_clicked)
здесь в Databricks? Определенно странно, но я не вижу, как это можно легко исправить, поскольку это не соответствует новым вещам, и поэтому, как ожидается, обновление будет всем, что необходимо. Может быть ...