2014-07-13 178 views
1

我是python和kivy的新手。我正在尝试一个小游戏,我在起步本身中受到了冲击,我想使用浮动布局,并使小部件从上到下落入其中。小部件的大小是(0.1,0.1),运动的动画将像素作为选项,我如何知道布局中x和y角落像素的最大限制,我试图通过使用来自Module:kivy.metrics的dp(value),但它只显示为0,0。浮动布局中的动画KIVY

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

布局小部件的默认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参考的地方。绝对不要错过Widget Programming Guide

+0

使用你的代码,我可以找到窗口的大小,但不是小部件,如果我将小部件大小保留为(0.5,0.5),那么我无法知道移动小部件的实际大小。有没有办法来解决这个问题。请告诉我,我来自VB.net WPF,所以Python和基维对我来说都是新手,但尽可能快地学习。 – surpavan

+0

@surpavan“[800,600]”的大小是自动调整为父窗口大小后的“Test”小部件的实际最终大小。如果您在示例中将“测试”窗口小部件大小提示设置为(0.5,0.5),则它只会调整为窗口大小的一半,您将在输出中获得“[400.0,300.0]”。 – famousgarkin

+0

明白了,但是,如果每次都调整大小,我该如何编程基于px的动画。而且,在开始时,px值与开始后的值不同。而且我认为如果布局vs Widget的大小和位置上会有更好的文章,那么kivy文档是清晰的,但不是解释性的。谢谢。 – surpavan