gpt4 book ai didi

python - Kivy anchor 和网格布局居中

转载 作者:行者123 更新时间:2023-12-01 05:08:27 25 4
gpt4 key购买 nike

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

我得到的结果看起来不太好: 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())

登录代码.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 时出错的地方,我不想使用 float 布局,就像使用点来放置小部件一样。我对 Python 和 Kivy 都是新手。您的支持和建议对我的改进很有值(value),

最佳答案

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

其次,这不是问题,但是有一种更快的方法可以将所有 child 的高度设置为 32dp。而不是指定 size_hintheight对于所有子项,您可以设置 row_default_heightrow_force_default关于GridLayout .

最后,你的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

centered GridLayout example

关于python - Kivy anchor 和网格布局居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24649750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com