跟踪文本形式kivy下拉按钮

时间:2016-11-13 14:47:30

标签: python kivy

嗨大家好我有关于kivy DropDown的问题。我有这个例子:

def dropdownbutton(self):
    dropdown = DropDown()
    classlist = ['Barbarian', 'Knight', 'Sorcerer', 'Typical Seba', 'Hunter']
    for index in classlist:
        btn = Button(text='%s' % index, size_hint_y=None, height=44)
        btn.bind(on_release=lambda btn: dropdown.select(btn.text))
        dropdown.add_widget(btn)
    mainbutton = Button(text='Class', size_hint=(None, None))
    mainbutton.bind(on_release=dropdown.open)
    dropdown.bind(on_select=lambda instance, x: setattr(mainbutton, 'text',
                                                        x))  
    return mainbutton

我想要做的是跟踪我选择的当前btn.txt,愚蠢,但我花了大约一个小时......你能帮助我吗? btn.text始终返回Hunter

2 个答案:

答案 0 :(得分:0)

你已经通过在循环中定义lambda函数来点击这个classic problem。尝试:

btn.bind(on_release=lambda btn=btn: dropdown.select(btn.text))

答案 1 :(得分:0)

所以我在这堂课上做了一些工作:

class DropdownList(Button):

    def __init__(self, label, labels):
        Button.__init__(self,
                        text=label,
                        size_hint=(None, None))

        self.buttons = []
        self.list = DropDown()

        for label in labels:
            b = Button(text=label, notify=None, callback=None)
            b.size_hint = (None, None)
            self.buttons.append(b)
            self.list.add_widget(b)

        self.bind(on_release=self.list.open)`

使用这个类,我可以为每个按钮添加特殊行为,如下所示:

def build(self):
        classlist = ['Barbarian', 'Knight', 'Sorcerer', 'Typical Seba', 'Hunter']
        self.lst = DropdownList("Class", classlist)
        self.lst.buttons[0].bind(on_release=self.randomfunction)
        print self.lst.buttons[0].text

在行为方法中,我必须传递event作为参数:

def randomfunction(self, event):
        print "random string"

但这里仍然存在一些问题。我无法setattr更改self.list DropDown按钮的文字。我在这里错过了什么?我只想在每个按钮上有两个行为。一:从所选按钮中取出文本并将其放到DropDown按钮,然后关闭它。第二:使用所选按钮中的文本创建与按钮同名的类实例...我将暂时保留它,但是如果有人能解决它会很棒