------控件
控件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()
代碼的運行結果如下: