《Python+Kivy(App开发)从入门到实践》自学笔记:GridLayout布局

本文详细介绍了Kivy中的GridLayout布局,包括其使用步骤、如何在Python和KV语言中创建GridLayout、设置默认大小及调整列宽行高的方法。通过实例展示了如何通过cols和rows属性、col_force_default和row_force_default属性以及cols_minimum和rows_minimum属性来控制布局的样式和子部件尺寸。
摘要由CSDN通过智能技术生成

章节目录与知识点总揽

2.5 GridLayout布局

GridLayout——网格布局

        在Kivy中,为了将子部件排列成多行多列的矩阵,可以使用GridLayout布局方式。他会根据布局的配置,按照子部件的索引顺序为每一个小部件分配位置。

        在使用GridLayout布局时,必须设置具体列数(cols)或者行数(rows)中的一个约束,否则程序不能够执行。只要指定了具体的行数或列数,当子部件发生变化时,GridLayout布局就会根据该值进行扩展,但不会超过界限值。

2.5.1 使用步骤

        1.新建一个main.py文件。

        2.导入App类以及相关的包,例如:GridLayout、Button

        3.创建一个类让它继承App类。

        4.在该类内实现build()方法

        5.编写具体的布局或布局类,让其继承GridLayout类。

        6.在build()方法结尾返回具体的布局或布局类。

        7.通过run()方法运行实例。


2.5.2 在py内使用GridLayout布局

        新建main.py文件,内容如下:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.graphics import Rectangle,Color


class GridLayoutWidget(GridLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)

        #设置背景色,可忽略
        with self.canvas:
            Color(1,1,1,1)
            self.rect = Rectangle(pos=self.pos,size=self.size)
            self.bind(pos=self.update_rect,size=self.update_rect)
        #指定数列(行数使用rows表示)
        self.cols=3
        #添加按钮
        for i in range(5):
            btn = Button(text=str(i))
            self.add_widget(btn)

    def update_rect(self,*args):
        #设置背景尺寸,可忽略
        self.rect.pos = self.pos
        self.rect.size = self.size
class GridApp(App):
    #实现App类的build()方法(继承自App类)
    def build(self):
        return GridLayoutWidget()

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

        运行main.py,由于cols属性限制为3列,所以第4个按钮自动换到下一行。执行结果如下图:

36e0ccb1be8644c9b1f6412aa6aa83e0.png

 2.5.3 在kv内使用GridLayout布局

        根据GridApp类名,新建一个grid.kv文件,更改main.py文件,内容如下:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout

class GridLayoutWidget(GridLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)

class GridApp(App):
    def build(self):
        return GridLayoutWidget()

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

        gird.kv文件中,用padding设置间距、spacing设置间距,cols指定列数、size_hint指定按钮大小、width指定按钮宽度,具体内容如下:

<GridLayoutWidget>:
	padding:20
	spacing:20
	cols:3
	
	canvas:
		Color:
			rgba:[1,1,1,1]
		Rectangle:
			size:self.size
			pos:self.pos
	Button:
		text:'First'
	Button:
		text:'Second'
	Button:
		text:'Third'
	Button:
		text:'Fourth'

        执行main.py文件,结果如下图: 

e609d820e2a543dba83f04a0983f3ead.png

2.5.4 默认大小

2.5.4.1使用部件本身属性为其指定大小

        可以使用部件本身的属性为其指定大小。例如:2.5.3小节的代码中为第一个按钮设置一个固定的宽度。在设置固定宽度之前,需要将size_hint_x属性设置为None。更新grid.kv文件内容如下:

<GridLayoutWidget>:
	padding:20
	spacing:20
	cols:3
	Button:
		text:'First'
		size_hint_x:None
		width:'100px'
	Button:
		text:'Second'
	Button:
		text:'Third'
	Button:
		text:'Fourth'

        运行mian.py,第一个按钮被设置了宽度。结果如下图:

79cb7c11c09544f5b7bd4e81ff711373.png

 2.5.4.2GirdLayout为部件指定大小

        需要使用col_force_default属性,其默认值为False,表示不使用列默认宽度。将其设置为True,并且在子级为设置width和size_hint_x属性的情况下,使用默认的列宽。列宽默认值为0,所以还要为其指定一个具体的值。代码如下:

<GridLayoutWidget>:
	padding:20
	spacing:20
	cols:3
	col_force_default:True
	col_default_width:120
	Button:
		text:'First'
		size_hint_x:None
		width:'100px'
	Button:
		text:'Second'
	Button:
		text:'Third'
	Button:
		text:'Fourth'

        运行main.py,除了第一个,其它按钮都设置成了默认宽度。结果如下图:

d726fcb337994014b2fbbd49f52a221d.png

         使用同样方法,可以设置row_force_default和row_default_height属性设置默认行高,代码如下:

<GridLayoutWidget>:
	padding:20
	spacing:20
	cols:3
	col_force_default:True
	col_default_width:120
	row_force_default:True
	row_default_height:40

	Button:
		text:'First'
		size_hint_x:None
		width:'100px'
	Button:
		text:'Second'
	Button:
		text:'Third'
	Button:
		text:'Fourth'

        运行结果如下图:

605f880e0fb64aac8b4e127547e11dec.png

 2.5.5 设置列宽行高

GridLayout可以针对每一列、每一行设置各自的宽度和高度。

        通过cols_minimum属性设置列宽,此属性接受一个字典,键为列号,值为具体像素值。例如:将第一列设置为130px,第二列设置成140px,代码如下:

<GridLayoutWidget>:
	padding:20
	spacing:20
	cols:3
	col_force_default:True
	col_default_width:120
	row_force_default:True
	row_default_height:40

	cols_minimum:{0:130,1:140}

	Button:
		text:'First'
		size_hint_x:None
		width:'100px'
	Button:
		text:'Second'
	Button:
		text:'Third'
	Button:
		text:'Fourth'

        运行main.py后,第一列和第二列宽度产生了区别,但第一列第一个案件未受影响。

0299eb5a55ab4cd3a365eee335fcf2ab.png

         总结:就这几个改变宽度的方法,其作用级别:col_default_width<cols_minimum<width

        同理,也可以设置rows_minimum属性,代码如下:

<GridLayoutWidget>:
	padding:20
	spacing:20
	cols:3
	col_force_default:True
	col_default_width:120
	row_force_default:True
	row_default_height:40

	cols_minimum:{0:130,1:140}
	rows_minimum:{0:60}

	Button:
		text:'First'
		size_hint_x:None
		width:'100px'
	Button:
		text:'Second'
	Button:
		text:'Third'
	Button:
		text:'Fourth'

        运行结果如下图:

1ba8c9793c8846d1b50bdbbaed0320b0.png

上一篇:AnchorLayout布局

下一篇:PageLayout布局

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静候光阴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值