2016-11-08 263 views
1

如何在Kivy中的TextInput中水平居中文本?Kivy TextInput水平和垂直对齐(居中文本)

我有如下画面: wrong screen

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

这是我千伏语言的一部分:

 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

文字居中水平此处描述:http://stackoverflow.com/q/38421741/1542900 – Nykakin

回答

5

Afaik,没有像在Label那样对齐的方式,但是,您可以使用padding将位置推到任意位置。请记住,改变文字的大小会影响居中,因此您需要根据大小的变化重新计算(例如,在处理多种设备,尺寸等时)。

或者有可能甚至一种变通方法,在那里你可以做TextInput无形的,使用Label获取触摸事件来触发TextInput(这将打开键盘)和更改text属性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值PADD,你只需要左侧(所不同的只是使用在正确的地方加法和减法),让我们做到这一点:

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

当我们已经居中X轴,让我们去Y.的padding_ytopbottom

  1. PADD下来的一半widget的height
  2. 得到单行
  3. 的高度的一半是在的行数乘以数TextInput
  4. 的。减去数量从self.height/2.0
  5. 底部0,我们不关心它

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

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

感谢您的关注。我如何使用填充集中?我尝试过,但是,像你一样伤心,我遇到了不同尺寸和不同字体大小的问题。我怎样才能使它工作? – Caaarlos

+0

@Caaarlos补充说明和解释^^ – KeyWeeUsr

+0

谢谢,我真的很感谢你的帮助。我现在正在工作,当我有时间时,我会测试它。再次感谢你! – Caaarlos