如何在Kivy中获取小部件/布局的实际大小?

时间:2014-07-16 23:28:14

标签: layout python-3.x widget kivy python-3.4

我在BoxLayout中有这个布局(以及其他元素):

<PlayField>:
    size_hint_x: None
    width: self.height
    canvas.before:
        Color:
            rgb: .9, .9, .9
        Rectangle:
            pos: self.pos
            size: self.size

main.py:

class PlayField(Layout):  # Or should it be Widget?
    pass

如何获得实际尺寸? print(self.size)显示默认大小(100,100),但事实并非如此。

1 个答案:

答案 0 :(得分:2)

小部件的大小取决于您何时进行检查。创建窗口小部件时将不会计算大小,但将其放置在布局内部时。例如:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.layout import Layout

kv = '''
<Foo>:
    on_touch_down: print(self.size)
'''
Builder.load_string(kv)

class Foo(Layout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        print (self.size)

class MyApp(App):
    def build(self):
        return Foo()

MyApp().run()

大小的__init__()方法内部值仍为(100,100)。稍后点击小部件,放置它后,将返回正确的值。

如果需要,可以将窗口小部件大小绑定到一个方法,该方法将在调整大小后调用:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.layout import Layout

class Foo(Layout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.bind(pos=self.update)
        self.bind(size=self.update)
        self.update()

    def update(self, *args):
        print(self.size)
        self.canvas.clear() 
        with self.canvas:
            pass

class MyApp(App):
    def build(self):
        return Foo()

MyApp().run()

首先,使用默认大小值创建Foo。然后显示它,因此计算适当的大小值并将其分配给size属性,从而触发update方法。任何其他大小更新(例如,如果您重新缩放窗口)也将改变此方法。 Kivy language自动执行此操作并推荐使用此方法。

最后,我不知道你想要实现的目标,但我怀疑你并不是真的需要这个价值。