Kivy根据窗口高度和宽度缩放文本

时间:2015-07-19 17:40:45

标签: python kivy

我想根据窗口高度缩放按钮或标签内的文本,但受窗口宽度的限制。以下作品:

font_size: self.height - dp(15)

然而,文本可能会超出按钮或标签的宽度,所以我想用以下内容限制它:

font_size: self.height - dp(15) if self.texture_size[0] < self.width else (self.width*2)/(self.height+0.1)

不幸的是,当&gt; = texture_size [0]它会变小时会产生问题,但是当文本再次变小时,它会变小。 self.width。因此它最终陷入循环,导致[CRITICAL] [Clock]错误。

为了给出更清晰的图片,红色栏中的文字应尽可能大,但不要超过按钮宽度: Kivy_text-scaling

1 个答案:

答案 0 :(得分:3)

如果文本太大,您可以使用缩放转换缩小文本,这将避免竞争:

<ScaleLabel@Label>:
    _scale: 1. if self.texture_size[0] < self.width else float(self.width) / self.texture_size[0]
    canvas.before:
        PushMatrix
        Scale:
            origin: self.center
            x: self._scale or 1.
            y: self._scale or 1.
    canvas.after:
        PopMatrix

然而,它确实缩放了画布上的所有内容。因此,如果您要绘制背景或其他内容,请确保它位于PushMatrix / PopMatrix之外。例如,如果您想将其与Button一起使用,则可以重写Button的kv规则:

<-ScaleButton@Button>:
    state_image: self.background_normal if self.state == 'normal' else self.background_down
    disabled_image: self.background_disabled_normal if self.state == 'normal' else self.background_disabled_down
    _scale: 1. if self.texture_size[0] < self.width else float(self.width) / self.texture_size[0]
    canvas:
        Color:
            rgba: self.background_color
        BorderImage:
            border: self.border
            pos: self.pos
            size: self.size
            source: self.disabled_image if self.disabled else self.state_image
        PushMatrix
        Scale:
            origin: self.center
            x: self._scale or 1.
            y: self._scale or 1.
        Color:
            rgba: self.disabled_color if self.disabled else self.color
        Rectangle:
            texture: self.texture
            size: self.texture_size
            pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.)
        PopMatrix

我创建了一个用法示例作为要点:https://gist.github.com/kived/862db38078170ec0ef83