0

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

但是当我运行调试时,我发现那个参数总是为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()
4

1 回答 1

0

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

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

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

  2. 每当子小部件超出布局的界限时,您ScrollView就可以(垂直)滚动。

要解决这两个问题,您必须明确指定子窗口小部件的高度并让布局监听该更改(这样每当孩子超出其边界时,您就可以滚动)。对于后一部分,您必须使用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.
于 2022-01-17T20:52:56.213 回答