KIVY中的浮动布局动画

1 投票
1 回答
1087 浏览
提问于 2025-04-18 13:08

我刚开始学习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 参考中。一定不要错过 小部件编程指南

撰写回答