如何使按钮的文本与kivy中按钮的大小(宽度和高度)相同?

时间:2018-03-14 14:49:21

标签: kivy

我希望能够让按钮的文字与按钮一样大。即使按钮调整大小仍然是真的。

甚至可以在kivy吗?

我用谷歌搜索但没有找到任何东西。所以我在这里寻求帮助。

1 个答案:

答案 0 :(得分:0)

好吧,它有点hacky,但是效果还不错。

所以我必须从style.kv复制Button规则,因为我无法在正确的位置插入Scale指令以避免过度改变背景,实际上还需要更改纹理位置,但它并不那么疯狂。

以下代码创建了一个动态类,继承自Button,带有一些新属性,除keep_ratio之外的所有计算都允许用户决定文本是否始终保持其比率,缩放两个维度限制性的。

x_ratioy_ratio计算在每个方向上将纹理拟合到当前大小所需的比例(如果已经适合,则计算为1),而min_ratio只占用较小的一个,如果scale_x为True,则scale_ymin_ratio会获取相应的值 keep_ratio

然后在scale_x画布指令中使用这些scale_yScale值,并在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_sizefont_size相同的逻辑来计算x_scale,但这会改变y_scale {1}},每次按钮的尺寸发生变化时,都需要重新检查原始texture_size,或者原始尺寸的隐形纹理会计算出比例,这看起来很麻烦,没有明显的收获。

无论如何,希望有所帮助。