kivy添加没有kivy语言的小部件

时间:2015-03-31 13:32:02

标签: python widget kivy

我想制作一个带有敌人小部件的小游戏,当你点击它时它会消失。 A使用kivy语言将敌人添加到小部件中并且工作正常,但我想添加多个敌人并且我不想添加越来越多的Enemys,所以我想使用add_widget命令来安排敌人看到地方小工具,但我得到了错误:

 TypeError: unbound method add_widget() must be called with place instance as first argument (got WidgetMetaclass instance instead)

这是源代码:

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(Widget):
    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
            self.parent.remove_widget(self)


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

''')

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

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。首先是python问题:

您收到的错误告诉您,您正在尝试在类上调用实例方法(而不是该类的对象)。

place.add_widget(Enemy)

place是一个类(或者#34;类型&#34;如果您愿意,将其命名为遵循一致的命名约定可能会有所帮助),并且您需要一个类型为&的对象#39;地方&#39;打电话给.add_widget。同样,Enemy是一个类,而不是一个对象,因此您需要创建一个Enemy类型的新对象:

obj.add_widget(Enemy(pos=(400,300))

其中obj是实例的地方,而Enemy()创建了敌人的实例

现在是kivy问题:

您无法通过它的名称从python访问kv中的小部件。您必须使用id标记它,然后引用该ID:

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

''')

class Caption(App):
    def build(self):
        obj = ROOT.ids.place
        obj.add_widget(Enemy(pos=(400,300)))
        return ROOT

See here for more info