2014-08-30 101 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'。我提出,這是識別交互式創建窗口小部件的可靠方式。