ChrisCross
ChrisCross

Reputation: 101

KIvy button press to change label text in python code

I have a Label and a button that I define in the init of my class. In the init I bind my button to a method that should change the label. However the label does not update on button press even tho the variable does.

Why does my variable change but my label text stays the same even tho the text is an ObjectProperty?

class ReviewLayout(BoxLayout):
    Price = Price()
    textover = ObjectProperty(None)
    ordered_products = []

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

        self.get_order()
        l = Label(text = str(self.textover))
        self.add_widget(l)
        b = Button(text= 'button')
        b.bind(on_press=lambda x: self.get_order())

        self.add_widget(b)

    def get_order(self):
        ordered_products = self.ordered_products
        ordered_products.append("%s")


        print("this shall be present", ordered_products)
        self.textover = ordered_products

Upvotes: 0

Views: 597

Answers (2)

John Anderson
John Anderson

Reputation: 38937

I think an easier solution is to use kv to allow it to do the updates for you automatically, like this:

Builder.load_string('''
<ReviewLayout>:
    Label:
        text: str(root.textover)
    Button:
        text: 'button'
        on_press: root.get_order()
''')


class ReviewLayout(BoxLayout):
    Price = Price()
    textover = ListProperty()  # note change to ListProperty

    def get_order(self):
        self.textover.append("%s")
        print("this shall be present", self.textover)

Upvotes: 0

Akane
Akane

Reputation: 56

When you declare your label you set its value to self.textover value but when self.textover value changes it doesn't update the label. You need to change the value of your label by storing it as a class property and updating it whenever you want.

Just refer to this Update label's text when pressing a button in Kivy for Python

class ReviewLayout(BoxLayout):
    Price = Price()
    textover = ObjectProperty(None)
    ordered_products = []

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

        # declare label variable as a class property (in self)
        self.label = Label(text = str(self.textover))
        self.add_widget(self.label)

        self.button = Button(text= 'button')
        self.add_widget(self.button)

        self.button.bind(on_press=lambda x: self.get_order())

    def get_order(self):
        ordered_products = self.ordered_products
        ordered_products.append("%s")

        print("this shall be present", ordered_products)
        self.textover = ordered_products

        # change class variable text property to be the new textover content
        self.label.text = str(self.textover)

Upvotes: 1

Related Questions