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实现strcmp函数功能示例
Mar 25 Python
Python中super()函数简介及用法分享
Jul 11 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
Python3 replace()函数使用方法
Mar 19 Python
python 将print输出的内容保存到txt文件中
Jul 17 Python
python二进制文件的转译详解
Jul 03 Python
python和c语言的主要区别总结
Jul 07 Python
Django REST framework 视图和路由详解
Jul 19 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 Python
python实现大文本文件分割成多个小文件
Apr 20 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生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
django admin组件使用方法详解
2019/07/19 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
《美丽的彩虹》教学反思
2014/02/25 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
服务标语大全
2014/06/18 职场文书
护林防火标语
2014/06/27 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
2014年教师节活动总结
2014/08/29 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
军训新闻稿范文
2015/07/17 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python