kivy八种布局:FloatLayout、BoxLayout、AnchorLayout、GridLayout、PageLayout、RelativeLayout、ScatterLayout、StackLayout。

FloatLayout:浮动布局,它允许将子部件通过位置参数(pos_hint)和尺寸参数(size_hint)放置在窗口的任意位置.我们用此布局可按窗口大小高度来放置小部件,并且当在不同分辨率的移动设备中,窗口的大小改变时,放置在窗口内的小部件也会相应的调整大小与位置,而不会产生因窗口的大小变化而使布局乱成一团。

from kivy.app import App   #导入kivy的app类,它是所有kivy应用的基类
from kivy.uix.button import Button #引入控件
from kivy.uix.floatlayout import FloatLayout #引入布局
from kivy.graphics import Rectangle,Color class FloatLayoutApp(App): #继承app类
def build(self): #实现app类的build()方法
def update_rect(layout,*args):
#设置背景尺寸,可忽略
layout.rect.pos=layout.pos
layout.rect.size=layout.size float_layout=FloatLayout() #设置背景颜色(可忽略)
with float_layout.canvas:
Color(1,1,1,1)
float_layout.rect=Rectangle(pos=float_layout.pos,size=float_layout.size)
float_layout.bind(pos=update_rect,size=update_rect) #在布局内的【300,200】处添加一个尺寸为0.3,0.2的按钮
button=Button(text='FloatLayout',size_hint=(.3,.2),pos=(300,200))
#这里的pos参数不会因窗口改变而改变位置,这个是固定位置,要随窗口变化而动态变化的要用pos_hint #将按钮添加到布局内
float_layout.add_widget(button)
#返回布局
return float_layout if __name__=='__main__': #程序入口
FloatLayoutApp().run() #启动应用程序

BoxLayout:盒子布局,是可以将子部件水平或垂直进行排列的布局,类似Android中的线性布局,如果不设置任何大小,子部件将会以10px的间距平分父窗口的大小。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Rectangle,Color class BoxLayoutWidget(BoxLayout):
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) self.add_widget(Button(text='hello'))
self.add_widget(Button(text='BoxLayout')) def update_rect(self,*args):
#设置背景尺寸,可忽略
self.rect.pos=self.pos
self.rect.size=self.size class BoxApp(App):
def build(self):
return BoxLayoutWidget() if __name__ =='__main__':
BoxApp().run()

AnchorLayout:锚点布局,此布局可以将子部件放置在左上、上中、右上、左中、正中,右中、左下,下中,右下共9个位置处。

from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.button import Button
from kivy.graphics import Rectangle,Color class AnchorLayoutWidget(AnchorLayout):
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) #嵌套第一个布局
anchor_first=AnchorLayout(anchor_x='left',anchor_y='top')
#添加按钮
anchor_first.add_widget(Button(text='hello',size_hint=[.3,.2],background_color=[0,1,1,1]))
anchor_first.add_widget(Button(text='hello1',size_hint=[.3,.2],background_color=[1,0,1,1])) #嵌套第二个布局
anchor_second=AnchorLayout(anchor_x='right',anchor_y='bottom')
#添加按钮
anchor_second.add_widget(Button(text='anchor',size_hint=[.3,.2])) #添加到父布局中
self.add_widget(anchor_first)
self.add_widget(anchor_second) def update_rect(self,*args):
#设置背景尺寸
self.rect.pos=self.pos
self.rect.size=self.size class AnchorApp(App):
def build(self):
return AnchorLayoutWidget() if __name__ =='__main__':
AnchorApp().run()

GridLayout:网格布局,使用此布局可以将子部件排列成多行多列的矩阵布局。当设定了列数cols或者行数rows后,子部件大小尺寸与子部件个数多少发生变化时,此布局会根据该值进行扩展,但不会超过界限值。

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(GridLayoutWidget, self).__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) self.padding = 20
self.spacing = 20 self.cols=3
for i in range(6):
btn=Button(text=str(i),background_color=[0,1,1,1],size_hint=[.3,.2]) self.add_widget(btn) def update_rect(self,*args):
self.rect.pos=self.pos
self.rect.size=self.size class GridApp(App):
def build(self):
return GridLayoutWidget() if __name__ == '__main__':
GridApp().run()

