是否可以根据下拉选择显示另一个 ipywidgets 小部件?

Is it possible to make another ipywidgets widget appear based on dropdown selection?

我想弄清楚是否可以根据一个下拉列表中的选择显示不同的 dropdowns/other 小部件。似乎 'interact' 有一些方法可以使第二个下拉列表中的值根据第一个下拉列表中的值进行更改,但是我没有运气找到一种方法来完全更改基于第一次选择。下面是使用 ipywidgets 导出我的仪表板的代码 - 更改了其中的一些名称,以便在没有整个脚本的情况下更容易阅读。

top = widgets.Accordion([
    AppLayout(header=header,
              center=VBox([Label('First Selection'),
                           select_1]),

          left_sidebar=VBox([Label('Second Selection'),
                             dropdown_2,

                             Label('Third Selection'),
                             dropdown_3,

                             Label('Fourth Selection'),
                             dropdown_4,

                             Label('Fifth Selection'),
                             dropdown_5,

                             group_checkbox]),

          right_sidebar=VBox([Label('Sixth Selection'),
                              select_6t,
                              Label('Seventh Selection'),
                              select_7]),
          footer=VBox([HBox([text_box,button_export]),HBox([dropdown_eight,nine_slider,ten_text,stage_export,run_export])]),
          pane_widths=['350px', 1, 1],
          pane_heights=['80px', 4, 1],
          height='auto',
          grid_gap="20px")])

pd.options.display.max_columns = None
pd.options.display.max_rows = None

bottom = tab
app = widgets.VBox([top,bottom])

app

基本上,填充页脚中 HBox 的列表包含其他小部件,这些小部件可能具有相关性,也可能不具有相关性,具体取决于 dropdown_eight 中的选择。我不想拥有几行小部件,而是希望能够有一个函数来根据 dropdown_eight 中的选择确定需要哪些额外的小部件。最初,我试图定义一个 return 适当的小部件列表但无法在仪表板中更新的函数。

如有任何帮助,我们将不胜感激!

我发现当你有两个相互链接的小部件时,我更容易将两者绑定到一个 class。编写一个方法来访问您需要的值也更容易。

下面是一个类似的示例,您可以在其中更改布尔小部件的数量,然后通过调用 wm.checks 获取所选值。希望您能了解它的工作原理并适应您的情况?

import ipywidgets as ipyw
import string

class WidgetMaker(ipyw.VBox):

    def __init__(self):
        self.widget_count = ipyw.IntText(description='Number:')
        self.bool_widget_holder = ipyw.HBox()
        children = [
            self.widget_count,
            self.bool_widget_holder,
        ]
        self.widget_count.observe(self._add_bool_widgets, names=['value'])
        super().__init__(children=children)

    def _add_bool_widgets(self, widg):
        num_bools = widg['new']
        new_widgets = []
        for _, label in zip(range(num_bools), string.ascii_lowercase):
            new_widget = ipyw.Checkbox(description=label)
            new_widgets.append(new_widget)
        self.bool_widget_holder.children = tuple(new_widgets)

    @property
    def checks(self):
        return {
            w.description: w.value
            for w in self.bool_widget_holder.children
        }