创建kivy下拉列表但只能打开其中的一部分

时间:2017-08-16 06:47:10

标签: python kivy dropdown

我使用kivy作为我的python程序的GUI工具。 当我想创建一个表时,其中有一个包含下拉列表的列,使选择值更容易。 但是,我无法使其正常工作。 以下是我的代码。

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout

sel =["A","B","C"]

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.redraw()

    def redraw(self):

        self.clear_widgets()
        self.rows = 5
        self.cols =2

        for i in range(5):

            label = Label(text="cell"+str(i+1))
            self.add_widget(label)

            drpName = DropDown()
            btnName = Button(text="B",size_hint=(None, None))
            for e in sel:
                btn=Button(text=e, size_hint_y=None, height=btnName.height)
                btn.bind(on_release=lambda btn:drpName.select(btn.text))
                drpName.add_widget(btn)
            btnName.bind(on_release=drpName.open)
            drpName.bind(on_select=lambda instance, x: setattr(btnName, 'text', x))
            self.add_widget(btnName)

class testApp(App):
    def build(self):
        return MyGrid()

if __name__=="__main__":
    testApp().run()

只有按钮的一部分打开下拉列表,所有选定的值将替换最后一个按钮的文本。 你能救我吗?提前致谢。

1 个答案:

答案 0 :(得分:0)

在循环[Building Dropdowns Dynamically in Kivy中阅读Python Lambda后,我可以使我的程序正常工作。

感谢有价值的帖子。

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout

sel =["A","B","C"]

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.redraw()

    def redraw(self):

        self.clear_widgets()
        self.rows = 5
        self.cols =2

        drpName = []

        for i in range(5):

            label = Label(text="cell"+str(i+1))
            self.add_widget(label)

            drpName.append(DropDown())
            btnName=Button(text="B",size_hint=(None, None))
            for e in sel:
                btn=Button(text=e, size_hint_y=None, height=btnName.height)
                btn.bind(on_release=lambda btn=btn,dropdown=drpName[i]:dropdown.select(btn.text))
                drpName[i].add_widget(btn)
            btnName.bind(on_release=drpName[i].open)
            drpName[i].bind(on_select=lambda instance, x,btn=btnName: setattr(btn, 'text', x))
            self.add_widget(btnName)

class testApp(App):
    def build(self):
        return MyGrid()

if __name__=="__main__":
    testApp().run()