【问题标题】:How can I fit text in label in Kivy?如何在 Kivy 的标签中放置文本?
【发布时间】:2014-09-12 13:37:09
【问题描述】:

我有一个带有文本的标签,需要将其 font_size 放入某个矩形中。我想我应该得到这样的像素大小(公式):

# 与设备无关的像素

px = dp * 密度

# 缩放独立像素

px = sp * 密度 * fontscale

# 分

px = pt * dpi / 72.

但问题是我无法得到dpi, density, fontscale等,它说:

TypeError: 'float' object is not callable

而且似乎没有适合文本的内置函数。

【问题讨论】:

  • 显示完整的错误信息。有问题的行数 - 在您的代码中标记此行。
  • 错误意味着你使用了一些浮点变量somename作为函数somename()
  • @furas 我的错,我必须在没有() 的情况下使用它,尽管文档另有说明。但无论如何,这是适合文本的好方法吗?
  • 文档在哪里另有说明?这可能是一个错误或一些糟糕的写作。您通常希望使用 dp、sp 等作为函数。另外,我不太了解您的一般性问题,您能否更具体地说明您期望这些行做什么,或者包含更多代码来显示您的全部目标而不是这个特定部分。
  • @Necronomicron 问题是你使用了一些浮点变量 with ()。显示完整的错误信息。有问题的行数 - 在您的代码中标记此行。

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


【解决方案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

而且我只测试了这段代码用于单行文本,我不知道它是否适用于多行文本,尽管它应该。

【讨论】:

    【解决方案2】:

    我建立在@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多