首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有kivy语言的kivy添加小部件

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

Stack Overflow用户
提问于 2015-03-31 13:32:01
回答 1查看 906关注 0票数 0

我想做一个小游戏,当你点击它的时候,它就消失了。A使用kivy语言将敌人添加到小部件中,它运行得很好,但是我想添加多个敌人,我不想添加越来越多的敌人,所以我想使用add_widget命令将敌人的witget发送到place小部件上,但是我得到了错误:

代码语言:javascript
复制
 TypeError: unbound method add_widget() must be called with place instance as first argument (got WidgetMetaclass instance instead)

以下是源代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-01 18:09:55

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

您所得到的错误是告诉您正在尝试调用类上的实例方法(与该类的对象相反)。

代码语言:javascript
复制
place.add_widget(Enemy)

place是一个类(如果您愿意的话是" type“,那么将它命名为Place以遵循一个Consti支架命名约定可能会有帮助),您需要一个类型为'place‘的对象来调用.add_widget on。类似地,Enemy是一个类,而不是一个对象,因此需要创建一个类型为Enemy的新对象。

代码语言:javascript
复制
obj.add_widget(Enemy(pos=(400,300))

其中obj是place的实例,Enemy()创建敌人的实例。

现在的问题是:

您不能从python的名称中访问kv中的小部件。您必须用id标记它,然后引用该id:

代码语言:javascript
复制
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

有关更多信息,请看这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29369952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档