我的问题基于Interactive widgets文档中的这个例子,该文档使用IPython.html.widgets.interactive
创建一个用于探索音频节拍的交互式widget。这是创建小部件的调用:
v = interactive(beat_freq, f1=(200.0,300.0), f2=(200.0,300.0))
beat_freq
定义如下:
def beat_freq(f1=220.0, f2=224.0):
...
我特别对这行代码感到困惑:
f1, f2 = v.children
作者是如何知道子窗口小部件的顺序是(f1, f2)
,而不是(f2, f1)
的?只是因为这是他们在调用interactive时创建小部件的顺序吗?或者它是从它们在beat_freq的调用签名中的顺序派生出来的?如果在v
创建后添加和删除小部件,会发生什么?
老实说,我真的不在乎这些问题的答案。我只想要一种方法来识别与每个变量对应的小部件。我认为一定有一种方法可以通过检查ContainerWidget
v
来解决这个问题,而不必知道它是如何创建的。毕竟,v
本身显然知道,因为v.kwargs
是一个连接变量名和值的dict,如果你摆弄小部件,它会适当地更改。不幸的是,这个模块中的文档字符串很少或根本不存在,我还没能自己解决这个问题。
好吧,我想我基本上已经解决了这个问题。第一个问题的答案似乎是由处理程序函数beat_freq
的调用签名决定的,这个问题决定了子窗口小部件的顺序。至少,如果我在beat_freq
的定义中颠倒了关键字参数的顺序,而在对interactive
的调用中保持不变,那么子窗口小部件的顺序就会颠倒:它们现在是(f2, f1)
。如果beat_freq
被定义为beat_freq(**kwargs)
会发生什么,我还没有探究。无论如何,对我来说,这似乎足够特殊,不应该依赖它
第二个问题的答案,即如何识别与每个变量对应的小部件,更简单、更清晰。它是子窗口小部件的description
traitlet。因此,在该示例中,v.children[0].description
就是u'f1'
。如果我交换beat_freq
定义中的参数,那么v.children[0].description
就是u'f2'
。我认为,这是识别交互式创建的小部件的可靠方法。