標籤:

Kivy中文編程指南:基礎知識

以下是對 Kivy 官方網站基礎講解部分的翻譯,原文地址。

Kivy環境安裝搭建

Kivy要依賴很多Python包,比如 pygame, gstreamer, PIL, Cairo 等等還有好多。這些包並非都是必需的,要根據你的運行平台來看具體情況,有時候缺那麼一兩個包就可能導致安裝失敗,或者運行過程中出錯等等,這就挺痛苦的。所以Kivy官方針對Windows和MacOS X提供了集成好關鍵部件的壓縮包,解壓縮之後直接就能用。具體的安裝過程可以參考下面鏈接中的中文安裝指南:

  • Kivy中文安裝指南

如果你非要自己從零開始安裝,那最起碼要確保安裝有Cython和Pygame。這兩個包可以通過pip來安裝,如下所示:

pip install cythonnpip install hg+http://bitbucket.org/pygame/pygamenpip install kivyn

Kivy的開發版本也可以通過git來安裝:

git clone https://github.com/kivy/kivynmaken

創建一個應用

創建一個Kivy應用挺簡單的,大概步驟如下:

  • 基於App類創建一個子類;
  • 把build()方法實現為返回一個控制項實例(這個控制項的實例也就是你整個應用的根控制項)。
  • 創建一個這個類的實例,然後調用run()方法。

下面的代碼就是上述思路的最小化實現:

import kivynkivy.require(1.0.6) # 注意要把這個版本號改變成你現有的Kivy版本號!nnfrom kivy.app import App # 譯者註:這裡就是從kivy.app包裡面導入App類nfrom kivy.uix.label import Label # 譯者註:這裡是從kivy.uix.label包中導入Label控制項,這裡都注意開頭字母要大寫nnclass MyApp(App):nn def build(self): # 譯者註:這裡是實現build()方法n return Label(text=Hello world) # 譯者註:在這個方法裡面使用了Label控制項nnif __name__ == __main__:n MyApp().run() # 譯者註:這裡就是運行了。nnn譯者註:這一段的額外添加的備註是給萌新的.n就是要告訴萌新們,一定要每一句每一個函數每一個變數甚至每一個符號,都要讀得懂!!!n如果是半懂不懂的狀態,一定得學透了,要不然以後早晚得補課.n這時候又讓我想起了結構化學。n總之更詳細的內容後面會有,大家加油。nn

把上面的代碼以文本形式複製到一個文本文件中,保存成py文件,例如main.py,然後運行,就行了。

Kivy應用的生命周期

跟學習開發Android應用的時候類似,咱們首先也是要了解一下Kivy應用的生命周期:

如上圖所示,不論什麼用途和目的,咱們應用的入口都是這個run()方法,在本文的樣例代碼中,就是「MyApp().run()」。

下面就一行一行開始詳細解釋了:

from kivy.app import Appn

為什麼要導入這個App類呢?因為咱們自定義的這個App要繼承這個類。這個類的位置在kivy安裝目錄下的kivy目錄下的app.py文件中。

特別注意

如果你想要深入挖掘一下,去了解這個Kivy的App類到底是怎麼個內容,你可以打開這個app.py文件,親自來看看。Kivy作者特別鼓勵大家去閱讀源碼。Kivy基於Python,用Sphinx編寫的文檔,所以每個類的文檔都在對應的文件內。

然後咱們回過頭來,繼續看本文這次的代碼的第二行:

from kivy.uix.label import Labeln

這裡一定要特別注意各種包和類的導入。"kivy.uix"這個包的作用是容納用戶界面元素,比如各種輸出布局和控制項。

接下來看到這一行:

class MyApp(App):n

這一行定義了咱們這次的Kivy應用的基類。如果你要做修改的話,把MyApp改成你要設定的應用名字就可以了。

接著往下看:

def build(self):n

在上面的生命周期圖中加粗強調的部分表明,build函數所處的是要進行初始化和返回根控制項的位置。根控制項返回的操作在下面這一行中實現:

return Label(text=Hello world)n

