Search code examples
pythonkivypopupscreen

kivy.uix.screenmanager.ScreenManagerException: No Screen with name "ScreenOne"


I get this error when I try to change the values in the Screen window from the Popup window

That is code:

test.py file:

import kivy
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.popup import Popup


class ScreenOne(Screen):
    pass

class MyPopup(Popup):
    def channge(self):
        Manager().get_screen("ScreenOne").lb.text = "this text"  # this one don't to work


class Manager(ScreenManager):
    pass

kv = Builder.load_file("test.kv")

class appApp(App):

    def build(self):
        return kv


if __name__ == "__main__":
    appApp().run()

test.kv file:

#:import Factory kivy.factory.Factory

Manager:
    ScreenOne:

<ScreenOne>:
    name: "ScreenOne"
    GridLayout:
        cols: 1
        Label:
            id: lb
            text: "Text"
        Button:
            text: "go to popup"
            on_press: Factory.MyPopup().open()

<MyPopup>:
    name: "MyPopup"
    size_hint: .4,.8
    GridLayout:
        oriental: "vertical"
        cols: 2
        Button:
            text: "chance text in Screen"
            on_press: root.channge()

I tried to use this command;

Manager().get_screen("ScreenOne").ids.lb.text = "this text"

and

ScreenOne.ids.lb.text = "this text". 

neither of which worked.

I don't know what else to try


Solution

  • I played around with it for a bit and this works for me:

    import kivy
    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.lang import Builder
    from kivy.uix.popup import Popup
    
    
    class ScreenOne(Screen):
        pass
    
    class MyPopup(Popup):
        pass
    
    class Manager(ScreenManager):
        def channge(self):
            self.get_screen("ScreenOne").ids.lb.text = "this text"
    
    kv = Builder.load_file("test.kv")
    
    class appApp(App):
    
        def build(self):
            return kv
    
    
    if __name__ == "__main__":
        appApp().run()
    

    And the kv file:

    #:import Factory kivy.factory.Factory
    
    Manager:
        ScreenOne:
    
    <ScreenOne>:
        name: "ScreenOne"
        GridLayout:
            cols: 1
            Label:
                id: lb
                text: "Text"
            Button:
                text: "go to popup"
                on_press: Factory.MyPopup().open()
    
    <MyPopup>:
        name: "MyPopup"
        size_hint: .4,.8
        GridLayout:
            oriental: "vertical"
            cols: 2
            Button:
                text: "chance text in Screen"
                on_press: app.root.channge()