如何在Kivy中调整标签中的文本?

0 投票
2 回答
1767 浏览
提问于 2025-04-18 14:10

我有一个标签,上面有文字,我需要调整它的 font_size,让文字适合某个矩形区域。我想我应该用像素来计算大小,公式是这样的:

# 设备无关像素

px = dp * density

# 缩放无关像素

px = sp * density * fontscale

# 点数

px = pt * dpi / 72.

但是问题是,我无法获取 dpi、density、fontscale 等参数,它显示:

TypeError: 'float' object is not callable

而且似乎没有内置的函数可以让文字自动适应。

2 个回答

1

我在@Necronomicron的回答基础上进行了改进,让这段代码可以适用于矩形。对我来说,问题在于字体大小的计算没有考虑到标签的宽度,所以如果字体变得太小,字母就会跑到标签外面。

我把它改成了:

def on_texture_size(self, *args):
    try:
        if not self.factor:
            self.factor = [self.font_size / self.texture_size[0], self.font_size / self.texture_size[1]]

        self.font_size0 = self.size[0] * self.scale_factor * self.factor[0]
        self.font_size1 = self.size[1] * self.scale_factor * self.factor[1]

        if self.font_size0 < self.font_size1:
            self.font_size = self.font_size0
        else:
            self.font_size = self.font_size1
    except ZeroDivisionError:
        pass

这样选择的字体大小总是最小的,确保文本在垂直和水平上都能适合。还有,我是在创建标签(在我这个例子中是按钮)之后进行的这个调整:

button1.bind(size=lambda x, y: button1.on_texture_size())

这样每次按钮大小变化时,文本的字体大小都会更新(比如当屏幕大小改变时)。

1

我想,我找到了答案。

class BlockLabel(Label):
    scale_factor = .9
    factor = dimension = None

    def on_texture_size(self, *args):
        if not self.factor:
            self.factor = [self.font_size / self.texture_size[0], self.font_size / self.texture_size[1]]
        if not self.dimension:
            self.dimension = 1 if self.texture_size[0] * self.size[1] < self.texture_size[1] * self.size[0] else 0
        self.font_size = self.size[self.dimension] * self.scale_factor * self.factor[self.dimension]

目前我只在正方形上测试过(也就是在正方形里写的文字),但它应该也适用于长方形。如果只有正方形的话,self.size可以这样去掉:

self.dimension = 1 if self.texture_size[0] < self.texture_size[1] else 0

而且我只测试了这段代码在单行文本上的效果,不知道它在多行文本上是否能正常工作,不过应该是可以的。

撰写回答