我希望能够让按钮的文字与按钮一样大。即使按钮调整大小仍然是真的。
甚至可以在kivy吗?
我用谷歌搜索但没有找到任何东西。所以我在这里寻求帮助。
答案 0 :(得分:0)
好吧,它有点hacky,但是效果还不错。
所以我必须从style.kv复制Button规则,因为我无法在正确的位置插入Scale指令以避免过度改变背景,实际上还需要更改纹理位置,但它并不那么疯狂。
以下代码创建了一个动态类,继承自Button
,带有一些新属性,除keep_ratio
之外的所有计算都允许用户决定文本是否始终保持其比率,缩放两个维度限制性的。
x_ratio
和y_ratio
计算在每个方向上将纹理拟合到当前大小所需的比例(如果已经适合,则计算为1),而min_ratio
只占用较小的一个,如果scale_x
为True,则scale_y
和min_ratio
会获取相应的值或 keep_ratio
。
然后在scale_x
画布指令中使用这些scale_y
和Scale
值,并在pos
指令的Rectangle
中将其调整为需要(尽管我现在看到我也可以使用origin
的{{1}}选项)。
其余的kv代码只是为了演示使用一些滑块来强制按钮的大小和font_size来测试约束,以及一个复选框来判断keep_ratio是True还是False。
Scale
这适用于OpenGl指令的缩放,而不是更改from kivy.lang import Builder
from kivy.base import runTouchApp
KV = '''
<-ScaleButton@Button>:
x_ratio: min(1, self.width / (self.texture_size[0] or 1))
y_ratio: min(1, self.height / (self.texture_size[1] or 1))
min_ratio: min(self.x_ratio or 1, self.y_ratio or 1)
keep_ratio: False
scale_x: (self.min_ratio or 1) if self.keep_ratio else self.x_ratio or 1
scale_y: (self.min_ratio or 1) if self.keep_ratio else self.y_ratio or 1
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
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
Color:
rgba: 1, 1, 1, 1
PushMatrix
Scale:
x: self.scale_x or 1
y: self.scale_y or 1
Rectangle:
texture: self.texture
size: self.texture_size
pos:
(
int((self.center_x / (self.scale_x or 1)) - self.texture_size[0] / 2.),
int((self.center_y / (self.scale_y or 1)) - self.texture_size[1] / 2.)
)
PopMatrix
FloatLayout:
ScaleButton:
text: 'test ' * 5
font_size: font_size.value
size_hint: size_hint_x.value, size_hint_y.value
pos_hint: {'center': (.5, .5)}
keep_ratio: lock_ratio.active
Slider:
id: size_hint_y
orientation: 'vertical'
size_hint_x: None
value: .5
min: 0
max: 1
Slider:
id: size_hint_x
size_hint_y: None
value: .5
min: 0
max: 1
Slider:
id: font_size
orientation: 'vertical'
size_hint_x: None
value: 20
min: 10
max: 1000
pos_hint: {'right': 1}
BoxLayout:
size: self.minimum_size
size_hint: None, None
pos_hint: {'center': (.5, .8)}
CheckBox:
id: lock_ratio
size_hint: None, None
size: 20, 20
Label:
text: 'lock ratio'
size_hint: None, None
size: self.texture_size
''' # noqa
runTouchApp(Builder.load_string(KV))
,因为我会更容易和更有效(当大小约束改变时不会重新创建纹理),但另一种方式可以是font_size
而不是max_font_size
,并使用与font_size
和font_size
相同的逻辑来计算x_scale
,但这会改变y_scale
{1}},每次按钮的尺寸发生变化时,都需要重新检查原始texture_size
,或者原始尺寸的隐形纹理会计算出比例,这看起来很麻烦,没有明显的收获。
无论如何,希望有所帮助。