【问题标题】:Dynamically resizing a Label within a Scrollview?在滚动视图中动态调整标签的大小?
【发布时间】:2013-11-12 15:03:52
【问题描述】:

假设您有如下设置:

ScrollView:
   size_hint: (1, 0.5)

   Label:
      size_hint: (1, None)

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

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

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

【问题讨论】:

    标签: kivy


    【解决方案1】:

    实际文本显示在一个矩形中,其大小默认与标签大小耦合。当文本量很大时,它会变大并且可能超出标签边界,但不会调整标签大小。

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

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

    这将标签的高度绑定到跟踪显示文本的高度,因此应该给你你想要的行为。

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

    编辑:根据您下面的 cmets,这是我的一个应用程序中的标签示例,如果文本长度增加,它会垂直增长(以便用户可以滚动),但也会在文本宽度更大时自动换行比标签宽度。看来我实际上是通过将 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 中,我得到了我认为你想要的行为。

    【讨论】:

    • 感谢您的建议和详尽的解释,恶劣!看起来您的建议是正确的想法,但是当我尝试实施它时,我收到错误消息:'ValueError: None is not allowed for LabelCustom.height'。我正在使用自定义标签类,但通用标签也会发生同样的情况。有什么建议吗?
    • 发现这个变种:'height: self.texture_size[1]'。 'self.text_size[1]' 似乎与 LabelBase 的 'content_height' 属性相当。它解决了文本大小/滚动问题,但正如您所指出的,仍然存在文本未正确换行的问题。 'text_size: self.size' 解决方案会根据“时钟 - 下一帧之前的太多迭代”的行产生警告 - 我猜这可能与文本的长度有关......会修补还有一些。
    • 我刚刚检查了我是如何在我自己的应用程序中实现这一点的,其中有一些比我记忆中的更微妙...我不确定这是否完全有必要,但它确实有效!我在上面的编辑中添加了示例代码。
    • 是的,它解决了文本裁剪问题。再次感谢!
    • 我认为 GridLayout 的目的只是一种指定边距的简单方法。我已经让它在 BoxLayout 中正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2023-04-11
    • 2013-03-08
    • 2016-05-03
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多