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

新手上路,请多包涵

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

原文由 Carlos Porta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 959
2 个回答

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

或者甚至可以有一个解决方法,您可以使 TextInput 不可见,使用 Label 获取触摸事件以触发 TextInput 并更改(这将打开键盘) Label 的文本更改 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 的值从 leftright ,你只需要在左侧使用和减法正确的地方),所以让我们这样做:

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

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

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

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

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

原文由 Peter Badida 发布,翻译遵循 CC BY-SA 3.0 许可协议

只需在您的 TextInput 中使用 halign: "center"

原文由 Mahdi Yaghoubi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题