动态创建并显示ipywidgets,在databricks笔记本中失败

问题描述 投票:0回答:1

目标: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。

对于这种行为的原因有什么想法吗?

python jupyter-notebook databricks ipywidgets databricks-notebook
1个回答
0
投票

我的猜测是,当前活动小部件输出的标识从数据块到本地 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)
© www.soinside.com 2019 - 2024. All rights reserved.