Skip to content Skip to sidebar Skip to footer

How To Get Id And Text Value Of A Kivy Button As String?

I have an app with multiple buttons and I need to get id and text value of the button as string when it is pressed. The grabbed Ids and Text valus of the button will then be passed

Solution 1:

First, you must pass the button instance explicitly to the method when it is called from the kv:

on_press: app.Pressbtn(self)

You can then use the instance reference to modify the button or see its attributes, you do not need the id. If you want to get the id, you can only do it using the ids dictionary of the button parent.

An example based on your code:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

kv_file = '''
<MyButton@Button>:
    color: .8,.9,0,1
    font_size: 32

<KVMyHBoxLayout>:
    orientation: 'vertical'
    MyButton:
        id:"idBtn1"
        text: "Btn1"
        background_color: 1,0,0,1
        on_press:app.Pressbtn(self)
    MyButton:
        id:"idBtn2"
        text: "Btn2"
        background_color: 0,1,0,1
        on_press:app.Pressbtn(self)
    Label:
        id: lobj
        text: "Object"
        background_color: 1,0,1,1

    Label:
        id: lid
        text: "ID"
        background_color: 0,0,1,1
    Label:
        id: ltext
        text: "Text"
        background_color: 1,0,1,1
'''classKVMyHBoxLayout(BoxLayout):
    passclassExampleApp(App):
    defPressbtn(self, instance):
        instance.parent.ids.lobj.text = str(instance)
        instance.parent.ids.ltext.text = instance.text
        instance.parent.ids.lid.text= self.get_id(instance)

    defget_id(self,  instance):
        forid, widget in instance.parent.ids.items():
            if widget.__self__ == instance:
                returniddefbuild(self):
        Builder.load_string(kv_file)
        return KVMyHBoxLayout()

if __name__ == "__main__":
    app = ExampleApp()
    app.run()

Output:

enter image description here

Edit:

If you define the widget (button) in the .py file you do not need to pass the instance to the function, it is passed automatically as argument:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView


classFirstScreen(Screen):
    def__init__(self,**kwargs):
        super(FirstScreen, self).__init__(**kwargs)    
        layout=BoxLayout(orientation="vertical",size_hint_y= None)
        layout.bind(minimum_height=layout.setter('height'))                
        for i inrange(50):
                btn = Button(text="Button"+str(i),
                             id=str(i),
                             size_hint=(None, None),
                             on_press=self.Press_auth)               #<<<<<<<<<<<<<<<<           
                layout.add_widget(btn)
        root = ScrollView()
        root.add_widget(layout)
        self.add_widget(root)

    defPress_auth(self,instance):     
        print(str(instance))

classTestScreenManager(ScreenManager):
    def__init__(self,  **kwargs):
        super(TestScreenManager,  self).__init__(**kwargs)
        self.add_widget(FirstScreen())

classExampleApp(App):
    defbuild(self):           
        return TestScreenManager()

defmain():
    app = ExampleApp()
    app.run()

if __name__ == '__main__':
    main()

Solution 2:

You can use a callback function something along these lines. In your KV file:

ToggleButton:text:'Label'id:halftimebuttonon_state:root.callback(self)

And then in your .py file you can do this:

defcallback_halftime_state(self, instance):
    if instance.state == 'down':
        self.halftime == Trueelse:
        self.halftime == False

This is of course showing the instance.state - but it could be any attribute of the button that Kivy exposes; instance.text, instance.id, etc.

Solution 3:

example to get button text on button click :

class MainApp(MDApp):
def build(self):

    VB = BoxLayout(orientation='vertical', padding=50,spacing="10")

    Atbtn = Button(text="AT (Automata Theory)", font_size="25sp")
    Atbtn.bind(on_press=self.callback)

    Pybtn = Button(text="Python", font_size="25sp")
    Pybtn.bind(on_press=self.callback)


    VB.add_widget(Atbtn)
    VB.add_widget(Pybtn)

    return VB

def callback(self, instance):
    print(instance.text)

Post a Comment for "How To Get Id And Text Value Of A Kivy Button As String?"