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

时间:2016-11-08 02:23:26

标签: python python-3.x kivy kivy-language

如何在Kivy的TextInput中水平居中文本?

我有以下屏幕: wrong screen

但我想像这样集中我的文字: right screen

这是我的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的文本居中?

1 个答案:

答案 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_xleft填充right的值,则您只需要左侧(差异仅在于使用加法和减法)在正确的地方),所以让我们这样做:

  1. 获取TextInput
  2. 中最长的子字符串
  3. 通过花哨的方法获得它的宽度(因为它不一致!)
  4. 来自center[0]坐标
  5. 的减法

    当我们已经将X轴居中时,让我们转到Y. padding_y的值为topbottom:< / p>

    1. 填充了小部件height
    2. 的一半
    3. 获得一行高度的一半
    4. 将数字乘以TextInput
    5. 中的行数
    6. self.height / 2.0
    7. 中减去数字
    8. 底部是0,我们不关心它
    9. 注意:max()需要一些参数,如果没有textmax()会提高声音。我们只使用中心为padding_x选择左边填充来关闭它:

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