【问题标题】:Kivy DropDown Lists using Iteration使用迭代的 Kivy 下拉列表
【发布时间】: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])
                        

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

实际结果: 从任何下拉列表中选择值时,会将值分配给最后一个按钮。查看这些图片以获得更好的说明:

所有下拉列表

分配到错误的地方

【问题讨论】:

    标签: python kivy dropdown


    【解决方案1】:

    解决方案是创建主按钮并绑定其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)
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多