如何创建仅在进行上一个选择后才出现的下拉列表,并使用以 / 分隔的数据?

How to create dropdowns that only appear after the previous selection has been made and using data that is separated by /?

提问人:Daylyn Mosher 提问时间:4/13/2023 更新时间:4/13/2023 访问量:28

问:

我想使用 python 小部件创建根据上一个选择进行更新的下拉菜单,其中下一个下拉列表在选择上一个下拉列表之前不会出现,并且下拉列表的数量不会硬编码到代码中。

例如:

示例 1: 第一个下拉列表选择: A类 B类 下一个基于类别 A 选择的下拉列表选择: 类别 A1 类别 A2 如果选择了 A1,则下一个下拉列表选择: 类别 A1.1 类别 A1.2

示例 2: 第一个下拉列表选择: A类 B类 下一个基于类别 B 选择的下拉列表选择: 类别 B1 类别 B2 如果选择了 B2,则下一个下拉列表选择: 类别 B2.1 类别 B2.2 如果选择了 B2.1,则下拉列表选择: B2.1.1

示例 3: 第一个下拉列表选择: A类 B类 下一个基于类别 B 选择的下拉列表选择: 类别 B1 类别 B2 如果选择了 B2,则下一个下拉列表选择: 类别 B2.1 类别 B2.2 如果选择了 B2.2,则选择下一个下拉列表: B2.2.1 如果选择了 B2.2.1,则下拉列表选择: B2.2.1.1

我尝试了以下操作,但它没有正确填充。

import ipywidgets as widgets

data = {'product_id': ['p1', 'p2', 'p3', 'p4', 'p5', 'p6'],
        'categories': ['Category A/Category A1/Category A1.1',
                       'Category A/Category A1/Category A1.2',
                       'Category A/Category A2/Category A2.1',
                       'Category B/Category B1/Category B1.1/Category B1.1.1',
                       'Category B/Category B2/Category B2.1/Category B2.1.1',
                       'Category B/Category B2/Category B2.2/Category B2.2.1/Category B2.2.1.1']}

# Extract all categories from data
categories = set()
for category_path in data['categories']:
    categories.update(category_path.split('/'))

# Create a dictionary that maps each category to its parent
parent_dict = {}
for category in categories:
    parent_dict[category] = '/'.join(category.split('/')[:-1])

# Create dropdown menus
dropdowns = []
prev_dropdown = None
for category in sorted(categories):
    options = [''] + [c for c in categories if parent_dict[c] == category]
    dropdown = widgets.Dropdown(options=options)
    if prev_dropdown is not None:
        def observe_dropdown(change, prev_dropdown=prev_dropdown, dropdown=dropdown):
            prev_value = prev_dropdown.value
            if prev_value != '':
                dropdown.options = [''] + [c.split('/')[-1] for c in data['categories'] if c.startswith(prev_value+'/'+change.new+'/')]
            else:
                dropdown.options = ['']
            dropdown.value = ''
        prev_dropdown.observe(observe_dropdown, 'value')
    prev_dropdown = dropdown
    dropdowns.append(dropdown)

# Display dropdown menus
widgets.VBox(dropdowns)
下拉菜单 层次结构 分类

评论


答: 暂无答案