Kivy-下拉列表-如何从所选按钮获取当前文本?

时间:2019-01-20 20:52:23

标签: python kivy

在下面的代码中,有一个按钮,当按下该按钮时,将显示带有9个值的下拉列表。 选择这些选项之一后,我想在Python上打印选择的值是什么。 例如,如果选择“值4”,则在选择“值4”时必须在代码中打印该值。

我发现了与此类似的问题,并且提供了以下链接,尽管它们都没有解决我的问题。 Python, Kivy. Get text from dynamically created buttons with a dropdown Retrieving values from a kivy dropdown widget

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label

class Test(App):
    def build(self):
        box = BoxLayout(orientation = 'vertical')
        label = Label(text = 'LABEL')
        button = Button(text='Selecione', font_size=30, size_hint_y=0.15 , on_release = self.lista)
        box.add_widget(label)
        box.add_widget(button)

        return box

    def lista(self, button):
        dropdown = DropDown()

        for index in range(10):
            btn = Button(text='Value %d' % index, size_hint_y=None, height=44)
            btn.text = 'Value %d' %index
            btn.bind(on_release=lambda btn: dropdown.select(btn.text))
            dropdown.add_widget(btn)

        button.bind(on_release=dropdown.open)
        dropdown.bind(on_select=lambda instance, x: setattr(button, 'text', x))
        print(button.text)

Test().run()

我需要在下拉列表中打印所选“按钮”的文本。

1 个答案:

答案 0 :(得分:0)

首先,您需要在dropdown.open(button)函数中添加一个lista,以便从第一个按钮调用该下拉列表时就可以打开它。

您不必在每次调用release时都重新绑定第一个按钮的lista

您还必须创建一次dropdown,而不是每次都调用lista。其按钮也是如此...

但是您必须保留它的引用,以便可以在lista函数中使用它。

最后,您必须将每个下拉按钮的on_release属性绑定到打印操作。

class Test(App):
    def build(self):
        box = BoxLayout(orientation='vertical')
        label = Label(text='LABEL')
        button = Button(text='Selecione', font_size=30, size_hint_y=0.15, on_release=self.lista)
        box.add_widget(label)
        box.add_widget(button)

        self.dropdown = DropDown()  # Create the dropdown once and keep a reference to it
        self.dropdown.bind(on_select=lambda instance, x: setattr(button, 'text', x))

        for index in range(10):  # create the buttons once
            btn = Button(text='Value %d' % index, size_hint_y=None, height=44,
                         on_release=lambda btn: print(btn.text))  # bind every btn to a print statement
            btn.text = 'Value %d' % index
            btn.bind(on_release=lambda btn: self.dropdown.select(btn.text))
            self.dropdown.add_widget(btn)
        return box

    def lista(self, button):
        # dropdown = DropDown()  <---- DON'T NEED THIS
        # button.bind(on_release=self.dropdown.open)  <---- DON'T NEED THIS
        self.dropdown.open(button)  # you need this to open the dropdown
        # print(button.text)


Test().run()