2016-11-08 7 views
1

Как центрировать текст по горизонтали в TextInput в Киви?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?

+0

центрирования текст по горизонтали описан здесь: http://stackoverflow.com/q/38421741/1542900 – Nykakin

ответ

5

Afaik, нет такой штуки, как выравнивание таким же образом, как и в Label, однако вы можете использовать padding, чтобы нажимать позицию, где хотите. Имейте в виду, что изменение размера текста повлияет на центрирование, поэтому вам придется пересчитывать изменения размера (например, при работе с несколькими устройствами, размерами и т. Д.).

Или может быть даже обходной путь, где вы могли бы сделать TextInput невидимым, используйте Label для извлечения сенсорного события, чтобы вызвать TextInput (который откроет клавиатуру) и изменить Label «s текст на изменение TextInput» текстового свойства s. Вы потеряете возможность работать с курсором таким образом, и вам нужно будет обрабатывать текст.

Пример:

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 «s значения падд из left и right, вам нужно только левый сторона (разница только в использовании сложения и вычитания в нужном месте), так что давайте делать это:

  1. получить самую длинную подстроку в TextInput
  2. получить его ширину (потому что это не соответствует!) через модный метод
  3. вычесть из center[0] Координата

Когда мы уже центрировали ось X, переходим к Y.Значения padding_y «S являются top и bottom:

  1. падд вниз половины виджета 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

 Смежные вопросы

  • Нет связанных вопросов^_^