Kivy中心的小工具

时间:2016-12-29 21:26:57

标签: python kivy

我正在学习使用Kivy,所以我浏览了Pong教程并开始搞乱代码。所以,除了弹跳球之外,我除去了所有东西,并决定按需生成多个球。我遇到的问题是,当应用程序已经运行时,我可以将球放在我想要的位置(例如,在触摸时添加球​​可以正常工作),但是当我在app build()中添加球时,他们不会这样做。放好吧。这是我的代码。接触球,正确地从中心开始。但是build()中添加的球从左下角开始。为什么?我想添加更多具有不同属性的移动小部件,但我似乎无法弄清楚如何将它们放在应用程序启动上。

#:kivy 1.0.9
<World>:
    canvas:
        Ellipse:
            pos: self.center
            size: 10, 10

<Agent>:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size
from random import randint

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty, ListProperty
from kivy.vector import Vector
from kivy.clock import Clock


class World(Widget):
    agents = ListProperty()

    def add(self):
        agent = Agent()
        agent.center = self.center
        agent.velocity = Vector(4, 0).rotate(randint(0, 360))
        self.agents.append(agent)
        self.add_widget(agent)

    def on_touch_down(self, touch):
        self.add()

    def update(self, dt):
        for agent in self.agents:
            agent.move()
            if agent.y < 0 or agent.top > self.height:
                agent.velocity_y *= -1
            if agent.x < 0 or agent.right > self.width:
                agent.velocity_x *= -1


class Agent(Widget):
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    def move(self):
        self.pos = Vector(*self.velocity) + self.pos


class WorldApp(App):
    def build(self):
        world = World()
        # add one ball by default
        world.add()
        Clock.schedule_interval(world.update, 1.0/60.0)
        return world


if __name__ == '__main__':
    WorldApp().run()

1 个答案:

答案 0 :(得分:2)

找到答案。默认小部件大小为100,100。当我添加初始球时,World小部件不会呈现,因此具有默认大小。但是可以在Widget构造函数中传递窗口大小。所以改变世界实例化

world = World(size=Window.size)

解决了问题