python schedule模块_利用python的kivy模块做一个简单的秒表

Kivy是一个开源的Python模块库,用于开发界面应用程序和其它采用自然用户界面的多点触控应用软件。它可以在Android,iOS,Linux,OS X和Windows执行,是一款有趣跨平台的模块库。

今天,我利用其clock功能,实现一个简单界面的秒表功能。

f0a7ca8ae5b5495c849302f43024a657

kivy.clock对象允许您安排函数一次或多次按指定的间隔调用一个函数,您可以通过dt参数获取调度和调用回调之间的时间。在这里我们使用其多次调用一个函数的方法构建秒表。其函数为:

Clock.schedule_interval(my_callback, 0.5)它的涵意是每0.5秒调用一次my_callback函数。

下面是官方文档给出的一个例子。

b0513688cdd440e28f3e4d589666948b

相比其他界面库,kivy.clock模块的功能更强大、更接近于自然语言,完成相同的功能使用的代码量更少。

首先,我们搭建界面,也就是编写stopwatch.kv文件。在这里使用了BoxLayout,这样窗口无论怎么缩放都不会失真,中间使用Label控件显示秒表时间各计次结果。

stopwatch.kv

#:kivy 1.10.1 BoxLayout: orientation: 'vertical' spacing: 15 padding: 28 BoxLayout: orientation: 'horizontal' Label: Label: id: label1 font_name:'simfang.ttf' font_size: '40sp' text:root.hour Label: font_name:'simfang.ttf' font_size: '40sp' text:':' Label: id: label2 font_name:'simfang.ttf' font_size: '40sp' text:root.min Label: font_name:'simfang.ttf' font_size: '40sp' text:':' Label: id: label3 font_name:'simfang.ttf' font_size: '40sp' text:root.second Label: font_name:'simfang.ttf' font_size: '40sp' text:'.' Label: id: label4 font_name:'simfang.ttf' font_size: '40sp' text:root.msec Label: Label: id: timeslabel1 font_name:'simfang.ttf' font_size: '40sp' Label: id: timeslabel2 font_name:'simfang.ttf' font_size: '40sp' Label: id: timeslabel3 font_name:'simfang.ttf' font_size: '40sp' Label: id: timeslabel4 font_name:'simfang.ttf' font_size: '40sp' Label: id: timeslabel5 font_name:'simfang.ttf' font_size: '40sp' BoxLayout: orientation: 'horizontal' spacing: 5 Button: id: btn1 font_name:'simfang.ttf' font_size: '40sp' text:'开始' on_press:root.start() Button: id: btn2 font_name:'simfang.ttf' font_size: '40sp' text:'停止' on_press:root.stop() Button: id: btn3 font_name:'simfang.ttf' font_size: '40sp' text:'计次' on_press:root.jc() Button: id: btn4 font_name:'simfang.ttf' font_size: '40sp' text:'复位' on_press:root.restart()

然后,我们写main.py。

main.py

from kivy.app import Appfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.core.window import Windowfrom kivy.properties import StringPropertyfrom time import timefrom kivy.clock import Clockfrom functools import partialclass StopWatch(BoxLayout): hour = StringProperty() min = StringProperty() second = StringProperty() msec = StringProperty() def __init__(self, **kwargs): super(StopWatch, self).__init__(**kwargs) self.hour = '00' self.min = '00' self.second = '00' self.msec = '00' self.start_time = 0 self.times = '0' # 计次按钮点击次数 self.start_flag = False def setTime(self, start_time, dt): escaped = time() - start_time hours = int(escaped / 1440) mins = int((escaped - hours * 24) / 60) seconds = int(escaped - hours * 24 - mins * 60) hseconds = int((escaped - hours * 24 - mins * 60 - seconds) * 100) self.ids['label1'].text = '{:0>2d}'.format(hours) # 宽度为2,如果不是2则在左边填充0 self.ids['label2'].text = '{:0>2d}'.format(mins) self.ids['label3'].text = '{:0>2d}'.format(seconds) self.ids['label4'].text = '{:0>2d}'.format(hseconds) def start(self): if not self.start_flag: self.times = '0' # 每次开始重新计时,把计次按钮数清0 self.start_flag = True self.start_time = time() self.event = Clock.schedule_interval(partial(self.setTime, self.start_time), 0.1) def stop(self): if self.start_flag: self.event.cancel() self.start_flag = False def jc(self): if self.start_flag: self.times = str(int(self.times) + 1) if int(self.times) < 6: if int(self.times) % 5 == 1: self.ids['timeslabel1'].text = f'第{self.times}次计时:' + self.ids['label1'].text + ':' + self.ids['label2'].text + ':' + self.ids['label3'].text + '.' + self.ids['label4'].text elif int(self.times) % 5 == 2: self.ids['timeslabel2'].text = f'第{self.times}次计时:' + self.ids['label1'].text + ':' + self.ids['label2'].text + ':' + self.ids['label3'].text + '.' + self.ids['label4'].text elif int(self.times) % 5 == 3: self.ids['timeslabel3'].text = f'第{self.times}次计时:' + self.ids['label1'].text + ':' + self.ids['label2'].text + ':' + self.ids['label3'].text + '.' + self.ids['label4'].text elif int(self.times) % 5 == 4: self.ids['timeslabel4'].text = f'第{self.times}次计时:' + self.ids['label1'].text + ':' + self.ids['label2'].text + ':' + self.ids['label3'].text + '.' + self.ids['label4'].text elif int(self.times) % 5 == 0: self.ids['timeslabel5'].text = f'第{self.times}次计时:' + self.ids['label1'].text + ':' + self.ids['label2'].text + ':' + self.ids['label3'].text + '.' + self.ids['label4'].text else: self.ids['timeslabel1'].text = self.ids['timeslabel2'].text self.ids['timeslabel2'].text = self.ids['timeslabel3'].text self.ids['timeslabel3'].text = self.ids['timeslabel4'].text self.ids['timeslabel4'].text = self.ids['timeslabel5'].text self.ids['timeslabel5'].text = f'第{self.times}次计时:' + self.ids['label1'].text + ':' + self.ids['label2'].text + ':' + self.ids['label3'].text + '.' + self.ids['label4'].text def restart(self): self.stop() self.ids['label1'].text = '00' self.ids['label2'].text = '00' self.ids['label3'].text = '00' self.ids['label4'].text = '00' self.ids['timeslabel1'].text = '' self.ids['timeslabel2'].text = '' self.ids['timeslabel3'].text = '' self.ids['timeslabel4'].text = '' self.ids['timeslabel5'].text = ''class StopWatchApp(App): def build(self): # 设置APP图标 self.icon = 'myico.ico' # 设置窗口大小 Window.size = (600, 600) # 设置APP标题 self.title = '秒表' return StopWatch()if __name__ == '__main__': StopWatchApp().run()

最后,需要注意的事项:

1、main.py和stopwatch.kv这两个文件必须放在同一个文件夹里,文件夹的名称最好是英文的。

2、stopwatch.kv的名称(也就是stopwatch)必须与main.py文件里的class StopWatchApp(App)名称相同,但是都是小写。

3、特别提醒,一定要注意缩进。如果你运行提示错误,一定要先看下缩进。

4、强烈建议大家把代码下载后再看,这样效果更好!

PS:效果图

90b5fb7fb168498f8baa346a5a36f8fd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值