在Kivy中将TextInput居中于BoxLayout中

4
这是我的kivy应用的截图。我想让左下角的TextInput在它所在的BoxLayout中居中,而且我不希望它与布局大小相同,我想要它小得多。这个BoxLayout位于屏幕的下半部分。我尝试设置TextInput的属性center:self.parent.center,但这并没有起作用。您可以看到,我已经使用那条线,self.parent.center,将BoxLayout中心坐标打印到了TextInput中,并得到了正确的结果。然而,将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()

****kv文件:****

#: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个回答

4
您给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可以为您处理居中对齐。您也可以只使用一个Widget并使用以前的机制来设置TextInput的中心位置。

我删除了size_hint这一行,现在Text_Input会占据整个BoxLayout的宽度和高度,无论我给它什么大小。我尝试使用size_hint: .25, .1,但只有.1被遵守,而TextInput仍然占据布局的全部宽度。我该如何调整它的大小呢? - Totem
我稍微修改了我的问题。 - Totem
哦,我明白了,我误解了你的意思...抱歉!我已经编辑了我的帖子,并附上了一个居中的例子。 - inclement
谢谢,使用AnchorLayout解决了我的居中问题。 :) - Totem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接