kivy學習---控件


------控件

控件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()

代碼的運行結果如下:

 







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM