Kivy:使用 lambda 迭代列表

Kivy: iterate list with lambda

我想遍历按钮列表并将每个按钮绑定到不同的功能。但是结果总是最后一个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 函数有问题。

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

对于那些在 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)

布局只是指grid/box布局。

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