不需要的重复 kivy 小部件

问题描述 投票:0回答:1

我只想显示一个球在屏幕上弹跳。然而,有 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

我试过重新编写程序以查看我可能哪里出错了。我只在执行移动方法时注意到这个问题,一个球留在原地,另一个球按原样在屏幕上缩放。我现在只想要一个球弹跳,我似乎无法弄清楚静止的球是从哪里来的,或者为什么它不受更新或移动方法的影响。

python kivy kivy-language
1个回答
0
投票

Kivy 将自动加载一个正确命名的

kv
文件,参见 documentation。在您的情况下,将自动加载名称为
kv
balls.kv
文件。另外,代码:

Builder.load_file("./balls.kv")

加载相同的文件。这导致

balls.kv
文件被加载两次,并且两个
Balls
小部件被添加到
BallsLogic
小部件。解决方法是简单地删除上面的代码行,以便
balls.kv
文件只加载一次。

© www.soinside.com 2019 - 2024. All rights reserved.