如何通过按其他屏幕中的按钮来更改kivy NumericProperty对象atrribute

时间:2014-09-05 03:41:23

标签: python python-2.7 kivy setattribute setattr

在我们的应用程序中,我们有一个GameScreen,它有一个显示玩家得分的NumericProperty对象(GameScreen_player1_score)。在一个单独的ClueScreen上(使用kivy Screen Manager),我们有一个ClueAnswerButton1,它可以在按下时更改GameScreen上玩家的得分。当用户在ClueScreen上按下正确的ClueAnswerButton1时,我们如何在GameScreen上更改玩家得分的得分属性?

我们尝试在ClueScreen中创建一个player1_score变量,该变量来自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 个答案:

答案 0 :(得分: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