2013-11-26 3 views
1

클래스의 사전 속성을 기반으로 kivy에서 드롭 다운 목록을 만들고 싶습니다. 그러나 루프에서 이들을 생성하는 것에 대해서는 Kivy를 혼란스럽게하거나 혼란 스럽습니다. 여기에 내가 가진 무엇을 :Kivy에서 동적으로 Dropdowns 빌드

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

여러분의 문제는 대부분 람다 함수가 for 루프에서 작동하는 방식과 관련이 있습니다. 예를 들어 this 이전 질문에 대한 정보를 볼 수 있습니다 - 짧은 대답, 모든 lambda가 같은 변수를 받으면 그 변수 만 (마지막 드롭 다운) 아무 것도하지 않습니다.

작업 예제를 만들 시간이 없었습니다. (예기치 못한 일로 초기 작업 예제를 제공하지 않았습니다.)하지만 나중에이 문제를 해결하기에 충분하지 않은 경우 나중에 만들려고합니다. 문제.

나는 또한 dropdowns 작동하지 않는 문제가 있었지만 쓰레기를 수집 할 수 있도록 참조를 저장하지 않기 때문에 생각합니다. 나는 참조를 유지하기 위해 dropdowns = ListProperty([])self.dropdowns.append(dropdown)을 추가 했으므로 이들이 나타나지 않는 문제를 해결했습니다.

+0

고맙습니다. 그게 내 문제를 해결해 줬어. – aeikenberry