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

2022-02-23 00:00:00 python python-3.x kivy kivy-language

问题描述

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


解决方案

AFAIK中没有与Label相同的对齐方式,但是,您可以使用padding将位置推到您想要的任何位置。请记住,更改文本大小会影响居中,因此您需要重新计算更改的大小(例如,在使用多个设备、大小等时)。

或者甚至可能有一种解决方法,您可以使TextInput不可见,使用Label获取触摸事件以触发TextInput(这将打开键盘),并在更改TextInput的Text属性时更改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的值PADD来自leftright,您将只需要左侧(区别仅在于在正确位置使用加法和减法),因此让我们这样做:

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

当我们已经将X轴居中后,让我们转到Y轴。padding_y的值是topbottom

  1. PADD向下移动小部件的一半height
  2. 获取单行半高
  3. 将数字乘以TextInput
  4. 中的行数
  5. self.height / 2.0中减去数字
  6. 底部是0,我们不在乎

注意:max()需要一些参数,如果没有textmax()将提高音量。我们将使用padding_x的替代左填充将其关闭,仅使用中心:

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

相关文章