Kivy 中的中心小部件
Posted
技术标签:
【中文标题】Kivy 中的中心小部件【英文标题】:Center widgets in Kivy 【发布时间】:2017-05-14 05:38:36 【问题描述】:我正在学习使用 Kivy,因此我浏览了 Pong 教程并开始修改代码。所以,我移除了除了弹跳球之外的所有东西,并决定按需生成多个球。我遇到的问题是,虽然我可以在应用程序已经运行时将球放置在我想要的位置(例如,在触摸时添加球可以正常工作),但是当我在应用程序 build() 中添加球时,它们没有得到放置正确。这是我的代码。接触的球,正确地从中心开始。但是在 build() 中添加的球是从左下角开始的。为什么?我想添加更多具有不同属性的移动小部件,但我似乎无法弄清楚如何将它们放在应用程序启动时。
#:kivy 1.0.9 : 帆布: 椭圆: pos: self.center 尺寸: 10, 10 : 尺寸:50、50 帆布: 椭圆: pos: self.pos 尺寸:self.size 从随机导入 randint 从 kivy.app 导入应用程序 从 kivy.uix.widget 导入小部件 从 kivy.properties 导入 NumericProperty、ReferenceListProperty、ListProperty 从 kivy.vector 导入向量 从 kivy.clock 导入时钟 类世界(小部件): 代理 = ListProperty() 定义添加(自我): 代理 = 代理() agent.center = self.center agent.velocity = Vector(4, 0).rotate(randint(0, 360)) self.agents.append(代理) self.add_widget(代理) def on_touch_down(自我,触摸): self.add() 定义更新(自我,dt): 对于 self.agents 中的代理: 代理.move() 如果 agent.y self.height: agent.velocity_y *= -1 如果 agent.x self.width: agent.velocity_x *= -1 类代理(小部件): 速度_x = NumericProperty(0) 速度_y = NumericProperty(0) 速度 = ReferenceListProperty(velocity_x, velocity_y) def 移动(自我): self.pos = 矢量(*self.velocity)+ self.pos WorldApp 类(应用程序): 定义构建(自我): 世界=世界() # 默认添加一个球 世界.add() Clock.schedule_interval(world.update, 1.0/60.0) 回归世界 如果 __name__ == '__main__': WorldApp().run()【问题讨论】:
【参考方案1】:找到了答案。默认小部件大小为 100、100。当我添加初始球时,World 小部件尚未渲染,因此具有默认大小。但是可以在 Widget 构造函数中传递窗口大小。所以将 World 实例化更改为
世界=世界(大小=窗口大小)解决了问题
【讨论】:
如果你必须在启动时初始化更复杂的小部件,通常在创建时不会有属性的小部件,你可以使用 kivy Clock 安排一个回调方法,你将在其中初始化所有设置,时钟会在kivy程序完成整个gui初始化后执行该方法,这样你就会得到更新的参数和属性。以上是关于Kivy 中的中心小部件的主要内容,如果未能解决你的问题,请参考以下文章