Kivy TextInput水平和垂直对齐(文本居中)

6

如何在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文本居中?

水平居中文本的方法在这里描述:https://dev59.com/spnga4cB1Zd3GeqPSQEg - Nykakin
3个回答

18
据我所知,在Label中没有与其相同的对齐方式,但是您可以使用padding将位置推到任何您想要的地方。请注意,更改文本的大小将影响居中对齐,因此您需要在大小更改时重新计算(例如,在使用多个设备、尺寸等进行工作时)。
或者,甚至可以通过一些变通方法来实现,您可以使TextInput不可见,使用Label获取触摸事件来触发TextInput(这样会打开键盘),并在TextInput的文本属性更改时更改Label的文本。这种方式将失去使用光标的可能性,并且您需要处理换行文本。 示例:
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 的值从 leftright 填充,则只需要左侧(差异仅在于在正确的位置使用加法和减法),因此让我们这样做:

  1. 获取 TextInput 中最长的子字符串
  2. 通过新颖的方法获取其宽度(因为其不一致!)
  3. center[0] 坐标中减去

当我们已经将 X 轴居中时,让我们转向 Y 轴。 padding_y 的值为 topbottom

  1. 向下填充小部件高度的一半
  2. 获取单行高度的一半
  3. 将数字乘以在 TextInput 中的行数
  4. self.height / 2.0 中减去该数字
  5. 底部是 0,我们不关心

注意: max() 需要一些参数,如果没有 textmax() 将会抛出异常。我们将使用仅使用中心的替代左填充来关闭它:

<padding_x with max> if self.text else [self.center[0], 0]

感谢您的关注。我该如何使用填充来居中?我尝试过了,但像您所说,我遇到了不同屏幕尺寸和不同字体大小的问题。我该如何让它正常工作? - Carlos Porta
谢谢你,非常感谢你的帮助。我正在工作中,有时间时,我会测试它。再次感谢! - Carlos Porta
@Caaarlos 进行了编辑,只需要在 padding_x 中加入一个小的 if 条件语句即可解决 max() 函数引起的问题。 - Peter Badida
@Caaarlos 是的,我忘记在这里放更新后的代码,包括 self.center[0] 用于 x 填充。 - Peter Badida
如果不使用kv语言,而只是t = TextInput(),那么如何执行self.height - Superdooperhero
显示剩余3条评论

4

@pete halign: 'center'加上仅在y轴上的填充就能达到同样的效果

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
Builder.load_string('''
<Test>:
    TextInput:
        text: 't'
        halign: 'center'
        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()

应该是指定的答案。 - undefined

2

在您的TextInput中简单地使用halign: "center"即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接