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)