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

Nec*_*ron 7 layout widget python-3.x 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
Run Code Online (Sandbox Code Playgroud)

主要.py:

class PlayField(Layout):  # Or should it be Widget?
    pass
Run Code Online (Sandbox Code Playgroud)

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

Nyk*_*kin 7

小部件的大小取决于您检查的时间。大小不是在创建小部件时计算的,而是在将其放置在布局中时计算的。例如:

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()
Run Code Online (Sandbox Code Playgroud)

方法内部__init__()的size值仍然是(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()
Run Code Online (Sandbox Code Playgroud)

首先,Foo使用默认大小值创建。然后它被显示,因此计算出正确的尺寸值并将其分配给尺寸属性,这会触发update方法。任何其他大小更新(例如,如果重新缩放窗口)也将触发此方法。Kivy 语言会自动执行此操作,并且是推荐的方法。

最后,我不知道你想要实现什么,但我怀疑你并不真的立即需要这个值。