PageLayout:与其它布局不司,这是个多页动态布局。此布局可以在窗口内创建多个页面的布局,这些页面可以翻转,每个页面子部件均可作为单独的窗口页面进行开发。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.pagelayout import PageLayout
class PageLayoutWidget(PageLayout):
def __init__(self,**kwargs):
super(PageLayoutWidget, self).__init__(**kwargs)
bt0=Button(text='bt0',background_color=[.3,.9,.3,1])
bt1=Button(text='bt1',background_color=[.9,.3,.3,1])
self.add_widget(bt0)
self.add_widget(bt1)
class PageApp(App):
def build(self):
return PageLayoutWidget()
if __name__ =='__main__':
PageApp().run()

RelativeLayout:相对布局,与FloatLayout基本一致,但它定位属性x、center_x、right、y、center_y、top是相对于上级父布局大小而言的,不是针对窗口的大小。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Rectangle,Color class MyButton(Button): #自定义控件类
#自定义一个按钮,提出公共属性
def __init__(self,**kwargs):
super(MyButton, self).__init__(**kwargs) self.font_size=20
self.size_hint=[0.2,.2] class RelativeLayoutWidget(RelativeLayout):
pass class BoxLayoutWidget(BoxLayout):
def __init__(self,**kwargs):
super(BoxLayoutWidget, self).__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) #创建一个RelativeLayout布局
relative_layout=RelativeLayoutWidget() #使用自定义按钮
bt0=MyButton(text='按钮0',pos_hint={'right':1,'top':1},background_color=(.1,.5,.6,1))
bt1=MyButton(text='按钮1',pos_hint={'x':0,'top':1},background_color=(1,0,0,1))
bt_relative=MyButton(text='按钮relative',pos_hint={'center_x':0.5,'center_y':0.5},background_color=(.4,.5,.6,1))
bt2=MyButton(text='按钮2',pos_hint={'x':0,'y':0},background_color=(0,0,1,1))
bt3=MyButton(text='按钮3',pos_hint={'right':1,'y':0},background_color=(.8,.9,.2,1)) #向RelativeLayout布局内循环添加元素
for i in [bt0,bt1,bt_relative,bt2,bt3]:
relative_layout.add_widget(i) #放一个空的BoxLayout占位
self.add_widget(BoxLayout())
#将RelativeLayout添加到布局中
self.add_widget(relative_layout) def update_rect(self,*args):
#设置背景尺寸,可忽略
self.rect.pos=self.pos
self.rect.size=self.size class RelativeApp(App):
def build(self):
return BoxLayoutWidget() if __name__ =='__main__':
RelativeApp().run()

ScatterLayout:分散布局,与RelativeLayout类似。当布局更改位置时,布局内的小部件也会跟着父布局一起变动,并且子部件的位置及大小会相对于父布局自动调整,并且此布局还可以进行平移、旋转、缩放布局。

from kivy.app import App
from kivy.uix.image import AsyncImage
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scatterlayout import ScatterLayout
from kivy.graphics import Rectangle,Color class ScatterLayoutWidget(ScatterLayout):
pass class BoxLayoutWidget(BoxLayout):
def __init__(self,**kwargs):
super(BoxLayoutWidget, self).__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) #创建一个ScatterLayout布局
scatter_layout=ScatterLayoutWidget()
#异步加载图片
image=AsyncImage(source='https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png') #http://sck.rjkflm.com/images/logo1.png
#将图片添加到ScatterLayout布局中
scatter_layout.add_widget(image)
#将ScatterLayout布局嵌套在BoxLayout布局中
self.add_widget(scatter_layout) def update_rect(self,*args):
#设置背景尺寸,可忽略
self.rect.pos=self.pos
self.rect.size=self.size class ScatterApp(App):
def build(self):
return BoxLayoutWidget() if __name__ =='__main__':
ScatterApp().run()

