天天看点

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)