Первая копия моего кода:
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
Builder.load_string("""
<StartScreen>:
BoxLayout:
orientation: 'vertical'
Label:
size: self.texture_size
text: root.instructions
TextInput:
id: save_code
font_size: 28
Button:
text: 'Press me to go to the Game Screen'
on_press: root.load_or_start_new(save_code.text)
<CreateNewCharacterScreen>:
BoxLayout:
orientation: 'vertical'
Label:
id: instr
size: self.texture_size
text: root.instructions
TextInput:
id: name
font_size: 28
Button:
text: 'Enter a name for your character'
on_press: root.create_character(name.text)
<MainGameScreen>:
BoxLayout:
orientation: 'vertical'
Label:
id: player_data
size: self.texture_size
text: root.statistics
Button:
text: 'Workout'
on_press: root.workout("STR",1)
<MenuScreen>:
BoxLayout:
Button:
text: 'Goto settings'
on_press: root.manager.current = 'settings'
Button:
text: 'Quit'
on_press: quit()
<SettingsScreen>:
BoxLayout:
Button:
text: 'My settings button'
Button:
text: 'Back to menu'
on_press: root.manager.current = 'menu'
""")
class PlayerStatistics(Widget):
def __init__(self, username='dummy', **kwargs):
super().__init__(**kwargs)
self.name: str = username
self.strength: int = 0
self.attributeDict = {"STR": self.strength}
def increment(self, parameter, amount=1):
if self.attributeDict.__contains__(parameter):
self.attributeDict[parameter] = self.attributeDict[parameter] + amount
else:
print("That Parameter does not exist")
def __str__(self):
return str("Strength: " + str(self.strength))
# Create the screen manager = sm
class MyScreenManager(ScreenManager):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.data = PlayerStatistics
def setPlayer(self, player: PlayerStatistics):
self.data = player
print(self.data.name) # Debugging Check
def getPlayer(self):
return self.data
class StartScreen(Screen):
instructions = StringProperty(str('''
Welcome to this fun game!
If you're new to the game or you want to start from the beginning just press the button!
Otherwise, first paste in your save code, and then press the button to load the game.
'''))
def load_or_start_new(self, savedata=''):
# For now we always start a new game
if savedata != '':
self.load_game(savedata)
else:
self.start_new_game()
pass
# Right now load and new do the same thing, but that might change in the future
def load_game(self, data):
self.manager.current = 'character'
pass
def start_new_game(self):
self.manager.current = 'character'
pass
pass
class CreateNewCharacterScreen(Screen):
instructions = StringProperty(str('''
This world is unlike any world you've known before. Great Things await. But first, you'll need a name...
'''))
fail_instructions = StringProperty(str('''
This world is unlike any world you've known before. Great Things await. But first, you'll need a name...
FOOLISH MORTAL!!! ENTER A NAME FIRST BEFORE YOU CLICK THE BUTTON.
'''))
def create_character(self, username):
if username != '':
data = PlayerStatistics(username)
self.manager.setPlayer(data)
self.manager.current = 'menu'
else:
self.instructions = self.fail_instructions
pass
pass
class MainGameScreen(Screen):
playerdata =
statistics =str(playerdata)
def workout(self):
pass
class MenuScreen(Screen):
pass
class SettingsScreen(Screen):
pass
sm = MyScreenManager()
sm.add_widget(StartScreen(name='start'))
sm.add_widget(CreateNewCharacterScreen(name='character'))
sm.add_widget(MainGameScreen(name='game'))
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))
class GUIApp(App):
def build(self):
return sm
# Entry point into the game
if __name__ == '__main__':
GUIApp().run()
В вышеприведенном примере я расширяю класс ScreenManager с помощью MyScreenManager, чтобы позволить экранам знать о классе PlayerStatistics, который изменяет значения, связанные с проигрывателем. , Я хотел бы иметь возможность вызывать метод getPlayer внутри класса MainGameScreen, чтобы я мог отобразить данные внутри метки id: player_data. Или чтобы вызвать метод приращения в PlayerStatistics с помощью кнопки: on_press ...
к сожалению, это, похоже, не работает. Каков наилучший способ, чтобы мои экраны (и, следовательно, виджеты внутри них) знали об этом внешнем классе PlayerStatistics, чтобы они могли его вызывать?