2015-06-03 2 views
0

Это, кажется, глупый вопрос. Но у меня есть виджет, который я хочу добавить на экран под названием GameScreen.Kivy Добавление виджета на экран

Это мой код 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> 

Спасибо, ребята!

+0

родительской свойство автоматически устанавливается на родитель, когда ребенок добавляется к другому виджету, http://kivy.org/docs/api-kivy.uix. widget.html? highlight = parent # kivy.uix.widget.Widget.parent поэтому в вашем коде вы переопределяете родительское свойство и устанавливаете его в widget(), а когда вы добавляете GameScreen в sm, он создает исключение, которое GameScreen уже есть родитель, просто add_widget (игра) будет работать – fins

+0

Спасибо за ваш ответ! Это имеет смысл. Но выполнение add_widget (игры) дает мне имя «add_widget» не определено » – susanz

ответ

1

вы можете сделать что-то вроде этого

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) 
+0

ДА! Спасибо, Флнс! – susanz

1

Мне кажется, что происходит то, что вы пытаетесь дать GameScreen родителям ДВАЖДЫ. Однажды, сообщив, что это родитель, Widget(), и снова, когда вы добавляете его в ScreenManager (что сделало бы sm его родителем). Какой бы из них не был выполнен первым (я думаю, что линия parent = Widget(), глядя на Исключение) вызывает ошибку, когда вы пробуете ее во второй раз.

Смежные вопросы