Kivy 图形界面开发初体验

本文是觅道文档连载教程《使用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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索