在Kivy的BoxLayout中居中TextInput

时间:2014-04-02 19:56:46

标签: python user-interface layout kivy boxlayout

以下是我的kivy应用的截图。我试图让左下方的TextInput在其所在的BoxLayout中居中,我不希望它与布局的大小相同,我希望它要小得多。有问题的BoxLayout位于屏幕的下半部分。我尝试过设置TextInput s属性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 个答案:

答案 0 :(得分:2)

您提供了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中心的机制。