我只想显示一个球在屏幕上弹跳。然而,有 2 个球显示在屏幕中央,一个移动,另一个静止。这是我的 python 代码:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, NumericProperty, ReferenceListProperty
from kivy.lang.builder import Builder
from kivy.vector import Vector
from kivy.clock import Clock
refresh_rate = 1/60
Builder.load_file("./balls.kv")
class Balls(Widget):
vx = NumericProperty(0)
vy = NumericProperty(0)
velocity = ReferenceListProperty(vx,vy)
def move(self):
self.pos = Vector(self.velocity) + self.pos
class BallsLogic(Widget):
ball = ObjectProperty(None)
def start(self):
self.ball.velocity = 10, -3
def update(self, dt):
self.ball.move()
if self.ball.y < self.y or self.ball.top > self.top:
self.ball.vy *= -1
if self.ball.x < self.x or self.ball.right > self.right:
self.ball.vx *= -1
class BallsApp(App):
def build(self):
bl = BallsLogic()
bl.start()
Clock.schedule_interval(bl.update, refresh_rate)
return bl
if __name__ == "__main__":
BallsApp().run()
随附的kv文件:
#kivy 1.0.9
<Balls>
size:50,50
canvas:
Ellipse:
size: self.size
pos: self.pos
<BallsLogic>
ball: ball
Balls:
center: self.parent.center
id: ball
Color:
rgba: 1,1,0,1
我试过重新编写程序以查看我可能哪里出错了。我只在执行移动方法时注意到这个问题,一个球留在原地,另一个球按原样在屏幕上缩放。我现在只想要一个球弹跳,我似乎无法弄清楚静止的球是从哪里来的,或者为什么它不受更新或移动方法的影响。
Kivy 将自动加载一个正确命名的
kv
文件,参见 documentation。在您的情况下,将自动加载名称为 kv
的 balls.kv
文件。另外,代码:
Builder.load_file("./balls.kv")
加载相同的文件。这导致
balls.kv
文件被加载两次,并且两个 Balls
小部件被添加到 BallsLogic
小部件。解决方法是简单地删除上面的代码行,以便balls.kv
文件只加载一次。