如何在Kivy的标签中插入文字?

时间:2014-07-21 21:47:59

标签: python label font-size kivy python-3.4

我有一个带有文字的标签,需要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

此外,似乎没有适合文本的内置函数。

2 个答案:

答案 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都会更新