【问题标题】:Animating in float layout KIVY浮动布局中的动画 KIVY
【发布时间】:2014-07-13 13:38:59
【问题描述】:

我是 python 和 kivy 的新手。我正在尝试一个小游戏,我一开始就被打动了,我想使用浮动布局,并让小部件从上到下落入其中。小部件大小为(0.1,0.1),移动动画将像素作为选项,我如何知道布局中 x 和 y 角像素的最大限制,我试图通过使用知道浮动布局的像素数dp(value) 来自模块:kivy.metrics,但它仅显示为 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 的示例。如何在不知道可能的最大像素的情况下移动小部件。

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

    布局小部件的默认Widget.size在初始化时似乎是(1, 1),如果你不手动指定它,但在小部件创建时(即Widget.__init__)你不能得到任何其他大小值。

    在创建小部件并从App.build 方法返回后,它会自动作为窗口下方的根小部件添加到应用程序的小部件树中。

    当小部件被添加到父级时,它也会根据其大小提示值相对于其父级大小进行调整。默认的Widget.size_hint 值也是 (1, 1),这使它缩放到父大小,在本例中为窗口大小。

    只有在这种情况发生后,您才能获得小部件的最终尺寸,例如在App.build 之后调用的App.on_start 方法中:

    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 参考之间的各处。绝对不要错过Widget Programming Guide

    【讨论】:

    • 使用您的代码我可以找到窗口的大小,但不能找到小部件,如果我将小部件大小保持为 (0.5,0.5),那么我无法知道移动小部件的实际大小.有没有办法克服这个。请与我裸露,我来自 VB.net WPF,所以 python 和 kivy 对我来说都是新的,但我会尽可能快地学习。
    • @surpavan [800, 600] 的大小是 Test 小部件自动调整为父窗口大小后的实际最终大小。如果在示例中将 Test 小部件大小提示设置为 (0.5, 0.5),它只会调整为窗口大小的一半,并且您将在输出中得到 [400.0, 300.0]
    • 知道了,但是,如果每次都调整大小,我该如何编写基于 px 的动画。而且,开始时的 px 值与开始后的值不同。而且我认为如果有更好的关于布局与小部件大小和位置的文章会很好,kivy 文档很清楚但没有解释性。谢谢。
    • 任何其他方式知道它,否则我可以移动小部件的任何方法。
    • 我想在我的小部件上运行一些代码,因为它知道他的父母是谁。我应该使用 Widget LifeCycle 中的什么功能?我不想在我的小部件类之外使用方法,所以 App 类上的 on_start 不会这样做..
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 2013-08-04
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多