Можно ли заставить другой виджет ipywidgets появляться на основе выпадающего списка? - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь выяснить, возможно ли иметь другие раскрывающиеся списки / другие виджеты появляются на основе выбора в одном раскрывающемся списке. Кажется, что с 'взаимодействием' есть способы сделать значения во втором раскрывающемся списке измененными, основываясь на значениях в первом, но мне не повезло найти способ полностью изменить отображаемые виджеты, основанные на первом выборе , Ниже приведен код, который экспортирует мою панель с 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. Первоначально я пытался определить функцию, которая будет возвращать соответствующий список виджетов, но не смог обновить его на панели инструментов.

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 03 апреля 2020

Я считаю, что когда у вас есть два связанных виджета, мне легче связать их вместе в класс. Также проще написать метод для доступа к нужным значениям.

Ниже приведен аналогичный пример, в котором вы можете изменить количество логических виджетов, а затем получить выбранные значения, вызвав 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
        }

enter image description here

...