universality
universality

Reputation: 168

Why doesn't the next screen show up in kivy app?

I am expecting the following kivy app to switch screens when I press and then release the button, but nothing happens and there's no error on the terminal. When I run the app, the GirisEkrani screen show up, and then when I press and release the button in GirisEkrani, the next screen (GirisEkrani2) should show up. Do you how to make that work?

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

Builder.load_string("""
<ekranApp>
    GirisEkrani:
        id: ge
        Button:
            text: "İleri"
            on_release: ge.manager.current = ge.manager.next()

    GirisEkrani2:
        Button:
            id: ge2
            text: "Ileri 2"
            on_release: ge2.manager.current = ge2.manager.next()

    KontrolEkrani:
        id: ke
        Button:
            text: "Geri"
            on_release: ke.manager.current = ke.manager.previous()
""")
class GirisEkrani(Screen):
    pass

class GirisEkrani2(Screen):
    pass

class KontrolEkrani(Screen):
    pass

class ekranApp(App, ScreenManager):
    def build(self):
        #root = ScreenManager()
        #root.add_widget(GirisEkrani(name = "giris_ekrani"))        
        #root.add_widget(GirisEkrani2(name = "giris_ekrani2"))
        #root.add_widget(KontrolEkrani(name = "kontrol_ekrani"))
        return self

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

While people seem to advocate the use of .kv files as opposed to using pure Python, I find it very frustrating to have no errors showing up when something doesn't work.

Upvotes: 0

Views: 279

Answers (1)

John Anderson
John Anderson

Reputation: 39092

The build() method of an App is expected to return a Widget which will be the root of the Widget tree for your App, but yours returns the App itself. I suspect that will cause problems. However, your code is not working because you are not setting the names of the Screens. Here is a corrected version of your kv:

Builder.load_string("""
<ekranApp>:
    GirisEkrani:
        id: ge
        name: "giris_ekrani"
        Button:
            text: "İleri"
            on_release: ge.manager.current = ge.manager.next()

    GirisEkrani2:
        id: ge2
        name: "giris_ekrani2"
        Button:
            text: "Ileri 2"
            on_release: ge2.manager.current = ge2.manager.next()

    KontrolEkrani:
        id: ke
        name: "kontrol_ekrani"
        Button:
            text: "Geri"
            on_release: ke.manager.current = ke.manager.previous()
""")

Also, your id for GirisEkrani2 is actually set on the Button.

Upvotes: 1

Related Questions