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

kivy adding widget without kivy language

我想制作一个带有敌人小部件的小游戏,点击它就会消失。 A 使用 kivy 语言将 Enemy 添加到一个小部件并且它工作正常,但我想添加多个敌人并且我不想添加越来越多的 Enemys,所以我想使用 add_widget 命令和 d敌人 witget 到地方小部件,但我收到错误:

 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()

您的代码有几个问题。首先是 python 问题:

您得到的错误是告诉您您正试图在 class 上调用 实例方法 (而不是 class 的对象=]).

place.add_widget(Enemy)

place 是一个 class(或 "type",如果您愿意,将其命名为 Place 以遵循一致的命名约定可能会有所帮助),并且您需要一个对象类型 'place' 调用 .add_widget 。同样,Enemy是一个class,不是一个对象,所以需要新建一个Enemy:

类型的对象
obj.add_widget(Enemy(pos=(400,300))

其中 obj 是 place 的 instance,Enemy() 创建 enemy 的 instance

现在的基维问题:

您无法通过 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