Kivy Anchor和gridlayout居中

时间:2014-07-09 09:17:18

标签: python python-3.x kivy

我使用锚点布局来保存小部件,我的小部件是一个gridlayout,问题是,我想要一个紧凑的登录显示UI,但是,我得到3个控制器附近,并且注销按钮结束,所有都不在一起(不应该有太多间距)并且应该在锚点布局中居中。

我得到它看起来不太好看: enter image description here

代码如下:

主要的.py:

from kivy.app import App
from formcontrol import FormControl

class MyApp(App):

    def build(self):
        self.title="sample App"
        self.formcontrol = FormControl()
        return self.formcontrol

if __name__ == '__main__':
    MyApp().run()

FormControl.py:

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from login.logincodes import LoginControl
from login.logincodes import AfterLogin

class FormControl(AnchorLayout):
    '''
    classdocs
    '''

    def __init__(self, **kwargs):
        '''
        Constructor
        '''
        super(FormControl,self).__init__(**kwargs)
        c= LoginControl()
        c.setparent(self)
        self.add_widget(c)

    def changewidget(self,to):
        if to == 'AfterLogin':
            self.clear_widgets()
            self.add_widget(AfterLogin())

logincodes.py:

from kivy.uix.gridlayout import GridLayout


class LoginControl(GridLayout):
    _parentwidget=None

    def __init__(self, **kwargs):
        super(LoginControl,self).__init__(**kwargs)
        self.userid.text='Welcome'

    def setparent(self,parent):
        self._parentwidget=parent

    def changewidget(self,to):
        self._parentwidget.changewidget(to)

    def login_pressed(self,button):
        print(button.text)
        print(self.userid.text)
        print(self.userpw.text)
        self.changewidget('AfterLogin')

    def close_pressed(self,button):
        print(button.text)
        exit()


class AfterLogin(GridLayout):

    def __init__(self,**kwargs):
        super(AfterLogin,self).__init__(**kwargs)

my.ky文件:

<LoginControl>:
    rows: 3
    cols: 1

    userid: userid
    userpw: userpw

    BoxLayout:
        size_hint_y: None
        height: '32dp'
        Label:
            text: 'User ID'

        TextInput:
            id: userid
            text: 'some password'

    BoxLayout:
        size_hint_y: None
        height: '32dp'
        Label:
            text: 'Password'

        TextInput:
            id: userpw
            password: True
            text: 'some password'

    Button:
        text: 'Login'
        on_press: root.login_pressed(self)
        size_hint_y: None
        height: '32dp'

    Button:
        text: 'Close'
        on_press: root.close_pressed(self)
        size_hint_y: None
        height: '32dp'



<AfterLogin>:
    rows: 1
    Label:
        text: 'Logged In'

请让我了解在配置UI时出错的地方,我不想使用浮动布局,就像使用点来放置小部件一样。我是Python和Kivy的新手。您的支持和建议对我来说很有价值,

1 个答案:

答案 0 :(得分:2)

GridLayout上指定rows = 3和cols = 1,这意味着布局可容纳3个孩子。当它布局“关闭”按钮时,所有行和列都已用完,因此“关闭”按钮将转到默认位置(0, 0)。我只需指定cols并退出rows - 它会根据需要使用尽可能多的行来布置子项。

其次,这不是一个问题,但有一个更快的方法可以将所有孩子的身高设置为32dp。您可以在size_hint上设置heightrow_default_height,而不是在所有子项上指定row_force_defaultGridLayout

最后,您的GridLayout仍然占据了所有空间,这就是为什么它不在AnchorLayout的中心。由于GridLayout属性设置minimum_heightheight设置为minimum_heightsize_hint_y设置为None,因此可以轻松解决此问题。

全部放在一起:

<LoginControl>:
    cols: 1
    row_force_default: True
    row_default_height: '32dp'
    size_hint_y: None
    height: self.minimum_height

centered GridLayout example