Как изменить атрибут объекта 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