使用迭代的Kivy下拉列表

时间:2019-07-02 16:09:27

标签: python kivy dropdown

我正在尝试生成多个下拉列表,每个列表中都有相同的数据,但是将用作不同的变量。目前,我的代码将生成所有下拉列表。尽管每次我尝试更改任何下拉列表中的值时,该值都将分配给最后一个下拉列表,而不是从何处打开。

我从不使用任何列表开始,然后代码正常工作,但是效率很低。因此,我想减少重复部分,并形成一些列表。我使用了不同的“ 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])

预期: 从任何下拉列表中选择一个值时,应将其分配给相应的“按钮”

实际结果: 从任何下拉列表中选择一个值时,该值将分配给最后一个按钮。请参阅以下图像以获得更好的插图:

所有下拉列表

All Dropdown Lists

分配到错误的地方

Assigned to wrong place

1 个答案:

答案 0 :(得分:0)

解决方案是创建主按钮并绑定其on_release事件以创建,填充和打开DropDown列表。

main.py

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)

输出

App Startup Clicked Kivy Button Kivy text replaced with text from selected dropdown list