Центрирование TextInput в BoxLayout в Киви
Вот скриншот моего приложения KIVY. Я пытаюсь получить TextInput
в левом нижнем углу, чтобы быть в центре BoxLayout
в котором он находится, и я не хочу, чтобы он был такого же размера, как макет, я хочу, чтобы он был намного меньше. это BoxLayout
этот вопрос находится в нижней половине экрана. Я пытался установить TextInput
собственностьcenter:self.parent.center
но это не работает Как вы можете видеть, я напечатал координаты центра из BoxLayout
в TextInput
используя эту строку, self.parent.center, с правильным результатом. Тем не менее, установка TextInput
Центр или положение этих координат не центрирует его, оно не двигается... что я делаю не так?
py файл:
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
class TimeTabler(Widget):
pass
class TimerApp(App):
def build(self):
return TimeTabler()
if __name__ == "__main__":
TimerApp().run()
**** файл кв:****
#:kivy 1.0
BoxLayout:
orientation: 'vertical'
size: root.size
BoxLayout:
orientation: 'vertical'
Label:
text: 'TimeTabler'
BoxLayout:
TextInput:
text: '%s' % (self.parent.center) # why does this work here
size_hint: None, None
width: sp(200)
height: sp(30)
center: self.parent.center # but not here
1 ответ
Вы дали TextInput size_hint: None, None
поэтому BoxLayout не пытается вручную придать ему правильный размер, и он принимает размер по умолчанию 100, 100
, Просто удалите size_hint
линия, чтобы исправить это.
Кроме того, некоторые виджеты имеют такие строки, как size: self.size
, Это бессмысленно, self
ссылается на сам виджет, и ясно, что строка ничего не делает, так как она просто пытается установить размер, который уже есть.
Также было бы проще, если бы вы сделали так, чтобы TimeTabler наследовал от BoxLayout вместо Widget. Таким образом, вам не нужно будет вручную устанавливать размер дочернего BoxLayout.
Изменить: похоже, я неправильно понял, что вы хотели, вот пример, который использует AnchorLayout для центрирования TextInput:
<TimeTabler>
BoxLayout:
orientation: 'vertical'
size: root.size
on_touch_down: print self.pos, self.size
canvas:
Color:
rgba: 0, 1, 1, .3
Rectangle:
size: self.size
pos: self.pos
BoxLayout:
orientation: 'vertical'
size: self.size
Label:
text: 'TimeTabler'
BoxLayout:
id: bl
on_touch_down: print 'center', self.center
canvas:
Color:
rgb: 1,1,1
Line:
rectangle: self.x, self.y, self.width, self.height
AnchorLayout:
TextInput:
size_hint: None, None
text: '%s, %s' % (self.get_center_x(), self.get_center_y())
Я думаю, что ваша проблема заключалась в том, что BoxLayout автоматически устанавливает позицию TextInput, даже когда он устанавливает свой собственный размер. Простой способ обойти это - просто перейти к TextInput в другом виджете, в этом случае AnchorLayout, который позаботится о центрировании для вас. Вы также можете просто использовать виджет и свой предыдущий механизм настройки центра TextInput.