user15044427
user15044427

Reputation: 1

Use button in screen 1 to change label text in screen 2 in Kivy

I've been trying to change the label2 text in layout 2, with button1 in layout1, but it doesn't seem to work, when I press the button nothing happens

Here's the code:

class layout1(GridLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.cols = 2

        self.button1 = Button(text = "Button 1 changes screen 2", on_press = self.change_label)
        self.add_widget(self.button1)

        self.change_button = Button(text = "move to screen 2", on_press = self.change_screen)
        self.add_widget(self.change_button)

    def change_screen(self, instance):
        practice_app.sm.current = "screen2"

    def change_label(self,instance):
        func_layout = layout2()
        func_layout.label2.text = "changed"

class layout2(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.cols = 2

        self.label2 = Label(text = "this should change")
        self.add_widget(self.label2)


class TestApp(App):
    def build(self):
        self.sm = ScreenManager()

        screen1 = Screen(name = "screen1")
        screen1.add_widget(layout1())
        self.sm.add_widget(screen1)

        screen2 = Screen(name = "screen2")
        screen2.add_widget(layout2())
        self.sm.add_widget(screen2)

        return self.sm

if __name__ == "__main__":
   practice_app = TestApp()
   practice_app.run()

Upvotes: 0

Views: 53

Answers (1)

John Anderson
John Anderson

Reputation: 38822

There are many ways to do what you want. Since you are not using kv, perhaps the easiest way is to save a reference to layout2. Here is a modified version of your build() method that does that:

class TestApp(App):
    def build(self):
        self.sm = ScreenManager()

        screen1 = Screen(name = "screen1")
        screen1.add_widget(layout1())
        self.sm.add_widget(screen1)

        screen2 = Screen(name = "screen2")
        self.layout2 = layout2()  # save reference to layout2
        screen2.add_widget(self.layout2)
        self.sm.add_widget(screen2)

        return self.sm

And then, use that reference in the change_label() method:

def change_label(self,instance):
    # func_layout = layout2()  #  creates a new instance of layout2 (not the one in the GUI)
    func_layout = App.get_running_app().layout2
    func_layout.label2.text = "changed"

Upvotes: 1

Related Questions