如何在Kivy中调整标签中的文本?
我有一个标签,上面有文字,我需要调整它的 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
而且我只测试了这段代码在单行文本上的效果,不知道它在多行文本上是否能正常工作,不过应该是可以的。