2016-12-29 18 views
1

Я учусь использовать Kivy, поэтому я прошел через учебник понга и начал возиться с кодом. Итак, я удалил все, кроме прыгающего мяча, и решил создать несколько мячей по требованию. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я могу разместить шары, где я хочу их, когда приложение уже запущено (например, добавление шара при касании отлично работает), но когда я добавляю шары в app build(), они не получают размещен справа. Вот код, который у меня есть. Шары, расположенные на ощупь, правильно начинаются с центра. Но шар, добавленный в build(), начинается с нижнего левого угла. Зачем? Я хотел добавить больше движущихся виджетов с разными свойствами, но я не могу понять, как их разместить при запуске приложения.Виджеты центра в Kivy

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

ответ

2

Найдено ответ. Размер виджета по умолчанию - 100, 100. К моменту добавления начального шара виджет World не отображается и, следовательно, имеет размер по умолчанию. Но размер окна можно передать в конструкторе Widget. Таким образом, изменяя мир экземпляра в

 
world = World(size=Window.size) 

решить проблему