kivy:StackLayout 的最小高度有问题

kivy: Problem with the StackLayout's minimum height

我正在尝试创建一个可滚动的按钮列表。 当我构建按钮堆栈时,StackLayout 有一个名为 minimum_height 的参数,它由布局自动设置(所以它说 kivy 文档)。

但是当我运行调试的时候,我发现那个参数一直是0。

我认为它应该随着我添加更多按钮而改变,但事实并非如此。我不知道为什么。

from kivy.uix.button import Button
from kivy.app import App
from kivy.uix.scrollview import ScrollView
from kivy.uix.stacklayout import StackLayout

class MenuFases(StackLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.btns = []
        for i in range(0, 20):
            self.btns.append(Button(text=f'{i+1}º fase', size_hint=(1, .1)))
            self.add_widget(self.btns[i])
        self.size_hint=(1, None)
        self.height = self.minimum_height
        print(self.minimum_height)

class ScrollMenu(ScrollView):
    def __init__(self, **kwargs):
        super(ScrollMenu, self).__init__(**kwargs)
        fase = MenuFases()
        self.add_widget(fase)

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

MyApp().run()

每当布局提供 minimum_heightminimum_width 等属性时,这意味着它将自动计算包含其所有子项所需的最小高度(或宽度)。

所以这里你想让它在垂直方向自动增长。但是你的代码中的问题是,

  1. 您没有明确指定子(此处为 Button)小部件的高度,而是将 size_hint_y 设置为 0.1,这意味着它将始终包含在布局的 space。但是,

  2. 您使用 ScrollView 以便在子窗口小部件超出布局范围时滚动(垂直)。

要解决这 2 个问题,您必须明确指定子窗口小部件的高度并让布局监听该变化(这样,只要子窗口超出其边界,您就可以滚动)。对于后一部分,您必须 bind 一个回调函数,它将为您完成剩下的工作。在纯 python 中你必须手动定义它,但在 kv-lang 中它会自动处理它。

所以你需要的改变(正如我发现的那样),

for i in range(0, 20):
            self.btns.append(
                Button(
                    text=f'{i+1}º fase',
                    size_hint_y=None, # You need to set...(next line)
                    height = 200, # an explicit value.
                )
            )
            self.add_widget(self.btns[i])
        self.size_hint=(1, None)
        self.bind(minimum_height = self.setter("height")) # Listen to the change and set height accordingly.