KIVY中的浮动布局动画
我刚开始学习Python和Kivy,正在尝试做一个小游戏,但一开始就遇到了问题。我想使用浮动布局(float layout),让一些小组件从上往下掉。组件的大小是(0.1, 0.1),而移动的动画会用像素来设置。我想知道这个布局的x和y的最大像素限制是多少。我试着用kivy.metrics模块里的dp(value)来获取浮动布局的像素数量,但结果显示的都是0,0。
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.metrics import dp
class Test(FloatLayout):
def __init__(self, **kwargs):
super(Test,self).__init__(**kwargs)
print(dp(self.size))
class game(App):
def build(self):
return Test()
if __name__ == '__main__':
game().run()
这段代码只是我尝试获取dp的一个例子。没有知道最大像素的情况下,我该如何移动一个组件呢?
1 个回答
1
一个布局小部件的默认大小 Widget.size
在初始化时看起来是 (1, 1),如果你不手动指定的话。但是在小部件创建的时候(也就是 Widget.__init__
),你无法从中获取到其他的大小值。
当小部件创建完成并从 App.build
方法返回后,它会自动被添加到应用程序的小部件树中,作为根小部件,位于窗口的正下方。
当小部件被添加到父级小部件时,它的大小会根据相对于父级大小的大小提示值进行调整。默认的 Widget.size_hint
值也是 (1, 1),这意味着它会根据父级的大小进行缩放,在这个例子中就是窗口的大小。
只有在这个过程完成后,你才能获取到小部件的最终大小,比如在 App.on_start
方法中,这个方法是在 App.build
之后被调用的:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class Test(FloatLayout):
def __init__(self, **kwargs):
super(Test,self).__init__(**kwargs)
print(self.parent)
# None
print(self.get_parent_window())
# None
print(self.get_root_window())
# None
print(self.size)
# [1, 1]
print(self.size_hint)
# [1, 1]
class game(App):
def build(self):
print(self.root)
# None
return Test()
def on_start(self):
print(self.root)
# <__main__.Test object at 0x10a9d8a10>
print(self.root.parent)
# <kivy.core.window.window_pygame.WindowPygame object at 0x10a90d6d0>
print(self.root.get_parent_window())
# <kivy.core.window.window_pygame.WindowPygame object at 0x10a90d6d0>
print(self.root.get_root_window())
# <kivy.core.window.window_pygame.WindowPygame object at 0x10a90d6d0>
print(self.root.size)
# [800, 600]
if __name__ == '__main__':
game().run()
应用程序和小部件的整个生命周期和行为都在 Kivy 文档中有详细描述,但这些信息分散在不同的指南和 API 参考中。一定不要错过 小部件编程指南。