我使用锚点布局来保存小部件,我的小部件是一个gridlayout,问题是,我想要一个紧凑的登录显示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的新手。您的支持和建议对我来说很有价值,
答案 0 :(得分:2)
在GridLayout
上指定rows
= 3和cols
= 1,这意味着布局可容纳3个孩子。当它布局“关闭”按钮时,所有行和列都已用完,因此“关闭”按钮将转到默认位置(0, 0)
。我只需指定cols
并退出rows
- 它会根据需要使用尽可能多的行来布置子项。
其次,这不是一个问题,但有一个更快的方法可以将所有孩子的身高设置为32dp。您可以在size_hint
上设置height
和row_default_height
,而不是在所有子项上指定row_force_default
和GridLayout
。
最后,您的GridLayout
仍然占据了所有空间,这就是为什么它不在AnchorLayout
的中心。由于GridLayout
属性设置minimum_height
,height
设置为minimum_height
,size_hint_y
设置为None
,因此可以轻松解决此问题。
全部放在一起:
<LoginControl>:
cols: 1
row_force_default: True
row_default_height: '32dp'
size_hint_y: None
height: self.minimum_height