在Scrollview中动态调整标签大小?

时间:2013-11-12 15:03:53

标签: kivy

假设您有如下设置:

ScrollView:
   size_hint: (1, 0.5)

   Label:
      size_hint: (1, None)

最初,Label没有内容/文本。如果我理解正确,在创建对象时,Label的高度为None

当应用程序运行时,Label的text属性设置为多行文本,这应该将Label的内容推送到ScrollView的边界之外。但是,要进行滚动,似乎必须动态调整Label的y维度/高度。

根据Label的新内容动态调整Label高度的最佳方法是什么,以便可以进行滚动操作?

1 个答案:

答案 0 :(得分:6)

实际文本显示在矩形中,默认情况下,其大小与标签大小相关联。当文本量很大时,它会变大并且可能超出Label边界,但不会调整标签大小。

控制显示文本实际大小的相关属性为Label.text_size。要获得所需的行为,您只需执行以下操作:

ScrollView:
   size_hint: (1, 0.5)

   Label:
      size_hint: (1, None)
      height: self.text_size[1]

这会绑定标签的高度以跟踪显示文本的高度,因此应该为您提供所需的行为。

作为旁注,更改或观看text_size通常很有用。例如,要使文本换行位于Label的边缘而不是依赖于手动换行,可以设置text_size: self.size,这意味着如果文本的宽度超出标签宽度,文本将自动换行。如果使用halign或valign(它控制纹理中的文本位置和标签本身),这也很重要 - 除非你手动将text_size设置为(再次)某些东西,否则这些属性将没有可见效果大于文本实际占用的空间。

编辑:根据您在下面的评论,这是我的一个应用程序中的标签示例,如果文本的长度增加(因此用户可以滚动),它会垂直增长,但是当文本的宽度更大时,它也会自动换行比标签宽度。看起来我实际上是通过将Label放在GridLayout中来实现的,我依旧记得这很重要。

GridLayout:
    cols: 1
    spacing: 10
    size_hint_y: None
    height: thetb.texture_size[1]

    Label:
        id: thetb
        text: 'whatever'
        text_size: self.width, None
        size_hint: (1, None)
        size: self.parent.width, self.texture_size[1]

你可以看到我使用text_size控制文本边界框(因此它包裹在标签边缘),但绑定GridLayout高度以真正跟踪texture_size高度。 GridLayout放在ScrollView中,我得到了我认为你想要的行为。