目标:ipywidgets 数组,可以通过单击 UI 上的按钮来扩展。
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 笔记本中按预期工作。
在 databricks 笔记本中,可以观察到一个奇怪的行为:
widget_list
,但不会更新显示的小部件。ipywidgets 版本为 7.7.2。
对于这种行为的原因有什么想法吗?
我的猜测是,当前活动小部件输出的标识从数据块到本地 Jupyter Notebook 各不相同。
将功能包装在类中也允许在数据块中重新创建预期的行为:
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)