python基于Kivy写一个图形桌面时钟程序


Posted in Python onJanuary 28, 2021

Kivy 是一个开源的 Python 第三方库,可以用来快速开发应用程序。

它有如下三个特点:

  • 跨平台

Kivy 编写的程序可在 Linux,Windows,OS X,Android,iOS 和 Raspberry Pi 上运行。

  • 商业友好

Kivy 基于 MIT 许可证进行开源,可以进行免费的商业使用。

  • GPU 加速

Kivy 的图像引擎基于 Open ES 2 构建,性能出众。

除此之外 Kivy 也存在一些缺点,比如:

  • 非原生的图形界面;
  • 打包后的体积很大;
  • 缺乏社区支持;
  • 缺乏足够的示例文档;
  • 对中文的支持很差;

尽管 Kivy 有这样的缺点,但也不失为一个优秀的 Python 图形界面开发库。尤其是其能够将应用程序打包为移动设备(IOS 和安卓)可用的 APP,可以说极大地扩展了 Python 开发的边界。

本篇文章,我们用 Kivy 写一个桌面时钟程序,来体验一下 Kivy 的图形界面开发。其最终效果如下图所示:

python基于Kivy写一个图形桌面时钟程序

本文所述程序的代码结构如下图所示:

python基于Kivy写一个图形桌面时钟程序

其中:

  • /font文件夹用于放置中文字体文件。在其中,我们放置了思源黑体作为图形的中文显示字体。
  • /imgs文件夹用于放置静态图片文件,在其中,我们放置了两个方向指示图片。
  • /kv文件夹用于存放 Kivy 界面的设计模板。
  • main.kv是主程序的界面设计模板。
  • main.py是主程序的 Python 代码。

使用 kv 构建界面

Kivy 提供了一种简单且可扩展的 GUI 设计语言用来专门设计对 Kivy 的图形界面进行设计。我们可以在.kv文件中设计好程序的图形界面,然后在.py文件中对图像界面进行交互控制。

在本程序中,我们一共有 3 个地方使用了 Kivy 的设计语言,它们分别是:

  • 时钟屏幕:clockscreen.kv
  • 秒表屏幕:stopwatchscreen.kv
  • 主界面:main.kv

在时钟屏幕中,我们按照如下方式定义构建了一个界面:

python基于Kivy写一个图形桌面时钟程序

在秒表屏幕中,我们按照如下方式定义构建了一个界面:

python基于Kivy写一个图形桌面时钟程序

最后在主界面中,引入这两个屏幕,通过布局管理器,将其放置在了主界面中:

python基于Kivy写一个图形桌面时钟程序

编写主程序代码

在通过 Kivy 的kv设计语言构建好了程序界面之后,我们来编写主程序的 Python 代码。

首先,引入所需的模块:

from kivy.app import App
from kivy.uix.screenmanager import Screen,SlideTransition
from kivy.core.text import LabelBase
from kivy.uix.button import ButtonBehavior
from kivy.uix.image import Image
from kivy.clock import Clock
import 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 的各类组件。

以上就是python基于Kivy 写一个图形桌面时钟程序的详细内容,更多关于python Kivy 写一个桌面时钟程序的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用PyV8执行javascript代码示例分享
Dec 04 Python
Python删除指定目录下过期文件的2个脚本分享
Apr 10 Python
python解析xml文件操作实例
Oct 05 Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
keras得到每层的系数方式
Jun 15 Python
Python 多进程、多线程效率对比
Nov 19 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 #Python
详解Python调用系统命令的六种方法
Jan 28 #Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 #Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 #Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 #Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
Jan 27 #Python
一个入门级python爬虫教程详解
Jan 27 #Python
You might like
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
PyQt5每天必学之布局管理
2018/04/19 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
优秀中专生推荐信
2013/11/17 职场文书
服装厂厂长职责
2013/12/16 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
关于母亲节的感言
2014/02/04 职场文书
产品生产计划书
2014/05/07 职场文书