我在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),但事实并非如此。
答案 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自动执行此操作并推荐使用此方法。
最后,我不知道你想要实现的目标,但我怀疑你并不是真的需要这个价值。