我是python和kivy的新手。我正在尝试一个小游戏,我在开始本身,我想使用浮动布局,并使小部件从上到下落入其中。小部件大小为(0.1,0.1),移动动画会将像素作为选项,如何知道布局中x和y角像素的最大限制,我试图通过使用来自Module: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的一个例子。如何在不知道可能的最大像素的情况下移动小部件。
答案 0 :(得分: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。