在IPython.html.widgets.interactive中识别小部件

时间:2014-08-30 17:42:50

标签: python widget ipython ipython-notebook interactive

我的问题基于Interactive小部件文档中的this example,该文档使用IPython.html.widgets.interactive创建用于探索音频节拍的交互式小部件。这是创建窗口小部件的调用:

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)?是因为他们在创建小部件的交互式调用中的顺序是什么?或者它是从他们在beat_freq的呼叫签名中的顺序派生出来的?如果我在v创建小部件后添加和删除小部件会怎样?

说实话,我并不真正关心这些问题的答案。我只想找到一种方法来识别每个变量对应的小部件。我认为必须有一种方法可以通过检查ContainerWidget v来解决这个问题,而不必知道它是如何创建的。毕竟,v本身显然知道,因为v.kwargs是一个将变量名称连接到值的字典,并且如果你操作小部件就会适当地改变。不幸的是,这个模块中的文档字符串很少或根本不存在,我还没有能够为自己解决这个问题。

1 个答案:

答案 0 :(得分:2)

好吧,我想我已经弄清楚了,大多数情况。第一个问题的答案,即决定子窗口小部件顺序的因素,似乎是由处理函数beat_freq的调用签名决定的。至少,如果我在beat_freq的定义中反转关键字参数的顺序,同时在调用interactive时保持相同,则子窗口小部件的顺序相反:它们现在是{{ 1}}。如果将(f2, f1)定义为beat_freq我将无法探索,会发生什么。在任何情况下,这对我来说似乎都是特殊的,不应该依赖它。

第二个问题的答案,如何识别与每个变量对应的小部件,更简单,更清晰。它是子窗口小部件的beat_freq(**kwargs) traitlet。因此,在示例中,descriptionv.children[0].description。如果我交换u'f1'定义中的参数,beat_freqv.children[0].description。我提交的是,这是识别交互式创建的小部件的可靠方法。