本文是覓道文檔連載教程《使用Kivy構建現代桌面GUI應用》 的第一個實例,如需細緻的介紹,可在文末點擊「閱讀原文」進行閱讀git
Kivy 是一個開源的 Python 第三方庫,能夠用來快速開發應用程序。github
它有以下三個特色:web
•跨平臺 Kivy 。編寫的程序可在 Linux,Windows,OS X,Android,iOS 和 Raspberry Pi 上運行。•商業友好 。Kivy 基於 MIT 許可證進行開源,能夠進行免費的商業使用。•GPU 加速 。Kivy 的圖像引擎基於 Open ES 2 構建,性能出衆。微信
除此以外 Kivy 也存在一些缺點,好比:app
•非原生的圖形界面;•打包後的體積很大;•缺少社區支持;•缺少足夠的示例文檔;•對中文的支持不好;ide
儘管 Kivy 有這樣的缺點,但也不失爲一個優秀的 Python 圖形界面開發庫。尤爲是其可以將應用程序打包爲移動設備(IOS 和安卓)可用的 APP,能夠說極大地擴展了 Python 開發的邊界。佈局
本篇文章,咱們用 Kivy 寫一個桌面時鐘程序,來體驗一下 Kivy 的圖形界面開發。其最終效果以下圖所示:性能
本文所述程序的代碼結構以下圖所示:字體

其中:flex
•/font
文件夾用於放置中文字體文件。在其中,咱們放置了思源黑體做爲圖形的中文顯示字體。•/imgs
文件夾用於放置靜態圖片文件,在其中,咱們放置了兩個方向指示圖片。•/kv
文件夾用於存放 Kivy 界面的設計模板。•main.kv
是主程序的界面設計模板。•main.py
是主程序的 Python 代碼。
使用 kv 構建界面
Kivy 提供了一種簡單且可擴展的 GUI 設計語言用來專門設計對 Kivy 的圖形界面進行設計。咱們能夠在.kv
文件中設計好程序的圖形界面,而後在.py
文件中對圖像界面進行交互控制。
在本程序中,咱們一共有 3 個地方使用了 Kivy 的設計語言,它們分別是:
•時鐘屏幕:clockscreen.kv•秒錶屏幕:stopwatchscreen.kv•主界面:main.kv
在時鐘屏幕中,咱們按照以下方式定義構建了一個界面:

在秒錶屏幕中,咱們按照以下方式定義構建了一個界面:

最後在主界面中,引入這兩個屏幕,經過佈局管理器,將其放置在了主界面中:

編寫主程序代碼
在經過 Kivy 的kv
設計語言構建好了程序界面以後,咱們來編寫主程序的 Python 代碼。
首先,引入所需的模塊:
from kivy.app import Appfrom kivy.uix.screenmanager import Screen,SlideTransitionfrom kivy.core.text import LabelBasefrom kivy.uix.button import ButtonBehaviorfrom kivy.uix.image import Imagefrom kivy.clock import Clockimport time
接着,配置一下中文字體。由於 Kivy 的先天缺陷,其對中文的支持不好勁,默認狀況下,中文都會顯示成一個個豆腐塊,只能經過引入中文字體來解決:
LabelBase.register( name='SiyuanHeiti', fn_regular='./font/SourceHanSansCN-Normal.ttf')
而後,咱們建立 3 個在kv
文件中定義的小部件:
# 圖像按鈕class ImageButton(ButtonBehavior,Image): pass# 秒錶屏幕class StopwatchScreen(Screen): pass# 時鐘屏幕class ClockScreen(Screen): pass
最後,建立一個名爲MainApp()
的類,這是程序的主類。咱們把各類交互控制的方法寫在這裏面:
class MainApp(App): sw_started = False # 秒錶啓動狀態 sw_seconds = 0 # 當前秒錶秒數 def update(self,n): # 若是秒錶已啓動,更新當前秒數 if self.sw_started: self.sw_seconds += n # 更新當前時間 self.root.ids['clock_screen'].ids['time'].text = time.strftime("[b]%H[/b]:%M:%S") # 更新秒錶 m,s = divmod(self.sw_seconds,60) # 返回一個包含商和餘數的元組 self.root.ids['stopwatch_screen'].ids['stopwatch'].text = ("%02d: %02d.[size=40]%02d[/size]" % (int(m),int(s),int(s*100%100))) # 重寫程序啓動的事件 def on_start(self): Clock.schedule_interval(self.update,0) # 開始/中止 def start_stop(self): self.root.ids['stopwatch_screen'].ids['start_stop'].text = '啓動' if self.sw_started else '中止' self.sw_started = not self.sw_started # 重置秒錶 def reset(self): if self.sw_started: self.root.ids['stopwatch_screen'].ids['start_stop'].text = '啓動' self.sw_started = False self.sw_seconds = 0 def go_forward(self): screen_manager = self.root.ids['screen_manager'] screen_manager.transition = SlideTransition(direction="right") screen_manager.current = "stopwatch_screen" def go_back(self): screen_manager = self.root.ids['screen_manager'] screen_manager.transition = SlideTransition(direction="left") screen_manager.current = "clock_screen"
這樣,這個程序就完成了。咱們實例化MainApp()
並調用其run()
方法便可運行。
if __name__ == '__main__': app = MainApp() app.run()
小結
整體而言,使用 Kivy 編寫圖形界面程序和使用其餘 Python 圖像界面庫相比,沒有多大的區別。其經過kv
設計語言,很大程序上把圖形程序的界面和交互分離開來,使得程序的開發比較清晰。
若是須要使用 Kivy 開發出精美且功能強大的圖形界面,仍是得深刻熟悉和了解 Kivy 的各種組件。
🧐分享、點贊、在看,給個三連擊唄!👇
本文分享自微信公衆號 - 州的先生(zmister2016)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。