2013-11-26 23 views
1

我想基於類的字典屬性在kivy中創建下拉列表。但是在循環中創建這些內容或者讓基維感到困惑,或者我只是感到困惑。下面是我有:在Kivy中動態構建下拉列表

for main, ingrediants in self.ingrediants.items(): 
    print main, ingrediants 
    dropdown = DropDown() 

    for ingrediant in ingrediants: 
     btn = Button(text=ingrediant, size_hint_y=None, height=44) 
     btn.bind(on_release=lambda btn: dropdown.select(btn.text)) 
     dropdown.add_widget(btn) 

    trigger = Button(text=main, size_hint=(None, None)) 
    trigger.bind(on_release=dropdown.open) 
    dropdown.bind(on_select=lambda instance, x: setattr(trigger, 'text', x)) 

    self.toolbar.dropdown_bar.add_widget(trigger) 

這裏是我的財產的樣子:

ingrediants = DictProperty(
    { 
     'Milk': ['Whole Milk', 'Soy', 'Creamer'], 
     'Coffee': ['Drip Coffee', 'Espresso', 'Pour Over'], 
     'Sugar': ['Sugar', 'Simple Syrup', 'Raw Sugar'], 
    } 
) 

當此呈現,下拉欄看起來是正確的,三個按鈕,不過,牛奶一個不觸發下拉列表中,咖啡觸發它的下拉菜單,但選中後,更改糖按鈕的文本,第三個按鈕正常工作,觸發下拉菜單並更改選定按鈕上的文本。

我覺得我只是在做我的循環有問題。但是,也許你不能聲明這樣的下拉菜單?謝謝。編輯:這是我不得不做的工作。

dropdowns = {} 
for main, ingrediants in self.ingrediants.iteritems(): 
    dropdowns[main] = DropDown() 

    for ingrediant in ingrediants: 
     btn = Button(text=ingrediant, size_hint_y=None, height=44) 
     btn.bind(on_release=lambda btn=btn, dropdown=dropdowns[main]: dropdown.select(btn.text)) 
     dropdowns[main].add_widget(btn) 

    trigger = Button(text=main, size_hint=(None, 1)) 

    trigger.bind(on_release=dropdowns[main].open) 
    dropdowns[main].bind(on_select=lambda instance, x, trigger=trigger: setattr(trigger, 'text', x)) 
    self.toolbar.dropdown_bar.add_widget(trigger) 

回答

3

我敢肯定你的問題主要是與lambda函數在for循環中的行爲方式有關。你可以看到例如this以前的問題,以獲得關於爲什麼 - 簡短答案的信息,每個lambda接收相同的變量,因此只有該變量(最後一個下拉列表)纔會執行任何操作。

我沒有時間創建一個工作示例(它很煩瑣,而且您沒有提供初始工作示例),但如果這樣還不足以解決問題,我會盡量做出來問題。

我也有一個下拉不起作用的問題,但我認爲這是因爲您不存儲對它們的引用,因此它們會收集垃圾。我添加了dropdowns = ListProperty([])self.dropdowns.append(dropdown)以保持引用,解決了它們不出現的問題。

+0

非常感謝!這確實解決了我的問題。 – aeikenberry