2016-11-08 141 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