StackLayout:堆栈布局,在此布局中,可以进行垂直或水平的排列子部件,并且各个小部件可以不必相同,排列的方向由orientation属性进行指定。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.stacklayout import StackLayout
from kivy.graphics import Rectangle,Color class StackLayoutWidget(StackLayout):
def __init__(self,**kwargs):
super(StackLayoutWidget, self).__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) #遍历添加按钮
for i in range(25):
btn=Button(text=str(i),width=40+i*5,size_hint=(None,0.15))
self.add_widget(btn) def update_rect(self,*args):
self.rect.pos=self.pos
self.rect.size=self.size class StackApp(App):
def build(self):
return StackLayoutWidget() if __name__ =="__main__":
StackApp().run()

以上每种布局都有代码示例,多对代码进行调试修改,将会更有心得。

kivy八种布局方式学习的更多相关文章

  1. Android开发之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...

  2. Android 常用UI控件之TabHost(1)TabHost的两种布局方式

    TabHost是Android中的tab组件. TabHost布局文件的基本结构 TabHost下有个layout,这个layout中有TabWidget与FrameLayout.TabWidget是 ...

  3. Extjs--12种布局方式

    按照Extjs的4.1的文档来看,extjs的布局方式大致有12种,下面一一介绍,有些代码就是文档中的. 1.Border 边界布局 border布局,最多可以将页面分割为"东南西北中&qu ...

  4. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

  5. Android 布局方式学习

    一.LinearLayout线性布局: 线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种, 通过android:orientation属性可以设置线性布局的方向 1 ...

  6. Android-基本控件和详解四种布局方式

    转自:https://www.cnblogs.com/ludashi/p/4883915.html 一.常用基本控件 1.TextView 看到Android中的TextView, 我不禁的想到了iO ...

  7. 【Android学习】四种布局方式

    一.LinearLayout 线性布局,即一行展开或者一列展开,也可以嵌套,需要注意的属性如下: android:orentation  //对齐方式 二.FrameLayout 帧布局,即一层层叠起 ...

  8. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  9. Android 开发之旅:view的几种布局方式及实践

    本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weigh ...

随机推荐

  1. 精尽Spring Boot源码分析 - 文章导读

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  2. IP地址与子网的划分

    一.IP地址 1.IP地址的定义 (1).IP地址有32位二进制数组成,一般用点分十进制来表示 (2).IP地址由两部分组成 网络部分(NETWORK) 主机部分(HOST) 2.IP地址的分类 IP ...

  3. excel VBA根据一列的逗号隔开值分行

    Sub test1()    Dim h    Dim j As Integer    j = 0    Dim n1 As Integer '分行单元格在第几列    Dim m1 As Integ ...

  4. 5、linux分区

    5.1.分区的选择: 5.2.文件系统: ext2.ext3.ext4 5.3.分区的类型(MBR): 硬盘的使用前需要分区-格式化(创建文件系统)-存放数据: 一块硬盘: 主分区(必须有,最多4个) ...

  5. .Net Core with 微服务 - Consul 配置中心

    上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...

  6. POJ 1654 Area 多边形面积 G++会WA

    #include<stdio.h> #include<algorithm> #include <cstring> using namespace std; type ...

  7. 暑假自学java第二天

    今天学习了一些java规则 一个java源文件的公开类只能有一个,而且必学和源文件名相同. 了解到java的标识符规范,这对以后的团队协作有很大作用. 标识符规则和c++还是很相似的 java中的字面 ...

  8. Linux系统inodes资源耗尽时的查找及删除

    for i in {1..10}; do echo $i; ls > $i.log; done for i in $(seq 1 10); do echo $i; done 以上为for循环的使 ...

  9. java.lang.Excetion,java.lang.RuntimeException,java.lang.Error有什么区别?

    Error类对象由Java虚拟机生成并抛出,Exception类对象由应用程序处理或抛出 Error表示恢复不是不可能但很困难的情况下的一种严重问题.比如说内存溢出.不可能指望程序能处理这样的情况. ...

  10. Oracle如何以逗号分隔的字符串拆分为多行数据

    近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参考.指教. ...