這裡我們用文本『Hello World』對Label這一控制項進行了初始化,並且返回了其實例。這個Label就是咱們這個應用的根控制項了。

特別注意

Python是用縮進來區別代碼塊的,所以一定要注意上面代碼的縮進和層次,尤其是函數定義那部分。

然後咱們繼續,到了真正讓應用開始運行的這部分了:

if __name__ == __main__:n MyApp().run()n

這裡對MyApp這個類進行了初始化,然後調用了這個類的run()方法。這樣就初始化並啟動了我們的Kivy應用了。

運行應用

接下來就是要在不同操作系統平台上來運行咱們剛剛寫好的應用了:

To run the application, follow the instructions for your operating system:

  • Linux 終端中以如下方式運行:

$ python main.pyn

  • Windows 可以在CMD中以如下方式運行:

$ python main.py #用系統Python運行nC:appdir>kivy.bat main.py #用kivy.bat來運行,注意這裡要設定好正確的路徑n

  • Mac OS X 跟Linux差不多,也在終端中運行,不過是要用Kivy官方提供的集成解釋器:

$ kivy main.pyn

  • Android 下面要運行還需要一些複雜的文件,所以等以後深入了之後再給講解這部分了。

這個應用運行之後的具體效果就是下面圖片所示這樣,會打開一個窗口,然後展示出一個Label,上面寫著文本『Hello World』,這個Label會覆蓋該窗口的全部區域。就這樣了。

修改定製這個應用

接下來咱們擴展一下這個應用的功能,增加一個用戶名/密碼輸入的頁面吧。

from kivy.app import Appnfrom kivy.uix.gridlayout import GridLayoutnfrom kivy.uix.label import Labelnfrom kivy.uix.textinput import TextInputnnclass LoginScreen(GridLayout):nn def __init__(self, **kwargs):n super(LoginScreen, self).__init__(**kwargs)n self.cols = 2n self.add_widget(Label(text=User Name))n self.username = TextInput(multiline=False)n self.add_widget(self.username)n self.add_widget(Label(text=password))n self.password = TextInput(password=True, multiline=False)n self.add_widget(self.password)nnclass MyApp(App):nn def build(self):n return LoginScreen()nnif __name__ == __main__:n MyApp().run()n

在下面這行代碼中,我們導入了一種名為Gridlayout的布局:

from kivy.uix.gridlayout import GridLayoutn

這個類被我們用作基類來製作根控制項LoginScreen,在如下代碼中進行了定義:

class LoginScreen(GridLayout):n

如下代碼中,我們在LoginScreen類中重新定義了初始化方法__init__(),這樣來增加一些控制項,並且定義了這些控制項的行為:

def __init__(self, **kwargs):n super(LoginScreen, self).__init__(**kwargs)n

一定要注意這裡要加super,才能把現有的新初始化方法覆蓋掉繼承來的舊初始化方法。另外也要注意,這裡調用super的時候沒有省略掉**kwargs,這是一種好習慣。

然後繼續往下看:

self.cols = 2nself.add_widget(Label(text=User Name))nself.username = TextInput(multiline=False)nself.add_widget(self.username)nself.add_widget(Label(text=password))nself.password = TextInput(password=True, multiline=False)nself.add_widget(self.password)n

上面的代碼中,我們讓GridLayout來管理子控制項,把子控制項設置為兩欄,然後加上用戶名和密碼的Label字元顯示控制項和TextInput字元輸入控制項。

運行上面的代碼,得到的窗口效果大概如下圖:

嘗試著重新縮放一下窗口大小,你會發現上面的控制項會相對整個窗口的尺寸而自行調整大小,並不需要人為去操作了。這是因為這些控制項都使用了默認的尺寸。

上面這個代碼雖然有輸入框,但是並沒有提供用戶輸入的支持和處理,所以並不能進行用戶名/密碼驗證,也沒有任何其他用處。後續的練習中咱們再來深入去探討這些功能,並且還會講一講空間的尺寸和位置等話題。


推薦閱讀:

Kivy中文編程指南:Kivy 虛擬機
Kivy中文編程指南:架構概覽

TAG:Kivy | Python |