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),尽管事实并非如此。
小部件的大小取决于您检查的时间。大小不是在创建小部件时计算的,而是在将其放置在布局中时计算的。例如:
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 语言会自动执行此操作,并且是推荐的方法。
最后,我不知道你想要实现什么,但我怀疑你并不真的立即需要这个值。
| 归档时间: |
|
| 查看次数: |
5718 次 |
| 最近记录: |