Kivy 小部件行为异常

Posted

技术标签:

【中文标题】Kivy 小部件行为异常【英文标题】:Kivy widgets behaving erratically 【发布时间】:2017-05-28 04:59:38 【问题描述】:

我一直在玩 Kivy Pong 教程,熟悉框架,看看我是否可以实现一些想法。我已经删除了大部分 Pong 功能,所以我只能在屏幕上使用弹跳球,并添加了一些代码来在屏幕上生成多个弹跳球,在触摸时生成。那工作得很好。然后我添加了一些额外的画布指令,所以我会画一条线来指示球的移动方向。这就是事情变得奇怪的地方。第一个球按其应有的方式在屏幕上弹跳。但是任何随后的点击都会产生离开屏幕的球,随机改变方向和速度,并且通常表现得混乱。我一直在查看我的代码,但似乎找不到任何可能出现问题的迹象。我保留了对小部件的所有引用,我将它们添加到根小部件中,我似乎没有在它们之间共享任何信息......无论如何,这是代码,也许有人可以启发我。使用最新的 kivy 和 python 3.6。

从随机导入 randint 从 kivy.app 导入应用程序 从 kivy.clock 导入时钟 从 kivy.config 导入配置 从 kivy.vector 导入向量 从 kivy.uix.widget 导入小部件 从 kivy.properties 导入 AliasProperty、ListProperty、NumericProperty、ReferenceListProperty 类游乐场(小部件): 小动物 = ListProperty([]) 定义更新(自我,dt): 对于 self.critters 中的小动物: 小动物.move() 如果(critter.y self.height): critter.v_y *= -1 如果(critter.x self.width): 小动物.v_x *= -1 self.score.text = "".format(len(self.critters)) def on_touch_down(自我,触摸): 小动物=小动物() critter.pos = touch.x, touch.y self.critters.append(小动物) self.add_widget(小动物) 类小动物(小部件): 角度 = NumericProperty(0) v_x = NumericProperty(0) v_y = NumericProperty(0) 速度 = ReferenceListProperty(v_x, v_y) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.velocity = Vector(5, 0).rotate(randint(0, 360)) self.angle = Vector(*self.velocity).angle(Vector(1, 0)) def 移动(自我): self.pos = 矢量(*self.velocity)+ self.pos self.angle = Vector(*self.velocity).angle(Vector(1, 0)) WorldApp 类(应用程序): 定义构建(自我): 游戏=游乐场() Clock.schedule_interval(game.update, 1.0/60.0) 回归游戏 如果 __name__ == '__main__': Config.set('kivy', '桌面', 1) Config.set('kivy', 'exit_on_escape', 1) Config.set('图形', '可调整大小', 0) WorldApp().run()

和 KV 文件

分数:分数 帆布: 颜色: RGB:0.0、0.1、0.0 长方形 pos: self.pos 尺寸:self.size 标签: id: 分数 pos: self.parent.width - self.size[0], self.parent.height - self.size[1] 字体大小:16 尺寸:self.texture_size 尺寸:30、30 帆布: 旋转: 角度:self.angle 来源:self.center 轴:0、0、1 颜色: RGB:0.5、0.0、0.0 椭圆: pos: self.pos 尺寸:self.size 颜色: RGB:1、1、0.0 线: 宽度:2 积分:self.center[0]、self.center[1]、self.center[0]+self.size[0]/2、self.center[1]

【问题讨论】:

【参考方案1】:

我不确定它是否会导致您的问题,但您的 Rotate 指令不受小部件规则的限制,并且会影响任何以后的小部件 - 因此每个 Critter 的 Rotate 都会应用于以后的每个小部件。

为避免这种情况,请在画布规则的顶部添加 PushMatrix:,在底部添加 PopMatrix:。这些说明有效地保存并稍后恢复到您更改之前的初始旋转状态。

【讨论】:

我没有定义更多的小部件。但我确实想知道是否有多个以不同角度旋转的小部件是问题所在。我会尝试推送/弹出解决方案。 这有帮助!现在我得到了预期的行为。现在我将被困在试图弄清楚为什么我需要弹出/推送,但这只是我:)

以上是关于Kivy 小部件行为异常的主要内容,如果未能解决你的问题,请参考以下文章

在子小部件中,如何在 kivy 中获取父小部件的实例

Kivy 在布局末尾添加小部件

Kivy 如何访问子小部件中的小部件

Kivy 语言可以访问继承的布局和小部件吗?

在 Kivy 中传递自定义小部件属性

Kivy 日期选择器小部件