Преобразование ipywidgets.widgets.widget_output.Output в список - PullRequest
1 голос
/ 07 апреля 2020

Я создал функцию, которая позволяет пользователю делать выбор из контрольного списка и возвращать выбранные значения. Проблема в том, что возвращаемый контрольный список имеет тип ipywidgets.widgets.widget_output.Output, и я не могу найти способ извлечь значения внутри результата.

import ipywidgets as widgets

def create_checklist():
    data = {"label1": "data1", "label2": "data2"}

    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)
    return out

checklist = create_checklist()

print("Displays just fine: ")
display(checklist)

print("But cannot print or use in any way. Print result: ")
print(checklist)

print(f"\nChecklist type: {type(checklist)}")

После выбора результата 'label2':

Displays just fine: 
['label2']

But cannot print or use in any way. Print result: 
Output()

Checklist type: <class 'ipywidgets.widgets.widget_output.Output'>

При определенных условиях вы также можете распечатать его (контрольный список) и получить:

Output(outputs=({'output_type': 'stream', 'text': "['label2']\n", 'name': 'stdout'},))

Я явно пробовал список (контрольный список), checklist.text, контрольный список ['text'], но безрезультатно.

Ответы [ 2 ]

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

Попробуйте переместить список selected_data в глобальную область:


import ipywidgets as widgets

selected_data = []   # in global scope rather than local scope to function

def create_checklist():
    data = {"label1": "data1", "label2": "data2"}

    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)


    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)
    return out

checklist = create_checklist()

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

enter image description here

0 голосов
/ 09 апреля 2020

На самом деле, при дальнейшем исследовании проблема не в локальных и глобальных переменных, а просто в возвращении правильной локальной переменной! Просто верните 'selected_data' вместо out, и он вернет список выборов!

import ipywidgets as widgets

def create_checklist():
    data = {"label1": "data1", "label2": "data2"}

    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)
    return selected_data

checklist = create_checklist()

print("Print checklist: ")
display(checklist)

print(f"\nChecklist type is list: {type(checklist)}")
...