天天看點

kivy基本程式結構

建立一個程式

kivy.require('1.9.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
    def build(self):
        return Label(text='Hello world')
if __name__ == '__main__':
MyApp().run()
           

每個程式都必須要有一個繼承自kivy.app.App的類,類名決定程式名稱,程式的入口為App類的run方法。

kivy.app包含程式消息循環、記憶體管理、程序管理等類;kivy.uix包含基于widget和layout的各種控件。代碼第一行指明需要的kivy版本,這句可以省略。

繼承app類的MyApp的build方法用于傳回根控件root widget(這類似于qt的頂層視窗,是一個程式中一切其他控件的頂層控件)。最後在主代碼裡運作程式。

一個标準程式結構

下面的代碼展示一個相對于上面更加具有一般特征的結構,在以後的代碼裡一般都以這個結構為基礎。

#coding:u8
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
class MyWidget(GridLayout):
    def __init__(self,**kw):
        super(MyWidget,self).__init__(**kw)
        self.cols = 2
        self.laba = Label(text='grid one')
        self.add_widget(self.laba)
        self.labb = Label(text='grid two')
        self.add_widget(self.labb)
class MyApp(App):
    def build(self):
        return MyWidget()
if __name__ == '__main__':
MyApp().run()
           

上面的代碼包含了控件widget、布局layout,将根控件獨立為一個類,這樣控件初始化更加直覺。

控件以控件樹的方式組織,樹的頂端是根控件,控件樹通過add_widget增加控件、remove_widget删除控件、clear_widgets删除全部控件這幾個方法來操作。比如按照上面的代碼:

self.add_widget(self.laba)

self.remove_widget(self.laba)

self.clear_widgets()

周遊控件樹,所有的子控件都以清單的形式存儲在根控件的children屬性裡。

w = MyWidget()
for child in w.children:
    print child
           

如果你要修改控件樹中的控件,那麼應該使用控件樹的副本

for child in w.children[:]:
    w.remove_widget(child)
           

控件繪制順序(Z索引)

控件一般按照初始化順序來繪制,可以通過修改Z索引來改變。

w.add_widget(widget,index)