【问题标题】:Kivy Anchor and gridlayout centeringKivy Anchor 和 gridlayout 居中
【发布时间】:2014-08-30 05:55:33
【问题描述】:

我正在使用锚布局来保存小部件,我的小部件是一个网格布局,问题是,我想要一个紧凑的登录显示 UI,但是,我得到了 3 个控件,最后还有注销按钮,所有这些都不在一起(不应该有太多的间距)并且应该在锚布局中居中。

我知道它看起来不太好:

代码如下:

.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 都是新手。您的支持和建议对我来说很有价值,需要改进,

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

    在您的GridLayout 上,您指定rows = 3 和cols = 1,这意味着布局有3 个孩子的空间。当它开始布置关闭按钮时,所有行和列都已用完,因此关闭按钮转到默认位置(0, 0)。我只会指定cols 并留下rows - 它将使用尽可能多的行来布置孩子。

    其次,这不是问题,但有一种更快的方法可以将所有孩子的身高设置为 32dp。您可以在GridLayout 上设置row_default_heightrow_force_default,而不是为所有子代指定size_hintheight

    最后,您的GridLayout 仍然占用了所有空间,这就是它不在AnchorLayout 中居中的原因。这很容易通过GridLayout 解决,因为minimum_height 属性设置heightminimum_heightsize_hint_yNone,它将居中。

    把它们放在一起:

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

    【讨论】:

    • 是的,那行得通,但是,我怎样才能使按钮居中,它们占用了整个宽度,我尝试将其设置为 'size_int_x: None' 和 'width: '50dp' 但仍然占用整个宽度。仅适用于一个控件,而不会在网格级别强制。
    • GridLayout 在设置cols 时忽略其子级的size_hint_xwidth。设置 size_hint_xwidth 将起作用,只需将每个要居中的按钮包裹在另一个 AnchorLayout 中。
    • 谢谢。这有助于我更详细地理解 kivy 布局。 Kivy 必须变得更像 WPF,它对 UI 非常好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2016-09-01
    相关资源
    最近更新 更多