2014-07-13 137 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