Как изменить атрибут объекта kivy NumericProperty, нажав кнопку на другом экране

В нашем приложении у нас есть GameScreen с объектом NumericProperty, который отображает счет игрока (GameScreen_player1_score). На отдельном экране ClueScreen (с помощью kivy Screen Manager) у нас есть ClueAnswerButton1, который должен изменять счет игрока на GameScreen при нажатии. Как мы можем изменить атрибут оценки счета игрока на GameScreen, когда пользователь нажимает правильный ClueAnswerButton1 на экране ClueScreen?

Мы попытались создать переменную player1_score в ClueScreen, которая извлекает данные из GameScreen, но получает ошибку:

TypeError: attribute name must be string, not 'int'

код main.py здесь:

class GameScreen(Screen):
    GameScreen_player1_score = NumericProperty(0)
    ...


class ClueScreen(Screen):
    ...

    def check_choice(self):
        player1_score = self.manager.get_screen('game_home').GameScreen_player1_score

        if self.choice0.state == 'down':
            if self.choice0.text == self.correct:
                self.message.text = "[color=006600]Correct! Click back to game and keep" \
                        "playing![/color]"
                self.choice0.background_disabled_down = 'atlas://img/myatlas/green_button5'
                setattr(self,player1_score, +10)
                return
            else:
                self.message.text = "Try again"
                self.choice0.background_disabled_down = 'atlas://img/myatlas/red_button5'
                self.choice0.disabled = True

class GameApp(App):

    sm = ScreenManager()
    use_kivy_settings = False

    def build(self):

    self.sm.add_widget(GameScreen(name='game_home'))
    self.sm.add_widget(SheddClue0Screen(name='game_clue0'))

    return self.sm


if __name__ == '__main__':
    GameApp().run() 

Код bingo.kv находится здесь:

<GameScreen>:
    GeneralFloatLayout:
    GeneralAnchorLayout:
        GeneralBoxLayout:
            ScoreGridLayout:
                ScoreBoardLabel:
                    text: '[color=0046C3]Player 1[/color]'
                ScoreBoardLabel:
                    text: str(root._player1_score)

<ClueScreen>:
    message: message
    choice0: choice0
    choice1: choice1
    choice2: choice2
    choice3: choice3

    ClueBoxLayout:
        ClueLabel:
            text: "[color=0046C3]" + "Put label Here" + "[/color]"
        ClueMessage:
            id: message
        ClueAnswerButton1:
            id: choice0
            on_press: root.check_choice()
        ClueAnswerButton1:
            id: choice1
            on_press: root.check_choice()
        ClueAnswerButton1:
            id: choice2
            on_press: root.check_choice()
        ClueAnswerButton1:
            id: choice3
            on_press: root.check_choice()
        ClueGridLayout:
            ReturnButton:
                text: 'Back to game'
                on_press: root.manager.current = 'game_home'

1 ответ

Решение

Отредактируйте ваш метод check_choice следующим образом:

def check_choice(self):
    player1_score = self.manager.get_screen('game_home')

    if self.choice0.state == 'down':
        if self.choice0.text == self.correct:
            self.message.text = "[color=006600]Correct! Click back to game and keep" \
                    "playing![/color]"
            self.choice0.background_disabled_down = 'atlas://img/myatlas/green_button5'
            setattr(player1_score, 'GameScreen_player1_score', +10)
            return
        else:
            self.message.text = "Try again"
            self.choice0.background_disabled_down = 'atlas://img/myatlas/red_button5'
            self.choice0.disabled = True
Другие вопросы по тегам