Kivy:用lambda迭代列表

时间:2015-04-15 05:18:15

标签: loops lambda kivy

我想遍历按钮列表并使用不同的功能绑定每个按钮。但结果总是最后一个Button的功能,而不是列表中的所有功能。 这是我的代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.stacklayout import StackLayout
from kivy.uix.button import Button

class MyApp(App):
    def build(self):
        parent = StackLayout()
        button_list = []
        for i in range(0,11):
            button_list.append( Button(text = str(i), size_hint = (None,0.15)) )
            print i
        for a_button in button_list:
            parent.add_widget(a_button)
            a_button.bind( on_press = lambda x: parent.add_widget( Label(text = a_button.text) ) )

        return parent 

if __name__ == "__main__":
    MyApp().run()

我猜测我的lambda函数存在一些问题。

2 个答案:

答案 0 :(得分:0)

这是一个经典的python问题,实际上与kivy无关。例如,讨论它here

答案 1 :(得分:0)

对于那些在 6 年后仍然遇到这个问题的人,这是我的解决方案:

def buttongenerator(layout):

    hellodict = {}

    for k in range(50):
        hellodict[str(k)] = 'Hello' + str(k)
        btn = Button(text=str(k),
                     size_hint_y=None,
                     height='40dp')

        btn.bind(on_release=(lambda instance, var=hellodict[str(k)]: print(var)))
        layout.add_widget(btn)

布局只是指网格/框布局。

instance 变量是必需的,否则按钮对象将被传递到 lambda 函数中,并且(在这种情况下)将作为字符串打印到控制台。 instance 变量“吸收”按钮对象,如果这有意义的话。 (变量不必命名为 instance,它必须存在)