user6142489
user6142489

Reputation: 532

Kivy: How to refernce kv ID in Python?

I'm new to Kivy and I would have to think this is possible, but I can't figure it out - How can I update a Kivy label when a button is pressed, but only by referencing that Kivy id within Python? (The reason I'm trying to do it this way is because in my actual application, I would like several labels to update at once, which I was hoping I could do all within the button_pressed equivalent button I have in my app).

In the simple example below, I'm just trying to have the button pressed and then have the label update to 'Updated!'

Thanks very much!

My Python code:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.properties import StringProperty
import random


class TestingWidget(BoxLayout):

    # This is the kv id of the Label I would like to update
    label_to_update = StringProperty('')

    # This is the action I would like to happen when the button is pressed
    def button_pressed(self):
        label_to_update.text = 'Updated!'

class TestButtonApp(App):
    def build(self):
        return TestingWidget()

if __name__ == '__main__':
    TestButtonApp().run()

My kv file:

<TestingWidget>:
    BoxLayout:
        orientation: 'horizontal'
        Button: 
            text: 'test'
            on_press: root.button_pressed()
        Label:
            id: label_to_update
            text: 'Trying to get this to update'

Upvotes: 1

Views: 2648

Answers (1)

Gumboy
Gumboy

Reputation: 467

You definitely update all label when you press the button. Just crate a StringProperty for each and do what you are doing now.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.properties import StringProperty
from kivy.lang import Builder #used because I didn't want to create two files

import random

Builder.load_string('''
<TestingWidget>:
    BoxLayout:
        orientation: 'horizontal'
        Button: 
            text: 'test'
            on_press: root.button_pressed()
        Label:
            id: label_to_update
            text: root.label_to_update 
            ''')
class TestingWidget(BoxLayout):

    # This is the kv id of the Label I would like to update
    label_to_update = StringProperty('Trying to get this to update')
    #default text set
    # This is the action I would like to happen when the button is pressed
    def button_pressed(self):
        self.label_to_update = 'Updated!'

class TestButtonApp(App):
    def build(self):
        return TestingWidget()

if __name__ == '__main__':
    TestButtonApp().run()

Upvotes: 4

Related Questions