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_height
、minimum_width
等属性时,这意味着它将自动计算包含其所有子项所需的最小高度(或宽度)。
所以这里你想让它在垂直方向自动增长。但是你的代码中的问题是,
您没有明确指定子(此处为 Button
)小部件的高度,而是将 size_hint_y
设置为 0.1,这意味着它将始终包含在布局的 space。但是,
您使用 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.
我正在尝试创建一个可滚动的按钮列表。
当我构建按钮堆栈时,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_height
、minimum_width
等属性时,这意味着它将自动计算包含其所有子项所需的最小高度(或宽度)。
所以这里你想让它在垂直方向自动增长。但是你的代码中的问题是,
您没有明确指定子(此处为
Button
)小部件的高度,而是将size_hint_y
设置为 0.1,这意味着它将始终包含在布局的 space。但是,您使用
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.