Hedgy
Hedgy

Reputation: 356

How to update Button text in Kivy

I'm making an MP3 Player for a project using Kivy. I am having issues on updating the text of a Button.

The only method that I've used and successfully worked was to update the button text directly, but I want to update a variable that is what the button's text is.

Here's the minimum reproducible example:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

class FirstKivy(App):

    def __init__(self, **kwargs):
        super(FirstKivy, self).__init__(**kwargs)
        self.pausePlay = "Play"

    def build(self):
        layout = BoxLayout(orientation = "vertical")

        btn = Button(text = self.pausePlay)
        btn.bind(on_press = self.changePausePlay)

        layout.add_widget(btn)

        return layout

    def changePausePlay(self, button):
        if self.pausePlay == "Play":
            self.pausePlay = "Pause"
        elif self.pausePlay == "Pause":
            self.pausePlay = "Play"

FirstKivy().run()

I expect the button's text to change from "Play" to "Pause" on click and then from "Pause" to "Play on click again. No error messages are sent.

Any help is appreciated, I'm new to Kivy as well as OOP in Python.

Upvotes: 0

Views: 1163

Answers (1)

John Anderson
John Anderson

Reputation: 38857

The easiest way to do it is to use kv to build the gui with a StringProperty to hold the Button text:

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty

kv = '''
BoxLayout:
    orientation: 'vertical'
    Button:
        text: app.pausePlay
        on_press: app.changePausePlay(self)
'''


class FirstKivy(App):
    pausePlay = StringProperty('Play')

    def __init__(self, **kwargs):
        super(FirstKivy, self).__init__(**kwargs)

    def build(self):
        layout = Builder.load_string(kv)
        return layout

    def changePausePlay(self, button):
        if self.pausePlay == "Play":
            self.pausePlay = "Pause"
        elif self.pausePlay == "Pause":
            self.pausePlay = "Play"

FirstKivy().run()

Some key points. The kv language automatically sets up bindings when it can (creating the same gui in Python does not). The StringProperty allows kv to set up the binding so that any change in pausePlay will be reflected in the Button text.

Upvotes: 1

Related Questions