我有一个带有文字的标签,需要font_size
才能放入某个矩形。我想我应该像这样(公式)获得像素大小:
#Device independent pixels
px = dp *密度
#Scale independent pixels
px = sp * density * fontscale
#Points
px = pt * dpi / 72。
但问题是我无法得到dpi, density, fontscale等,它说:
TypeError: 'float' object is not callable
此外,似乎没有适合文本的内置函数。
答案 0 :(得分: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
我已经仅针对单行文本测试了此代码,但我不知道它是否适用于多行文本,尽管它应该正确。
答案 1 :(得分:1)
我建立了@Necronomicron的答案,以便这些代码适用于矩形。问题(至少对我而言)是font_size计算没有考虑到标签的宽度,所以如果它太小,字母就不会在里面。
我把它改为:
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())
每次按钮大小改变时(例如,当屏幕大小改变时),文本font_size都会更新