Kivy 将小部件添加到屏幕
Kivy Adding Widget to a screen
这似乎是一个愚蠢的问题。但是我有一个要添加到名为 GameScreen 的屏幕的小部件。
这是我的 Python 代码:
class WelcomeScreen(Screen):
pass
class BasicScreen(Screen):
pass
class GameScreen(Screen):
parent = Widget()
game = ShootingGame()
parent.add_widget(game)
Clock.schedule_interval(game.update, 1.0 / 60.0)
# return parent
sm = ScreenManager()
sm.add_widget(WelcomeScreen(name='welcome'))
sm.add_widget(BasicScreen(name='basic'))
sm.add_widget(GameScreen(name='game'))
class ShootingApp(App):
def build(self):
print(sm.current)
return sm
if __name__ == '__main__':
ShootingApp().run()
这是我的 kivy 代码:
<WelcomeScreen>:
Button:
text: "Learn about haptic illusions"
size_hint: None, None
size: 500, 70
pos: 100, 200
font_size: 30
on_release: app.root.current = "basic"
Button:
text: "Play our game"
size_hint: None, None
size: 500, 70
pos: 100, 100
font_size: 30
on_release: app.root.current = "game"
<BasicScreen>:
name: "basic"
<GameScreen>:
name: "game"
我得到的错误是这个。我认为这是因为我已经为小部件游戏定义了父级。但是,我需要那个父级,因为游戏小部件使用其父级的宽度和高度值(例如,self.parent.width)。是否有任何解决方法,以便游戏小部件可以嵌套在父级中并将父级添加到屏幕?
kivy.uix.widget.WidgetException: Cannot add <Screen name='game'>, it already has a parent <kivy.uix.widget.Widget object at 0x1093dc8d8>
谢谢大家!!
在我看来,您尝试 GameScreen
parent 两次。有一次告诉它 parent 是 Widget()
,当你把它添加到 ScreenManager
时(这会使 sm
变成 parent)。无论哪一个先执行(我认为 parent = Widget()
行来自查看异常)都会在您第二次尝试时导致错误。
你可以这样做
class GamesScreen(Screen):
def __init__(self, **kwargs):
super(GameScreen, self).__init__(**kwargs)
self.game = ShootingGame()
self.add_widget(self.game)
clock.schedule_interval(self.game.update, 1.0 / 60.0)
这似乎是一个愚蠢的问题。但是我有一个要添加到名为 GameScreen 的屏幕的小部件。
这是我的 Python 代码:
class WelcomeScreen(Screen):
pass
class BasicScreen(Screen):
pass
class GameScreen(Screen):
parent = Widget()
game = ShootingGame()
parent.add_widget(game)
Clock.schedule_interval(game.update, 1.0 / 60.0)
# return parent
sm = ScreenManager()
sm.add_widget(WelcomeScreen(name='welcome'))
sm.add_widget(BasicScreen(name='basic'))
sm.add_widget(GameScreen(name='game'))
class ShootingApp(App):
def build(self):
print(sm.current)
return sm
if __name__ == '__main__':
ShootingApp().run()
这是我的 kivy 代码:
<WelcomeScreen>:
Button:
text: "Learn about haptic illusions"
size_hint: None, None
size: 500, 70
pos: 100, 200
font_size: 30
on_release: app.root.current = "basic"
Button:
text: "Play our game"
size_hint: None, None
size: 500, 70
pos: 100, 100
font_size: 30
on_release: app.root.current = "game"
<BasicScreen>:
name: "basic"
<GameScreen>:
name: "game"
我得到的错误是这个。我认为这是因为我已经为小部件游戏定义了父级。但是,我需要那个父级,因为游戏小部件使用其父级的宽度和高度值(例如,self.parent.width)。是否有任何解决方法,以便游戏小部件可以嵌套在父级中并将父级添加到屏幕?
kivy.uix.widget.WidgetException: Cannot add <Screen name='game'>, it already has a parent <kivy.uix.widget.Widget object at 0x1093dc8d8>
谢谢大家!!
在我看来,您尝试 GameScreen
parent 两次。有一次告诉它 parent 是 Widget()
,当你把它添加到 ScreenManager
时(这会使 sm
变成 parent)。无论哪一个先执行(我认为 parent = Widget()
行来自查看异常)都会在您第二次尝试时导致错误。
你可以这样做
class GamesScreen(Screen):
def __init__(self, **kwargs):
super(GameScreen, self).__init__(**kwargs)
self.game = ShootingGame()
self.add_widget(self.game)
clock.schedule_interval(self.game.update, 1.0 / 60.0)