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 的图形界面开发。其最终效果如下图所示:
本文所述程序的代码结构如下图所示:
其中:
- /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 代码。
首先,引入所需的模块:
1
2
3
4
5
6
7
|
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 的先天缺陷,其对中文的支持很差劲,默认情况下,中文都会显示成一个个豆腐块,只能通过引入中文字体来解决:
1
2
3
4
|
labelbase.register(
name = 'siyuanheiti' ,
fn_regular = './font/sourcehansanscn-normal.ttf'
)
|
然后,我们创建 3 个在kv文件中定义的小部件:
1
2
3
4
5
6
7
8
9
10
11
|
# 图像按钮
class imagebutton(buttonbehavior,image):
pass
# 秒表屏幕
class stopwatchscreen(screen):
pass
# 时钟屏幕
class clockscreen(screen):
pass
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
创建一个名为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()方法即可运行。
1
2
3
|
if __name__ = = '__main__' :
app = mainapp()
app.run()
|
小结
总体而言,使用 kivy 编写图形界面程序和使用其他 python 图像界面库相比,没有多大的区别。其通过kv设计语言,很大程序上把图形程序的界面和交互分离开来,使得程序的开发比较清晰。
如果需要使用 kivy 开发出精美且功能强大的图形界面,还是得深入熟悉和了解 kivy 的各类组件。
以上就是python基于kivy 写一个图形桌面时钟程序的详细内容,更多关于python kivy 写一个桌面时钟程序的资料请关注服务器之家其它相关文章!
原文链接:https://zmister.com/archives/1608.html