Kivy 根据 window 高度和宽度缩放文本
Kivy scaling text based on window height and width
我想根据 window 高度缩放按钮或标签内的文本,但受限于 window 宽度。以下作品:
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)
不幸的是,当 >= texture_size[0] 时它会变小,但是当文本再次变小时,它是 < self.width。所以它最终陷入循环,导致 [CRITICAL] [Clock] 错误。
为了让图片更清晰,红条中的文字尽量大,但不要超过按钮的宽度:
如果文本太大,您可以使用缩放变换来缩小文本,这样可以避免竞争:
<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
但是,这确实可以缩放 canvas 上的所有内容。因此,如果您尝试绘制背景或其他内容,请确保它位于 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
我想根据 window 高度缩放按钮或标签内的文本,但受限于 window 宽度。以下作品:
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)
不幸的是,当 >= texture_size[0] 时它会变小,但是当文本再次变小时,它是 < self.width。所以它最终陷入循环,导致 [CRITICAL] [Clock] 错误。
为了让图片更清晰,红条中的文字尽量大,但不要超过按钮的宽度:
如果文本太大,您可以使用缩放变换来缩小文本,这样可以避免竞争:
<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
但是,这确实可以缩放 canvas 上的所有内容。因此,如果您尝试绘制背景或其他内容,请确保它位于 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