問題描述
我想根據窗口高度縮放按鈕或標簽內的文本,但受窗口寬度限制.以下作品:
I want to scale a text inside a button or label based on the window height, but limited by window width. The following works:
font_size: self.height - dp(15)
但是文本可以超過按鈕或標簽的寬度,所以我想用類似的東西來限制它:
However the text can exceed the width of the button or label, so I want to limit it with something like:
font_size: self.height - dp(15) if self.texture_size[0] < self.width else (self.width*2)/(self.height+0.1)
不幸的是,當 >= texture_size[0] 時它會變小,但是當文本再次變小時,它是 <自我寬度.所以它最終陷入了一個循環,從而導致 [CRITICAL] [Clock] 錯誤.
Unfortunately this has to problem that when >= texture_size[0] it will become smaller, but then when the text is smaller again, it is < self.width. So it end up stuck in a loop, which results in [CRITICAL] [Clock] error.
為了給出更清晰的畫面,紅條中的文字應該盡可能大,但不要超過按鈕寬度:
To give a more clear picture, the text in the red bar should be as big as possible, but not exceed the button width:
推薦答案
如果文本太大,可以使用縮放變換來縮小文本,這樣可以避免競爭:
You can use a scale transformation to shrink the text if it is too large, which will avoid the race:
<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 規則:
This does scale everything on the canvas, however. So if you're trying to draw a background or something, make sure it is outside the PushMatrix
/PopMatrix
. For example, if you wanted to use this with a Button
, you could rewrite Button
's kv rules:
<-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
I created a usage example as a gist: https://gist.github.com/kived/862db38078170ec0ef83
這篇關于基于窗口高度和寬度的 Kivy 縮放文本的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!