我正在尝试生成多个下拉列表,每个列表中都有相同的数据,但是将用作不同的变量。目前,我的代码将生成所有下拉列表。尽管每次我尝试更改任何下拉列表中的值时,该值都将分配给最后一个下拉列表,而不是从何处打开。
我从不使用任何列表开始,然后代码正常工作,但是效率很低。因此,我想减少重复部分,并形成一些列表。我使用了不同的“ 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])
预期: 从任何下拉列表中选择一个值时,应将其分配给相应的“按钮”
实际结果: 从任何下拉列表中选择一个值时,该值将分配给最后一个按钮。请参阅以下图像以获得更好的插图:
答案 0 :(得分:0)
解决方案是创建主按钮并绑定其on_release
事件以创建,填充和打开DropDown
列表。
from kivy.base import runTouchApp
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
default_list = ['Python', 'Kivy', 'Tkinter']
first_row = ['abc', 'def', 'ghi', 'jkl']
col_found = GridLayout(cols=1)
def show_dropdown(button, *largs):
dp = DropDown()
dp.bind(on_select=lambda instance, x: setattr(button, 'text', x))
for i in range(len(first_row)):
item = Button(text=str(first_row[i]) + '%d' % i, size_hint_y=None, height=24, color=(1, 1, 1, 1))
item.bind(on_release=lambda btn: dp.select(btn.text))
dp.add_widget(item)
dp.open(button)
for i in range(len(default_list)):
btn = Button(text=default_list[i], color=(1, 1, 1, 1), size_hint=(None, None))
btn.bind(on_release=show_dropdown)
col_found.add_widget(btn)
runTouchApp(col_found)