我想用一个火柴人在屏幕上跑来制作一个kivy游戏,一旦你点击它,就会删除火柴人。 我尝试使用Place.remove_widget(Enemy)删除敌人小部件,但程序崩溃了我收到此错误消息:
TypeError:必须使用Place实例作为第一个参数调用unbound方法remove_widget()(改为获取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()
答案 0 :(得分:2)
Place.remove_widget(Enemy)
这是问题所在 - 您并未尝试从Place类的实例中删除Enemy类的实例,而是尝试删除实际的类本身来自另一个。这是a = Place
和a = Place()
之间的差异 - 前者是如何制作地方的说明,后者是实际的单个地方实例。
在这种情况下,您可能会self.parent.remove_widget(self)
; self.parent是包含Enemy实例的Place实例。