2015-04-20 31 views
1

我想使用IPython Notebook小部件中的下拉小部件。一個簡單的例子如下所示...對ipython筆記本中的下拉小部件進行排序

from IPython.display import display 
from IPython.html import widgets 
import random 

genName = lambda : ''.join([chr(random.randint(65, 90)) for i in range(10) ]) 

testValues = [ genName() for i in range(20) ] 
testValues = sorted(testValues) 
testValues = dict(zip(testValues, testValues)) # This is not sorted because it is a dict 
xx = widgets.DropdownWidget(values=testValues) 

display(xx) 

現在,到DropdownWidget內被插入的值接受一個詞典,這正如我們熟知在未排序的元素。與此相關的問題是,當我們想要創建一個小部件,並按照特定的順序在下拉列表中排列這個小部件時,就不能這樣做了,如上例所示。

在我正在使用的示例中,我創建了一組小部件,這些小部件將允許用戶使用下拉小部件選擇文件。我希望文件按日期顯示。但是,由於添加值的方式(使用字典),我似乎無法有效地做到這一點。

任何人都知道如何克服這個問題?

回答

2

至少有2個選擇:

  1. 使用OrderedDict,而不是傳統的字典,像

    from collections import OrderedDict 
    ... 
    testValues = OrderedDict(zip(testValues, testValues)) # from your example 
    
  2. ,如果你不要求選擇和所獲得的值不同, 您可以使用列表代替字典here。這樣,小部件的值總是等於選定的文本。你的榜樣看起來像

    ... 
    testValues = [ genName() for i in range(20) ] 
    testValues = sorted(testValues) 
    xx = widgets.DropdownWidget(values=testValues) 
    ... 
    

基於您的代碼我假設你使用2.x版本的IPython請注意,在IPython 3.x中,窗口小部件名爲widgets.Dropdown,關鍵字values現在是options

+0

太棒了!太棒了。 – ssm