2014-08-30 94 views
0

我的问题是基于来自交互式小部件文档的this example,它使用IPython.html.widgets.interactive创建一个用于探索音频节拍的交互式小部件。这是创建插件的呼叫:在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)?仅仅是因为这是他们在创建widget的互动调用中的顺序?或者它是否从它们在呼叫签名中的顺序派生到beat_freq?如果我在v创建之后添加并删除了小部件,会发生什么情况?

说实话,我并不真正关心这些问题的答案。我只想要一种方法来识别与每个变量相对应的小部件。我认为必须有一种方法可以通过检查ContainerWidgetv来了解这一点,而不必知道它是如何创建的。毕竟,v本身显然知道,因为v.kwargs是一个将变量名连接到值的字典,并且如果您操作该小部件,则会进行相应更改。不幸的是,这个模块中的文档很少或根本不存在,而且我也无法为自己解决这个问题。

回答

2

好的,我想我已经想通了,主要是。第一个问题的答案是什么决定了子部件的顺序,似乎是由处理函数beat_freq的呼叫签名决定的。至少,如果我在beat_freq的定义中颠倒了关键字参数的顺序,而在interactive的调用中保持相同,则子部件的顺序相反:它们现在是(f2, f1)。如果beat_freq被定义为beat_freq(**kwargs)会发生什么,我还没有探讨。无论如何,这对我来说似乎非常特别,不应该依赖它。

第二个问题的答案是,如何识别每个变量对应的控件,更简单,更清晰。它是子部件的子部件。所以,在这个例子中,v.children[0].descriptionu'f1'。如果我交换beat_freq定义中的参数,则v.children[0].descriptionu'f2'。我提出,这是识别交互式创建窗口小部件的可靠方式。