Киви remove_widget не работает

Я хотел сделать киви игру со стикменом, который бегает по экрану, и как только на него нажимаешь, стикмен убирается. Я попытался удалить виджет врага с помощью Place.remove_widget(Enemy), но программа дала сбой, и я получил следующее сообщение об ошибке:

TypeError: несвязанный метод remove_widget() должен вызываться с экземпляром Place в качестве первого аргумента (вместо этого получен экземпляр класса WidgetMetaclass)

Вот мой исходный код:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.clock import Clock
from kivy.animation import Animation

class Place(FloatLayout):
    pass
class Enemy(Widget):
    velocity = NumericProperty(1)
    def __init__(self, **kwargs):
        super(Enemy, self).__init__(**kwargs)
        Clock.schedule_interval(self.Update, 1/60.)
    def Update(self, *args):
        self.x -= self.velocity
        if self.x < 1:
            self.velocity = 0
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            print 'es geht'
            self.velocity = 0
            Place.remove_widget(Enemy)


ROOT = Builder.load_string('''
Place:
    Button:
        text: 'Go Back'
        size_hint: 0.3, 0.1
        pos_hint: {"x": 0, 'y':0}
    Enemy:
        pos: 400, 100
<Enemy>:
    Image:
        pos: root.pos
        id: myimage
        source: 'enemy.png'

''')

class Caption(App):
    def build(self):
        return ROOT
if __name__ == '__main__':
    Caption().run()

person Gilgamesch    schedule 12.03.2015    source источник


Ответы (1)


Place.remove_widget(Enemy)

Вот в чем проблема — вы не пытаетесь удалить экземпляр класса Enemy из экземпляра класса Place, а вместо этого пытаетесь удалить сам фактический класс из другой. В этом разница между a = Place и a = Place() — первый представляет собой инструкции по созданию места, а второй — фактический отдельный экземпляр места.

В этом случае вы могли бы, вероятно, сделать self.parent.remove_widget(self); self.parent — это экземпляр Place, содержащий экземпляр Enemy.

person inclement    schedule 12.03.2015
comment
Я получаю сообщение об ошибке: объект «Место» не имеет атрибута «удалить» - person Gilgamesch; 13.03.2015
comment
Извините, это опечатка (сейчас исправлено), должно быть remove_widget - person inclement; 13.03.2015