Центрирование 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.

Другие вопросы по тегам