在我们的应用程序中,我们有一个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'
答案 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