函数 lambda 如何使用 kivy 访问我的循环或循环?

How can the function lambda access to my loop or loop using kivy?

我是 Kivy 的新手,Python 我正在尝试开发一个基于 Instagram 布局界面的应用程序。

首先,我定义了一个 class ImageButton,它将使我创建一个图像按钮:

class ImageButton(ButtonBehavior, Image):
    pass

然后我使用这个 class 在网格中创建图像按钮。 这是我的代码:

class AllImage(BoxLayout):
    # screen_manager = ObjectProperty()

    def __init__(self, **kwargs):
        BoxLayout.__init__(self, **kwargs)
        self.orientation='vertical'
        self.sizable_from = 'top'
        splitter = Splitter(sizable_from = 'bottom')
        root = ScrollView()

        gridtest = GridLayout(cols=2, spacing=10)

        layout = GridLayout(cols=4, spacing=10)


        self.add_widget(splitter)
        super(AllImage, self).__init__(**kwargs)
        for im in IMAGES_NAMES:
            if IMAGES_NAMES != None :
                btn = ImageButton(source = im+'.png')
                btn.bind(on_press=  lambda a:gridtest.add_widget(ImageButton(source = im+'.png') ))

                layout.add_widget(btn)


        splitter.add_widget(gridtest)
        root.add_widget(layout)

        self.add_widget(root)

我当前的目标是在按下图像按钮时将网格 layout 中的图像按钮添加到网格 gridtest 中。

我现在遇到的问题是btn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png') )) 当我按下 ImageButton 时,我在第二个网格中没有我按下的图像,但在第一个网格中有最后一个图像。

我认为问题出在 lambda 上,因为它无法访问我的循环,而且我无法对其执行循环。 那么解决方案是什么?

Python 中的闭包(您在此处使用 lambda 创建)是后期绑定,调用函数时会查找该值(实际上,使用最后一个值作为循环变量(如果在循环中定义)。

解决方案是将 im 作为默认参数传递:

lambda a, im=im: # rest same