当按下按钮时,将动态创建的按钮信息传递给函数。猕猴桃、猕猴桃、蟒蛇猕猴桃、按钮、蟒蛇、按下

2023-09-04 02:27:52 作者:時光在唱歌

当用户按下按钮上的垃圾桶时,我正在尝试删除有关该按钮的信息。

我的问题是,当用户按下任何按钮的垃圾桶时,只有最后创建的按钮的信息会传递给该函数,因此只会删除最后创建的按钮,而不会删除按下的按钮。

猕猴桃素材图片免费下载 高清图片png 千库网 图片编号1362246

请参见下图。

picture

        docs = users_ref.collection(u'Education').stream()
        education_lst = []
        education_btn = []

        for doc in docs:
            dict = doc.to_dict()
            education_lst.append(dict['Graduation'])
            primary = str(dict['University'])
            secondary = str(dict['Degree']) + ' in ' + str(dict['Major'])
            tertiary = 'Graduation year: ' + dict['Graduation']

            btn = ThreeLineAvatarIconListItem(text=primary, secondary_text=secondary, tertiary_text=tertiary)
            education_btn.append(btn)
        for btn in education_btn:
            pic = IconRightWidget(icon='trash-can')
            pic.bind(on_release=lambda *args: Education().delete(education_lst[education_btn.index(btn)]))
            btn.add_widget(pic)
            sm.get_screen('profile').ids.profile_grid.add_widget(btn)

推荐答案

在循环中定义lambda函数时,这是一个常见问题。在实际执行lambda之前,不会计算lambda函数中使用的循环变量。因此,在您的例子中,btn参数最终是btn的最后一个值。修复方法是使用一个新变量来保存循环变量的值,如下所示:

pic.bind(on_release=lambda *args, x=btn: self.delete(education_lst[education_btn.index(x)]))