在Kivy的BoxLayout中居中文本输入

2024-04-19 21:48:18 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的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

Tags: 文件fromimportselfappsizetextinputwidget
1条回答
网友
1楼 · 发布于 2024-04-19 21:48:18

您给了TextInputsize_hint: None, None,因此BoxLayout不会尝试手动给它正确的大小,它假定默认的大小为100, 100。只需删除size_hint行即可修复它。

另外,一些小部件有size: self.size这样的行。这是毫无意义的,self指的是小部件本身,很明显这一行什么也不做,因为它只是试图将大小设置为它已经是什么。

如果你让你的时间表继承自BoxLayout而不是Widget,事情会更简单。这样就不需要手动设置它的子BoxLayout的大小。

编辑:我好像误解了你的意思,下面是一个使用主持人布局将文本输入居中的示例:

<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的位置。解决这个问题的一个简单方法是在另一个小部件中紧靠文本输入,在本例中是一个负责居中的AnchorLayout。您还可以使用小部件和以前设置TextInput中心的机制。

相关问题 更多 >