Search code examples
pythonkivykivy-language

How to change a Label text on another screen by pressing a Button Python Kivy


How can I change the value of text in Label on the 2nd screen by pressing a Button on the 1st screen?

In my example, I have 2 screens, on the first there are 3 buttons; one should change the text to "1st text", second should change the text to "2nd text" and the third is used to move between these two screens.

On the second screen, there is a Label which text should be changed by pressing the buttons. Then, there is also the button used to move to the first screen.

My .py looks like:

import kivy
kivy.require("1.10.1")
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.app import App

class Screen1(Screen):
    pass

class Screen2(Screen):
    pass


class Select_text(App):
    def build(self):
        sm = ScreenManager(transition=FadeTransition())
        sm.add_widget(Screen1(name = "scr1"))
        sm.add_widget(Screen2(name = "scr2"))
        
        return sm

app = Select_text()
app.run()

My .kv seems like:

<Screen1>:
    
    id: scr1
    orientation: "vertical"
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: "Background.png"
            
    Button:
        id: change_to_1
        pos: (root.width-self.width)/2, 400
        size: 1200, 200
        size_hint: None, None
        text: "Change the text on the 2nd screen to »1st text«"
        #on_press: (I don‘t know what should be there)
        
    Button:
        id: change_to_2
        pos: (root.width-self.width)/2, 800
        size: 1200, 200
        size_hint: None, None
        text: "Change the text on the 2nd screen to »2nd text«"
        #on_press: (I don‘t know what should be there)
        
    Button:
        id: go_to_other_screen
        pos: (root.width-self.width)/2, 1400
        size: 600, 200
        size_hint: None, None
        text: "Go to other screen"
        on_press: root.manager.current = "scr2"
        
<Screen2>:
    
    id: scr2
    orientation: "vertical"
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: "Background.png"
            
    Label:
        id: text
        text: "Text which should be changed"
        pos: (root.width-self.width)/2, 800
        size: 600, 200
        
    Button:
        id: go_to_other_screen
        pos: (root.width-self.width)/2, 1400
        size: 600, 200
        size_hint: None, None
        text: "Go to other screen"
        on_press: root.manager.current = "scr1"

I tried to search on the internet, but it didn't solve the main issue. Thanks for any answer.


Solution

  • In the kv file call a function in the screen 1 class. You can then use the get_screen function to access the other screen and change its text in that function.

    Would probably look something like: (in the kv file)

    on_press: root.functionname()
    

    (main python file)

    def functionname(self):
            self.manager.get_screen('scr2').ids.text.text = "whatever you want here"
    

    May i also suggest changing the id of the text ur changing to something else, because it looks a bit confusing with ids.text.text

    For more info about the get_screen function if you are confused about that https://medium.com/nerd-for-tech/kivy-use-get-screen-to-access-objects-from-other-screens-8d4d6f288f3