kivy八种布局方式学习
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八种布局方式学习的更多相关文章
- Android开发之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- Android 常用UI控件之TabHost(1)TabHost的两种布局方式
TabHost是Android中的tab组件. TabHost布局文件的基本结构 TabHost下有个layout,这个layout中有TabWidget与FrameLayout.TabWidget是 ...
- Extjs--12种布局方式
按照Extjs的4.1的文档来看,extjs的布局方式大致有12种,下面一一介绍,有些代码就是文档中的. 1.Border 边界布局 border布局,最多可以将页面分割为"东南西北中&qu ...
- 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...
- Android 布局方式学习
一.LinearLayout线性布局: 线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种, 通过android:orientation属性可以设置线性布局的方向 1 ...
- Android-基本控件和详解四种布局方式
转自:https://www.cnblogs.com/ludashi/p/4883915.html 一.常用基本控件 1.TextView 看到Android中的TextView, 我不禁的想到了iO ...
- 【Android学习】四种布局方式
一.LinearLayout 线性布局,即一行展开或者一列展开,也可以嵌套,需要注意的属性如下: android:orentation //对齐方式 二.FrameLayout 帧布局,即一层层叠起 ...
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
- Android 开发之旅:view的几种布局方式及实践
本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weigh ...
随机推荐
- Java实现单例模式的几种方式
单例模式(Singleton),保证在程序运行期间,内存中只有一个实例对象. 饿汉式,最常用的方式.JVM加载类到内存中时,创建实例,线程安全. public class Boss { private ...
- Docker(39)- docker 实战二之安装 Tomcat
背景 参考了狂神老师的 Docker 教程,非常棒! https://www.bilibili.com/video/BV1og4y1q7M4?p=15 直接运行容器 本地找不到镜像会自动下载 --rm ...
- MySQL—Dos命令操作数据库
MySQL 是一个关系型数据库,存在表的概念 结构,数据库可以存放多张表,每个表可以存放多个字段,每个字段可以存放多个记录 Dos命令操作数据库 PhpStudy使用终端打开数据库 第一次打开默认的密 ...
- Pygame 入门基本指南
最近正在利用 Python 制作一个小游戏,但对于 Pygame 不熟悉,故在学习的过程记录相关知识点 Pygame 中文文档下载:Here Pygame第1-1课:入门 什么是Pygame? Pyg ...
- 选择适合小企业的CRM软件
随着信息时代的到来和客户掌握的信息变多,大多数企业开始从"以产品为中心"转变为"以客户为中心".为了适应市场的变化,许多企业开始使用客户关系管理软件来提高工作效 ...
- 【重学Java】Set集合
Set集合 Set集合概述和特点[应用] 无序不可重复 没有索引,不能使用普通for循环遍历.可以使用迭代器或者增强foreach语句遍历 TreeSet集合 TreeSet集合概述和特点[应用] 无 ...
- LVM磁盘管理实战案例
前言:这是关于centos/linux上的LVM磁盘上的扩容,缩减,磁盘类型等收集做的案例 至于ubuntu系统的磁盘扩容参考:https://www.jianshu.com/p/5dcfcec687 ...
- 网站图片无缝兼容 WebP/AVIF
前言 WebP 格式发布已有十余年,但不少站点至今仍未使用,只为兼顾极少数低版本浏览器.至于去年发布的 AVIF 格式,使用的站点就更少了. 然而图片往往是流量大户,与其费尽心机优化脚本体积,可能还不 ...
- 你好,我是B树
一.什么是B树? B树是一棵是具备以下特点的有根树. 1.节点属性 a)x.n:为节点中存储的关键字个数. b)x.key:为节点中存储的关键字.x.key1.x.key2 ... x.keyx.n ...
- MySQL主从复制的简单搭建
@ 目录 1.MySQL一主一从的简单搭建 1.1.主从复制简介 1.2.MySQL主从复制简介 1.3.主从复制的架构 1.4.前期准备 1.5.主要配置实现 1.5.1.测试环境 1.5.2.配置 ...