ipywidgets 与小部件的可变容器交互

问题描述 投票:0回答:1

对于使用 Jupyter 和 ipywidgets 进行一些交互式数据分析,我根据数据生成了许多小部件。

即最终我有许多带有复选框、RangeSlider 和 ColorPickers 的 GridBox,我将它们布局在 Tab-Widget 中。

现在我尝试使用

categories = ["A", "B", "C"] # retrieve from dataset
cbox = widgets.GridBox(children=[ widgets.Checkbox(value=True, description=v) for v in categories ])
rbox = widgets.GridBox(children=[ widgets.IntRangeSlider(value=[1,10], max=20, min=0, description=v) for v in categories ])


def analysis(variables, ranges):
    print("Hello. Currently I do nothing with the input!")

display(widgets.Tab(children=[cbox, rbox], titles=('Variables', 'Ranges')))
display(widgets.interactive_output(analysis, {"variables":cbox, "ranges":rbox}))

哪个不起作用:

AttributeError: 'GridBox' has no attribute 'value'

我也尝试过:

display(widgets.interactive_output(analysis, {"variables":cbox.children, "ranges":rbox.children}))

这也不起作用。

是否有可能将某种类型的任何类型的容器传递给我的交互功能,或者我是否需要求助于kwargs?如果是这样,您将如何有效地做到这一点?


我使用ipywidget版本8.1.5

python jupyter-notebook ipywidgets
1个回答
0
投票

我认为你的尝试是正确的

display(widgets.interactive_output(analysis, {"variables":cbox.children, "ranges":rbox.children}))
。您的代码可以很好地处理变体
display(widgets.interactive_output(analysis, {"variables":cbox.children[0], "ranges":rbox.children[0]}))
,但当然,只传递有关每个 in 中第一个的信息。关键是它仍然需要一个字典作为第二个参数,如 widgets.interactive() 的文档示例中所示
.

您仍然可以像文档中那样使用带有可变数字的字典,但您本质上需要使用

kwargs

kwargs
 实际上只是一个字典,您可以在它使用双星号运行时指定处理方式。由于交互式功能需要字典,因此这些是完全兼容的,您只需要 
**
 的信号。

这里有一个实现这个想法的选项,它充实了我认为您所追求的更多内容:

import ipywidgets as widgets categories = ["A", "B", "C"] # retrieve from dataset cbox = widgets.GridBox(children=[ widgets.Checkbox(value=True, description=v) for v in categories ]) rbox = widgets.GridBox(children=[ widgets.IntRangeSlider(value=[1,10], max=20, min=0, description=v) for v in categories ]) def analysis(**widget_dict): print("Hello. Currently I do nothing with the input!") variables = {} ranges = {} for k, v in widget_dict.items(): if k.startswith('cbox'): variables[k[4:]] = v #slice of key leaves off 'cbox' else: ranges[k[4:]] = v #slice of key leaves off 'cbox' print("VARIABLES:") [print (f" {category}: {value}") for category,value in variables.items()] print("RANGES:") [print (f" {category}: {value}") for category,value in ranges.items()] widget_dict = {} for i, child in enumerate(cbox.children): widget_dict[f'cbox{i}'] = child for i, child in enumerate(rbox.children): widget_dict[f'rbox{i}'] = child display(widgets.Tab(children=[cbox, rbox], titles=('Variables', 'Ranges'))) display(widgets.interactive_output(analysis, widget_dict))
    
© www.soinside.com 2019 - 2024. All rights reserved.