ipywidgets动态创建复选框和数据选择

ipywidgets dynamic creation of checkboxes and selection of data

我想创建一个复选框列表,以便用户可以从数据列表中select。我已经为每条数据创建了复选框,现在我想勾选这些复选框以将数据添加到列表中。

import ipywidgets as widgets

data = ["data1", "data2", "data3", "data4"]

selected_data = []

checkboxes = [widgets.Checkbox(value=False, description=label) for label in data]

widgets.VBox(children=checkboxes)

我想做一些类似

的事情
def add_to_selected(d):
    selected_data.append(d)

checkboxes[0].observe(add_to_selected)

这会在 selected_data 列表中添加一个值。我不知道如何让 VBox 中的复选框表现得像这样。

我找到了一个可行的解决方案,但我觉得它很老套。如果有人对简化它的方法有任何建议,我将不胜感激。

此解决方案允许为 data 字典中的每个键创建一个复选框。单击复选框后,所选密钥将添加到 selected_data 列表中。

import ipywidgets as widgets

data = {"label_1":"data_1", "label_2":"data_2", "label_3":"data_3"}

names = []
checkbox_objects = []
for key in data:
    checkbox_objects.append(widgets.Checkbox(value=False, description=key))
    names.append(key)

arg_dict = {names[i]: checkbox for i, checkbox in enumerate(checkbox_objects)}

ui = widgets.VBox(children=checkbox_objects)

selected_data = []
def select_data(**kwargs):
    selected_data.clear()

    for key in kwargs:
        if kwargs[key] is True:
            selected_data.append(key)

    print(selected_data)

out = widgets.interactive_output(select_data, arg_dict)
display(ui, out)

我知道我来晚了,但这可能对以后的其他人有所帮助。

在 Jupyter 中,这是您的第一个块:

import ipywidgets as widgets
data = ["data1", "data2", "data3", "data4"]
checkboxes = [widgets.Checkbox(value=False, description=label) for label in data]
output = widgets.VBox(children=checkboxes)
display(output)

以上将输出一个VBox,其中包含列表变量'data'中的四个选项。然后要获取所选值的列表,您可以这样做:

selected_data = []
for i in range(0, len(checkboxes)):
    if checkboxes[i].value == True:
        selected_data = selected_data + [checkboxes[i].description]
print(selected_data)

请注意,我将 selected_data 列表从选择之前移到了之后。这样做的原因是,如果您多次 运行,for 循环的自我替换 selected_data 部分不会连续添加到先前选择的选择中。

您可以检查复选框中的数据并获取值列表。

小部件

data = {
    "key1":"value1"
    , "key2":"value2"
    , "key3":"value3"
}

checkboxes = [widgets.Checkbox(value=False, description=label) for label in data]
output = widgets.VBox(children=checkboxes)
display(output)

获取值列表

selected_data = []
for i in range(0, len(checkboxes)):
    if checkboxes[i].value == True:
        selected_data.append(data[str([checkboxes[i].description][0])])
print(selected_data)