之前写过一篇如何理解和使用BoxLayout中的size_hint?,解释了为什么BoxLayout中如果有children widget不定义size_hint
时,widget的尺寸与预期不一致。现在发现如果BoxLayout中只有一个Widget,无论如何定义size_hint
,都会出现某个方向(比如orientation为vertical
时的y)总是占满全部Layout。
比如,如下的界面定义中,预期是:标签宽度为窗口宽度的0.5,高度也为其0.5。实际上,宽度符合预期,高度依然是窗口的高度。这究竟是怎么回事呢?
BoxLayout:
orientation: "vertical"
Label:
text: "abc"
size_hint: 0.5, 0.5
Google了一下,发现了Organizing with Layouts
这篇文章,里面提到了一个可控尺寸
(Controlled Dimension)的概念,豁然开朗。然后大略看了一下源码,果然如此。
原文是这么说的:A box layout control (manage, automatic assign) the sizes of its children in the controlled dimension using a simple calculation: a child's relative size is its hint size divided by the sum of all children's hint size.
翻译成中文就是:在可控尺寸的方向上(vertical
中的y和horizontal
中的x),任一子Widget的相对尺寸=该Widget的对应size_hint / 该方向上所有size_hint的总和。
针对上面的例子,由于只有一个Widget,所以其相对高度 = 0.5 / 0.5 = 1。无论如何定义size_hint_y
,该标签都会自动占满整个Layout的高度。
在BoxLayout的文档中,并没有对Controlled Dimension进行说明,所以总感觉很奇怪。明白了其中的概念后就豁然开朗了。希望能对遇到同样问题的开发者有所帮助。