如何在Kivy的TextInput中水平居中文本?
这是我的kv语言的一部分:
BoxLayout:
orientation: 'vertical'
Label:
markup: True
text: '[b] Type something... [/b]'
size_hint: 1, 0.6
size: self.parent.size[0], 200
font_size: self.size[0] * 0.1
text_size: self.size
halign: 'center'
valign: 'middle'
canvas.before:
Color:
rgb: 0, 0, 204
Rectangle:
pos: self.pos
size: self.size
TextInput:
focus: True
如何将TextInput的文本居中?
答案 0 :(得分:11)
Afaik,在Label
中没有以与TextInput
相同的方式对齐,但是,您可以使用padding
在任何地方推送位置。请注意,更改文字大小会影响居中,因此您需要重新计算尺寸的变化(例如,在使用多个设备,尺寸等时)。
或者甚至可能有一种解决方法,您可以使Label
不可见,使用TextInput
获取触摸事件以触发Label
(这将打开键盘)并更改{{1关于TextInput
文本属性更改的文本。您将失去以这种方式使用光标的可能性,并且您需要处理包装文本。
示例:强>
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
Builder.load_string('''
<Test>:
TextInput:
text: 't'
font_size: 60
# left, right
padding_x:
[self.center[0] - self._get_text_width(max(self._lines, key=len), self.tab_width, self._label_cached) / 2.0,
0] if self.text else [self.center[0], 0]
# top, bottom
padding_y: [self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 0]
''')
class Test(BoxLayout):
pass
class TestApp(App):
def build(self):
return Test()
TestApp().run()
self._get_text_width(...)
显然是TextInput
的一种方法。它正在使用小部件的核心,所以它可能不稳定(我发布的第一个例子是因为我的错误而错误)^^
现在,如果从padding_x
和left
填充right
的值,则您只需要左侧(差异仅在于使用加法和减法)在正确的地方),所以让我们这样做:
TextInput
center[0]
坐标当我们已经将X轴居中时,让我们转到Y. padding_y
的值为top
和bottom
:< / p>
height
TextInput
self.height / 2.0
0
,我们不关心它注意:max()
需要一些参数,如果没有text
,max()
会提高声音。我们只使用中心为padding_x
选择左边填充来关闭它:
<padding_x with max> if self.text else [self.center[0], 0]