[Python] Kivy Using a ScreenManager from kv file

Discussão em 'Python' iniciado por Stack, Julho 7, 2025.

  1. Stack

    Stack Membro Participativo

    I'm writing a kivy program/game. I've made one before, but was only 1 screen in total. I've started developing a new program with ideas of implementing a Screen Manager. I managed to build the Screen Manager inside of the python file, but it wasn't suitable for my long term usage, and I wanted to try my hand at a Screen Manager from the .kv file.

    Any guidance will be greatly appreciated, not sure what I missed. I looked at this questionv(Kivy - Screen Manager - Accessing attribute in other class), and pieced together what I thought was right, but still can't get a screen to load - I feel this is a simple answer and I'm being blind...

    main.py;

    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition


    class MenuScreen(Screen):
    pass

    class NewGameScreen(Screen):
    pass

    class LoadGameScreen(Screen):
    pass

    class ASCIILifeApp(App):
    pass

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


    ASCIILife.kv;

    #: kivy 1.9
    #: import ScreenManager kivy.uix.screenmanager.ScreenManager
    #: import Screen kivy.uix.screenmanager.ScreenManager
    #: import NewGameScreen screen
    #: import LoadGameScreen screen

    ScreenManager:
    id: screen_manager
    #transition: FadeTransition()
    MenuScreen:
    id: menu_screen
    name: 'MenuScreen'
    manager: 'screen_manager'
    NewGameScreen:
    id: newgame_screen
    name: 'NewGameScreen'
    manager: 'screen_manager'
    LoadGameScreen:
    id: loadgame_screen
    name: 'LoadGameScreen'
    manager: 'screen_manager'

    <MenuScreen>:
    BoxLayout:
    orientation: 'vertical'
    Label:
    text: 'ASCII Life'
    font_size: 50
    Button:
    text: 'New Game'
    font_size: 30
    on_release: app.root.current = 'newgame'
    Button:
    text: 'Load Game'
    font_size: 30
    on_release: app.root.current = 'loadgame'
    Button:
    text: 'Settings'
    font_size: 30
    on_release: app.root.current = 'something'
    <NewGameScreen>:
    BoxLayout:
    orientation: 'vertical'
    BoxLayout:
    orientation: 'vertical'
    Label:
    text: 'Game Length in Days'
    font_size: 30
    BoxLayout:
    orientation: 'horizontal'
    ToggleButton:
    text: '100'
    state: 'down'
    group: 'newgame_days'
    font_size: 30
    ToggleButton:
    text: '200'
    group: 'newgame_days'
    font_size: 30
    BoxLayout:
    orientation: 'horizontal'
    ToggleButton:
    text: '365'
    group: 'newgame_days'
    font_size: 30
    ToggleButton:
    text: '3650'
    group: 'newgame_days'
    font_size: 30
    ToggleButton:
    text: 'Unlimited'
    group: 'newgame_days'
    font_size: 30
    BoxLayout:
    orientation: 'vertical'
    size_hint: (1, .5)
    Label:
    text: 'Difficulty (Score Multiplier)'
    font_size: 30
    BoxLayout:
    orientation: 'horizontal'
    ToggleButton:
    text: 'Easy (x1)'
    state: 'down'
    group: 'newgame_difficulty'
    font_size: 30
    ToggleButton:
    text: 'Medium (x2.5)'
    group: 'newgame_difficulty'
    font_size: 30
    ToggleButton:
    text: 'Hard (x5)'
    group: 'newgame_difficulty'
    font_size: 30
    <LoadGameScreen>:
    BoxLayout:
    orientation: 'vertical'
    Label:
    text: 'load a game'
    font_size: 30
    Widget:
    canvas:
    Ellipse:
    pos: self.pos
    size: self.size
    BoxLayout:
    Button:
    text: 'Menu'
    font_size: 30
    on_release: app.root.current = 'menu'
    Button:
    text: 'text'
    font_size: 30


    Edit: Truncated kv file

    Continue reading...

Compartilhe esta Página