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:ps钢笔合理布局,此合理布局能够将子构件置放在左上角、上中、右上、左中、正中间,右中、左下,下中,右下方共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)
        #解析xml加上按键
        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()

之上每一种合理布局都是有编码实例,多对编码开展调节改动,可能更有体会心得。

评论(0条)

刀客源码 游客评论