### 編程向導4.1 Kivy基礎
#### 一、安裝Kivy的運行環境
Kivy依賴許多Python庫,例如pygame,gstreamer,PIL,Cario等等,它們并不總是必須的。根據你所運行的系統平臺,環境的安裝可能是一個痛苦。對于Windows和MacOS X平臺,我們提供了一個便捷的安裝包,你僅僅需要解壓就可使用:
* [在Windows上安裝](https://kivy.org/docs/installation/installation-windows.html#installation-windows)
* [在OS X上安裝](https://kivy.org/docs/installation/installation-osx.html#installation-osx)
* [在Linux上安裝](https://kivy.org/docs/installation/installation-linux.html#installation-linux)
如果每一個包庫你都想自己安裝,確保你有最新的Cython和Pygame。一個典型的Pip安裝如下:
pip install cython
pip install hg+http://bitbucket.org/pygame/pygame
pip install kivy
開發版可以使用git安裝:
git clone https://github.com/kivy/kivy
make
#### 二、創建一個應用程序
創建一個kivy應用程序步驟:
* 繼承App類
* 實現它的build()方法,它能返回一個部件的實例(你的部件樹的根部件)
* 實例化該類,同時調用它的run()方法
下面是一個最小化應用程序的例子:
```Python
import kivy
kivy.require('1.0.6') # 用你當前的kivy版本替換
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()
```
你可以保存上面的代碼到一個諸如main.py的text文件中,并嘗試運行它。
#### 三、Kivy APP的生命周期
首先,讓我們熟悉一下Kivy應用程序的應用周期:

正如你上面看到的,對于所有的應用程序,我們的入口就是run()方法,在我們的例子中就是MyApp().run()。我們會面會重新回顧這里。下面我們首先看第一行代碼:
from kivy.app import App
你的應用程序的基類需要繼承APP類,它在kivy_installation_dir/kivy/app.py中。
>提示:如果你想進一步的研究APP類,你可以打開該文件進行深入的探討。我們鼓勵你重讀它的代碼。Kivy是基于Python實現的并且其文檔都在實際的文件里。
第二行:
from kivy.uix.label import Label
請注意,包的路徑被展示了。uix模塊包含著例如布局、部件等用戶接口元素。
再看第五行:
class MyApp(App):
這里定義了我們的應用程序的基類。你僅僅需要改變一下你的應用程序MyApp的名字。
第七行:
def build(self):
正如在生命周期圖片顯示的那樣,這是你初始化并返回你的根部件的地方。我們的例子在第八行:
return Label(text='Hello Kivy')
這里我們初始化了一個標簽,標簽文本是:Hello Kivy,并返回了它的實例。這個標簽將作為我們應用程序的根部件。
現在我們將在11行和12行運行我們的應用程序:
if __name__ == '__main__':
MyApp().run()
這里,MyAPP類被實例化并運行了它的run()方法。這樣就初始化并啟動了Kivy應用程序。
#### 四、運行應用程序
為了運行應用程序,根據你的操作系統,按照下面的說明:
* Linux:
```
$ python main.py
```
* Windows:
```
$python main.py
或者
c:/appdir>kivy.bat main.py
```
* Mac Os X:
```
$ kivy main.py
```
* Android:
你的應用程序需要一些補充的文件以便在安卓上運行。請參閱[為安卓程序打包](https://kivy.org/docs/guide/packaging-android.html)
運行程序后,一個諸如下面的窗口將被呈現:

#### 五、定制應用程序
下面讓我們擴展一下,做一個簡單的用戶名/密碼的輸入頁面。
```python
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
class LoginScreen(GridLayout):
def __init__(self, **kwargs):
super(LoginScreen, self).__init__(**kwargs)
self.cols = 2
self.add_widget(Label(text='User Name'))
self.username = TextInput(multiline=False)
self.add_widget(self.username)
self.add_widget(Label(text='password'))
self.password = TextInput(password=True, multiline=False)
self.add_widget(self.password)
class MyApp(App):
def build(self):
return LoginScreen()
if __name__ == '__main__':
MyApp().run()
```
在第二行,我們導入了網格布局:
from kivy.uix.gridlayout import GridLayout
在第九行,這個類被用作我們根部件的作為一個基本布局:
class LoginScreen(GridLayout):
在第12行,我們重載了方法__init__()以便于我們添加部件和行為:
def __init__(self, **kwargs):
super(LoginScreen, self).__init__(**kwargs)
我們不能忘記調用父類的super方法,以實現基類的基本功能;同時也要注意在調用super時不要忽略**kwargs參數,因為它們有時在內部使用。
第15行:
self.cols = 2
self.add_widget(Label(text='User Name'))
self.username = TextInput(multiline=False)
self.add_widget(self.username)
self.add_widget(Label(text='password'))
self.password = TextInput(password=True, multiline=False)
self.add_widget(self.password)
我們使用網格布局以兩列來管理它的孩子們,并且每行添加了一個標簽和一個文本輸入框。
運行程序如圖:

試著重新改變窗口大小,你會發現部件會自動調整尺寸。
上面的代碼沒有處理用戶的輸入,沒有使用各種數據驗證,包括部件的尺寸、位置等等。我們將會繼續深入的研究他們。
#### 六、平臺細節
打開一個終端應用程序,并且設置Kivy的環境變量
* 在Windows平臺上,僅僅需要雙擊kivy.bat,一個終端窗口會自動打開,并設置各種變量
* 在nix* 系統下,如果kivy沒有全局安裝,打開終端輸入:
export python=$PYTHONPATH:/path/to/kivy_installation
### 下節預告 編程向導4.2 控制環境