'How to switch text of a label in kivy

I am creating myself a GPA calculator using python kivy and I am trying to switch the text of a label but it is not working. I could use some help. I am only going to show the code that I require to change the text, but if you need it all, I am happy to send it through.

.py file:

from kivy.core.window import Window
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.popup import Popup

class main(Screen):
    def add_class(self):
        sm.current = 'add'
        sm.transition.direction = 'left'

    def remove_class(self):
        sm.current = 'remove'
        sm.transition.direction = 'right'
    
    def update(self):
        #from the screen that adds the courses
        courses = AddClass.courses
        marks = []

        for key in courses:
            marks.append(courses[key])
        
        total = 0.0
        for i in marks:
            total += i
        
        total /= len(marks)
        #print(total)

        self.ids.gpa.text = f'{total}/4.0'

class MyApp(App):
    def build(self):
        #main screen
        sm.add_widget(main(name='main'))
        #screen that adds the marks
        sm.add_widget(AddClass(name='add'))
        #screen that removes a certain mark
        sm.add_widget(RemoveClass(name='remove'))

        sm.current = 'main'
        return sm

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

.kv file:

<main>
    FloatLayout:

        Button:
            text: 'Your GPA'
            font_size: 50
            size_hint: 0.4, 0.4
            pos_hint: {'x': 0.3, 'y': 0.6}
            id: gpa
            background_color: 0, 0, 0
            on_release: print(self.text)

        Button:
            text: 'Remove Class/Course'
            font_size: 28
            id: remove_class
            size_hint: 0.4, 0.4
            pos_hint: {'y': 0.1, 'x': 0.05}
            on_release: root.remove_class()

        Button:
            text: 'Add Class/Course'
            font_size: 30
            id: add_class
            size_hint: 0.4, 0.4
            pos_hint: {'y': 0.1, 'x': 0.55}
            on_release: root.add_class()

Help is much appreciated!



Solution 1:[1]

Text of a label can be a kivy property, which can be later changed and since it is a kivy property it will automatically update everywhere. Here is an example of .py

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

class YourWidget(Widget):
    random_number = StringProperty()

    def __init__(self, **kwargs):
        super(YourWidget, self).__init__(**kwargs)
        self.random_number = str(random.randint(1, 100))

    def change_text(self):
        self.random_number = str(random.randint(1, 100))

class YourApp(App):
    def build(self):
        return YourWidget()

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

and .kv example

<YourWidget>:
    BoxLayout:
        size: root.size
        Button:
            id: button1
            text: "Change text"
            on_release: root.change_text()
        Label:
            id: label1
            text: root.random_number

When you click the button, it will call the change_text() function, which will randomly change the text of the label to a random integer between 1 and 100.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Akshat Patel