mcastle
mcastle

Reputation: 2982

Kivy - Change screens after pushing button in ModalView

I am having difficulty figuring out how to correctly change screens using the on_press attribute of a button inside of a ModalView widget.

On pressing the button in the ModalView, I want the screen to change to the game_screen_name defined in the Game1HomeScreen class and other GameHomeScreen classes (as is done with the NewGameButton and SavedGameButton below). This app has multiple games, so I would rather not make a call directly to Game1HomeScreen1().game_screen_name and want to instead keep it generic, so game_screen_name takes on the value of the class from which NewGamePopup is called.

What is a good way to do this?

The main.py code:

class Game1HomeScreen(Screen):
    game_screen_name = 'game1_gameboard_screen_name'


class NewGamePopup(ModalView):
    pass


class GamesApp(App):

    sm = ScreenManager()

    def show_new_game_popup(self):
        p = NewGamePopup()
        p.open()

    def prev_screen(self):
        self.sm.current = self.game_screen_name #this line does not work of course, because there is no game_screen_name variable in the NewGamePopup class.

The .kv code:

<NewGamePopup>:
    size_hint: .5, .3
    NewGameBoxLayout:
        padding: [10,10,10,10]
        orientation: 'vertical'
        Label:
            font_name: 'fonts/playce.ttf'
            font_size: '14sp'
            markup: True
            text: '[color=#000000]Are you sure? Current game will be erased![/color]'
        Button:
            font_name: 'fonts/playce.ttf'
            font_size: '14sp'
            text: 'Confirm'
            background_normal: 'img/red_button5.png'
            background_down: 'img/red_button5.png'
            size_hint_y: None
            on_press: root.dismiss(); app.prev_screen()

<Game1HomeScreen>:
    GeneralBoxLayout:
        BannerGridLayout1:
        BodyBoxLayout:
            rows: 2
            Image:
                source: 'img/logo.png'
                size_hint: (1.0,.9)
            GridLayout:
                cols: 2
                spacing: '5dp'
                padding: '5dp'
                size_hint: (1.0,.1)
                NewGameButton:
                    id: game1
                    on_press:
                        if saved_game1.disabled == False: app.show_new_game_popup()
                        else: root.manager.current = root.game_screen_name; saved_game1.disabled = False
                SavedGameButton:
                    id: saved_game1
                    on_press: root.manager.current = root.game_screen_name;
        FooterGridLayout:
            ReturnButton:
                text: 'Return to main menu'
                on_press: root.manager.current = 'home'

Upvotes: 1

Views: 315

Answers (1)

tiktok
tiktok

Reputation: 456

Save the game screen name in a string property when the game is selected

from kivy.properties import StringProperty

....

class GamesApp(App):
    game_screen_name = StringProperty('')

Then you can use the sm.current call later as needed. Too many things were left out of the code snippet in the question to create a working version; even the build method was missing.

Upvotes: 1

Related Questions