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
дополнены из left
и right
, вам понадобится только левая сторона (разница только в использовании сложения и вычитания в нужном месте), поэтому давайте сделаем это:
- получить самую длинную подстроку в
TextInput
- получить его ширину (потому что она непоследовательна!) с помощью причудливого метода
- вычесть из
center[0]
координаты
Когда мы уже центрировали ось X, давайте перейдем к Y. Значения padding_y
равны top
и bottom
:
- дополнить половину
height
виджета
- получить половину высоты одной строки
- умножьте число на количество строк, которые находятся в
TextInput
- вычесть число из
self.height / 2.0
- внизу
0
, нас это не волнует
Примечание: max()
ожидает некоторых аргументов, и если text
нет, max()
повысит голос. Мы закроем его альтернативным левым отступом для padding_x
, используя только центр:
<padding_x with max> if self.text else [self.center[0], 0]
person
Peter Badida
schedule
08.11.2016