对于使用 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
我认为你的尝试是正确的
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))