按下时将动态创建的按钮信息传递给函数。 kivymd, kivy, 蟒蛇
Posted
技术标签:
【中文标题】按下时将动态创建的按钮信息传递给函数。 kivymd, kivy, 蟒蛇【英文标题】:Pass dynamically created button information to a function when they are pressed. kivymd, kivy, python 【发布时间】:2021-10-05 14:23:38 【问题描述】:当用户按下按钮上的垃圾桶时,我试图删除有关按钮的信息。
我的问题是,当用户按下任何按钮的垃圾桶时,只有最后创建的按钮的信息被传递给函数,因此只有最后创建的按钮被删除而不是按钮之一按下。
请看下图。
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)
【问题讨论】:
【参考方案1】:这是在循环中定义lambda
函数时的常见问题。 lambda
函数中使用的循环变量在 lambda
实际执行之前不会被计算。因此,在您的情况下,btn
参数最终成为btn
的最后一个值。解决方法是使用一个新变量来保存循环变量的值,如下所示:
pic.bind(on_release=lambda *args, x=btn: self.delete(education_lst[education_btn.index(x)]))
【讨论】:
以上是关于按下时将动态创建的按钮信息传递给函数。 kivymd, kivy, 蟒蛇的主要内容,如果未能解决你的问题,请参考以下文章
当 UIView 上的按钮被按下时,ViewController 中的标签会动态变化