MDLabel 的 Adaptive_width 属性无法正常工作

Posted

技术标签:

【中文标题】MDLabel 的 Adaptive_width 属性无法正常工作【英文标题】:Adaptive_width property of MDLabel is not working correctly 【发布时间】:2021-11-14 06:55:51 【问题描述】:

我正在使用 kivy & kivymd 制作应用程序,其中一部分我希望标签占用与实际文本一样多的空间。

这对于 kivy 本身来说似乎很简单,但由于某种原因,MDLabel 类没有任何作用。我尝试将adaptive_width 属性设置为True,我还尝试将width 直接设置为texture_size[0] 属性,但它们都不起作用(是的,我直接从github安装了kivymd)。

这是我的代码:

from kivy.lang import Builder
from kivymd.app import MDApp


class MainApp(MDApp):
    def __init__(self, **kwargs):
        super(MainApp, self).__init__(**kwargs)
        self.kv = Builder.load_string('''
#:kivy 2.0.0
BoxLayout:
    MDLabel:
        text: "Supposedly adaptive width (KivyMD)"
        font_size: "21sp"
        halign: "center"
        adaptive_width: True
        # I also tried directly setting the width to the texture_size but the results were worse
        # size_hint_x: None
        # width: self.texture_size[0]
        canvas.before:
            Color:
                rgba: .8, .1, .2, .5
            Rectangle:
                pos: self.pos
                size: self.size
    Widget:
    MDSeparator:
        orientation: "vertical"
    Widget:
    Label:
        text: "Actual adaptive width (Standard Kivy)"
        font_size: "21sp"
        color: 0, 0, 0, 1
        size_hint_x: None
        width: self.texture_size[0]
        canvas.before:
            Color:
                rgba: 0, .6, .2, .5
            Rectangle:
                pos: self.pos
                size: self.size
''')

    def build(self):
        return self.kv


if __name__ == '__main__':
    MainApp().run()

这是我的结果:

【问题讨论】:

【参考方案1】:

我不相信MDLabel 支持adaptive_width 属性。在使用width: self.texture_size[0]时,似乎还必须将text_size: None, None添加到MDLabel中,而且它在kv中的位置似乎很重要。这是您的kv 的一部分似乎有效的版本:

BoxLayout:
    MDLabel:
        text: "Supposedly adaptive width (KivyMD)"
        font_size: "21sp"
        halign: "center"
        # adaptive_width: True
        # I also tried directly setting the width to the texture_size but the results were worse
        size_hint_x: None
        width: self.texture_size[0]
        text_size: None, None  # added, and must be in this location
        canvas.before:
            Color:
                rgba: .8, .1, .2, .5
            Rectangle:
                pos: self.pos
                size: self.size

【讨论】:

谢谢,这行得通,但是,如果你将这个 (on_parent: print([item for item in dir(self) if 'adaptive_' in item])) 应用到任何 MDLabel 实例,你会看到它们之间有自适应宽度 ID,但由于某种原因它不起作用.

以上是关于MDLabel 的 Adaptive_width 属性无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

KivyMD:更改 MDLabel 的 font_name

在 Kivy 上双击时如何回调和打印 MDLabel 的文本?

如何在 python 文件中设置小部件的 ID?

如何在python中完成任务后停止线程?

我如何在 KivyMD 中制作多行标签?

使用按钮更改 kivy 或 kivymd 中的屏幕