【发布时间】:2019-07-02 16:09:27
【问题描述】:
我正在尝试生成多个下拉列表,每个下拉列表中都有相同的数据,但将用作不同的变量。目前我的代码将生成所有的下拉列表。尽管每次我尝试更改任何下拉列表中的值时,该值都将分配给最后一个下拉列表,而不是从其打开位置。
我从不使用任何列表开始,然后代码正常工作,但效率非常低。因此,我想减少重复的部分并形成一些列表。我玩过不同的“lambda”语句,并认为错误在于 btn[i].bind(on_release=lambda btn=btn[i]: dropdown[i].select(btn.text)) 代码行(我可能完全错了)。我不确定我是否使用我编写的代码正确设置了任何 lambda 函数。
first_row 是 Excel 文件中的数据列表。
default_list 是一个随机字符串列表
dropdown = [DropDown() for x in range (len(default_list))]
btn = [Button() for x in range (len(default_list))]
main_btn = [Button() for x in range (len(default_list))]
col_found = GridLayout(cols = 1)
## create buttons for dropdown lists with excel data
for index in range(0, len(first_row)):
for i in range (0, len(default_list)):
btn[i] = Button(text=str(first_row[index])+'%d'%i, size_hint_y=None, height=24, color = (1,1,1,1))
btn[i].bind(on_release=lambda btn=btn[i]: dropdown[i].select(btn.text))
dropdown[i].add_widget(btn[i])
## set up main buttons with dropdown lists and add them to the pop up
for i in range (0, len(default_list)):
main_btn[i] = Button(text = "default%d"%i, on_release=dropdown[i].open, color = (1,1,1,1))
dropdown[i].bind(on_select=lambda instance, x=dropdown[i]: setattr(main_btn[i], 'text', x))
col_found.add_widget(main_btn[i])
预期: 从任何下拉列表中选择值时,应将其分配给相应的“按钮”
实际结果: 从任何下拉列表中选择值时,会将值分配给最后一个按钮。查看这些图片以获得更好的说明:
所有下拉列表
分配到错误的地方
【问题讨论】: