------控件
控件Widget是kivy图形界面中的基本元素。控件提供了一个画布canvas,这是用来在屏幕上进行绘制的。控件接收事件,并对事件作出反应。
一个控件的子控件会以children属性的形式表达,这个属性是kivy中的一个列表属性ListProperty。可以用以下方法来操作控件树:
·add_widget():添加一个控件作为子控件
·remove_widget():从子控件列表中去掉一个控件
·clear_widget():清空一个控件的所有子控件。
控件索引:控件绘制的顺序,是基于各个控件在控件树中获得位置。指定新增控件在控件树中的位置的方法为:root.add_widget(widget,index)
注意:索引值小的控件会被绘制在索引值大的控件之上,默认值是0
------整理布局
布局layout是一种能控制自己子控件尺寸和位置的控件。有各种不同的布局,使用尺寸推测size_hint和位置推测pos_hint这两个属性来决定子控件children的尺寸size和位置pos
盒式布局BoxLayout:所有控件充满整个空间,横竖排列都可以。子控件的size_hint属性可以用来改变每个子控件的比例,也可以设置为固定尺寸。
网格布局GirdLayout:以一张网格的方式来安排控件。必须指定好网格的维度,确定好分成多少格,如此kivy才能计算出每个元素的尺寸并且确定如何安排这些元素的位置。
栈状布局StackLayout:挨着放一个个控件,彼此邻近,在某一维度上有固定大小,而使它们充满整个空间,这适合用来显示相同预定义大小的子控件。
锚式布局AnchorLayout:一种非常简单的布局,只关注子控件的位置,将子控件放在布局的边界位置,不支持size_hint。
浮动布局FloatLayout:允许放置任意位置和尺寸的子控件,可以是绝对尺寸,也可以是相对布局的尺寸,默认的size_hint(1,1)会让每个子控件都与整个布局一样大,所以如果你多个子控件就需要修改这个值。可以把size_hint设置成(None,None),这样就可以使用size这个绝对尺寸属性,控件也支持pos_hint,这个属性是一个dict词典,用来设置相对布局的位置。
相对布局RelativeLayout:与浮动布局FloatLayout相似,不同之处在于子控件的位置是相对于布局空间,而不是相对于屏幕
size_hint是一个引用列表属性ReferenceListProperty,包括size_hint_x和size_hint_y两个变量。接收的变量值是从0到1的各种数值,或者None,默认值为(1,1)。这表示如果控件处在布局之内,布局将会在两个方向分配全部尺寸(相对布局大小)给该控件。
在盒式布局中,当orientation被设置为竖直方向(vertical)的时候,size_hint_y由布局来控制;反之设置为水平方向(horizonttal)的时候,size_hint_x由布局控制,所以手动设置就无效了。
-------给布局添加背景
对布局实力添加一个色彩背景的方法如下:
在python中的实现:
具体设置布局背景颜色的python代码如下:
from kivy.app import App
from kivy.graphics import Color,Rectangle
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
class RootWidget(FloatLayout):
def __init__(self,**kwargs):
super(RootWidget,self).__init__(**kwargs)
self.add_widget(
Button(
text="Hello world",
size_hint=(.5,.5),
pos_hint={"center_x":.5,"center_y":.5}))
class MainApp(App):
def build(self):
self.root=root=RootWidget()
root.bind(size=self._update_rect,pos=self._update_rect)
with root.canvas.before:
Color(0,0,1,1) #设置背景颜色,(红,绿,蓝,透明度)
self.rect=Rectangle(size=root.size,pos=root.pos)
return root
def _update_rect(self,instance,value):
self.rect.pos=instance.pos
self.rect.size=instance.size
if __name__=="__main__":
MainApp().run()
实现效果如下:
------给自定义布局规则/类增加背景色
基于布局类Layout创建一个自定义的布局子类,可以给自定义的类增加一个背景。
使用python的代码:
from kivy.app import App
from kivy.graphics import Color,Rectangle
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import AsyncImage
class RootWidget(BoxLayout):
pass
class CustomLayout(FloatLayout):
def __init__(self,**kwargs):
super(CustomLayout,self).__init__(**kwargs)
with self.canvas.before:
Color(0,0,1,1)
self.rect=Rectangle(size=self.size,pos=self.pos)
self.bind(size=self._update_rect,pos=self._update_rect)
def _update_rect(self,instance,value):
self.rect.pos=instance.pos
self.rect.size=instance.size
class MainApp(App):
def build(self):
root=RootWidget()
c=CustomLayout()
root.add_widget(c)
c.add_widget(
AsyncImage(
source="http://pic30.nipic.com/20130619/9885883_210838271000_2.jpg",
size_hint=(1,.5),
pos_hint={"center_x":.5,"center_y":.5}))
root.add_widget(AsyncImage(source="http://pic1.win4000.com/wallpaper/c/53cdd1f7c1f21.jpg"))
c=CustomLayout()
c.add_widget(
AsyncImage(
source="http://pic32.nipic.com/20130813/3347542_160503703000_2.jpg",
size_hint=(1,.5),
pos_hint={"center_x":.5,"center_y":.5}))
root.add_widget(c)
return root
if __name__=="__main__":
MainApp().run()
代码的运行结果如下: