首页 > 解决方案 > 为什么我的 Kivy 标签文本不适合标签?

问题描述

我对 Kivy 如何调整各种元素的大小存在很大的知识差距,并且它对我修复它的尝试产生了抵制。

这是我的stopwatch.kv文件

#:kivy 1.11.1

<StopWatch>:
    BoxLayout:
        orientation: 'vertical'
        canvas.before:
            Color:
                rgba: .2, .2, .2, 1
            Rectangle:
                pos: self.pos
                size: self.size
        Label:
            text: "A long piece of text #1"
            size: self.texture_size
            canvas.before:
                Color:
                    rgba: .5, .1, .1, 1
                Rectangle:
                    pos: self.pos
                    size: self.size
        Label:
            text: "A long piece of text #2"
            size: self.texture_size
            text_size: root.width, None
            canvas.before:
                Color:
                    rgba: .5, .5, .1, 1
                Rectangle:
                    pos: self.pos
                    size: self.size

这里是main.py

from kivy.app import App
from kivy.uix.widget import Widget


class StopWatch(Widget):
    pass


class StopWatchApp(App):
    def build(self):
        sw = StopWatch()
        return sw


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

我已经弄清楚窗口的大小(在我的桌面上)默认情况下与其内容无关。好的。

我已经弄清楚BoxLayout默认情况下与窗口大小无关的大小。相反,它足够大以包含其子小部件。好的。

我发现Label默认情况下,a 的大小与其文本内容的大小无关。相反,我认为它是 100x100,但我还没有找到记录。

如果您希望标签足够大以覆盖文本(因此 BoxLayout 以覆盖文本),则必须指定:

size: self.texture_size

好的。但是我对第一个标签这样做了,它仍然超过了它的标签大小(我使用了一个红色的矩形来可视化。)

所以,我尝试在第二个标签中指定 text_size - 使其成为窗口的整个宽度 - 但它的文本根本没有出现!

截屏

我知道我遗漏了一些明显的东西,但是阅读手册并没有帮助。

标签: kivy

解决方案


问题是您的StopWatchextends Widget,而Widget不是作为容器。请参阅小部件类

注意上面写着的部分:

  • Widget 不是 Layout:它不会改变其子元素的位置或大小。如果您想控制定位或大小,请使用布局。
  • 小部件的默认大小为 (100, 100)。仅当父级是布局时才会更改。例如,如果您在 Button 内添加标签,则标签不会继承按钮的大小或位置,因为该按钮不是 Layout:它只是另一个 Widget。
  • 默认 size_hint 为 (1, 1)。如果父级是布局,则小部件大小将是父级布局的大小。

所以,你的StopWatch意志是 size (100,100),你Labels的比这更宽。一个简单的解决方案是更改您StopWatch的扩展,Layout如下所示:

class StopWatch(BoxLayout):
    pass

然后你可以重写你kv的:

#:kivy 1.11.1

<StopWatch>:
    orientation: 'vertical'
    canvas.before:
        Color:
            rgba: .2, .2, .2, 1
        Rectangle:
            pos: self.pos
            size: self.size
    Label:
        text: "A long piece of text #1"
        size: self.texture_size
        canvas.before:
            Color:
                rgba: .5, .1, .1, 1
            Rectangle:
                pos: self.pos
                size: self.size
    Label:
        text: "A long piece of text #2"
        size: self.texture_size
        text_size: root.width, None
        canvas.before:
            Color:
                rgba: .5, .5, .1, 1
            Rectangle:
                pos: self.pos
                size: self.size

请注意,BoxLayout已从 中删除kv,因为StopWatch现在是BoxLayout. 另外,请注意,除非您设置为,否则您的in yoursize属性将无效,因为优先于.Labelskvsize_hint(None, None)size_hintsize


推荐阅读