Kivy - Drop-down List - How to get current text from selected button?

十年热恋 提交于 2021-02-11 14:48:17

问题


In the following code, there is a button that when pressed shows a drop-down list with 9 Values. Once I select one of these options, I would like to print on Python what is the value that I selected. For example, if I select "Value 4", in the moment that I select "Value 4" this value has to be printed in my code.

I found some similar question about this, and I provide the link below, although none of them solved my problem. 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()

I need to print the text of the selected "button" in the drop down list.


回答1:


First of all, you need to add a dropdown.open(button) to the lista function, for the dropdown to open when called from the first button.

You don't have to re-bind the release of the first button every time you call the lista.

You also have to create the dropdown once, not with every call to the lista. The same goes for its buttons too...

But you have to keep a reference of it, so you can use it inside the lista function.

And finally, you have to bind the on_release attribute of every dropdown button to a print action.

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()


来源:https://stackoverflow.com/questions/54280855/kivy-drop-down-list-how-to-get-current-text-from-selected-button

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!