我想基于类的字典属性在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'],
}
)
当这个呈现时,下拉栏看起来是正确的,三个按钮,但是,牛奶一个不会触发下拉菜单,咖啡一个触发它的下拉菜单,但是当选中时,更改糖按钮的's'。文本,第三个按钮正常工作,触发下拉菜单并在选择时更改按钮文本。
我觉得我只是在做我的循环错误。但也许你不能宣布这样的下拉?感谢。
编辑:这是我必须做的才能让它发挥作用。
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)
答案 0 :(得分:3)
我很确定你的问题主要与lambda函数在for循环中的行为方式有关。您可以查看例如this上一个问题,以获取有关原因的信息 - 简短回答,每个lambda接收相同的变量,因此只有该变量(最后一个下拉列表)才能执行任何操作。
我没有时间创建一个工作示例(它很繁琐,而且你没有提供一个初步的工作示例),但是如果这还不足以让你修复问题。
我也遇到了下拉菜单无法正常工作的问题,但我认为这是因为您没有存储对它们的引用,因此它们会被垃圾收集。我添加了dropdowns = ListProperty([])
和self.dropdowns.append(dropdown)
来保留引用,这解决了它们没有出现的问题。