Python 官网:
https://www.python.org/
这里,才 python 前沿。可惜是英文原版。所以,我要练习英文阅读。🧐🧐
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
——华罗庚
中英文报时器
题目
好久以前,想写一个能用英文播放当前时间的报时器,动手写了些代码,但终究不可以完美转化60以内的数字成英文单词。😭
那些代码就一直“残”那儿了。现在,炼到可以完美数字转英文单词了。才得以写完这个练习。
代码运行效果
我的思路
- 实现目标:分别用中英文播报当前时间,播报间隔可以设定。
- 用 time.localtime() 获取当前时间数组,从数组中提取当前小时和分钟数字。
- 用英文单词字符-数字对应字典转化数字成英文单词字符串。
- 用插值字符串格式化生成中英文播报字符串。
- 调用安卓助手语音播报模块播报中英文字符串。
- 按设定间隔进行循环播报(默认自启动始,半点播报)。
注:时间间隔设置,是调用安卓助手的输入窗体接收输入完成的。
完整 Python 代码
#!/sur/bin/nve python
# coding: utf-8
'''
作者:梦幻精灵_cq
QQ:479469838
2022-03-02
'''
import androidhelper #加载安卓助手模块。
from time import localtime, sleep
#加载时间模块的当前时间获取和暂停方法。
def time_s(flag = ''):
'''生成当前时间“时”“分”英文单词字符串'''
nums = {
0: 'zero', 1: 'one', 2: 'two', 3: 'three',
4: 'four', 5: 'five', 6: 'six', 7: 'seven',
8: 'eight', 9: 'nine',10: 'ten', 11: 'eleven',
12: 'twelve', 13: 'thirteen', 14: 'fourteen',
15: 'fifteen', 16: 'sixteen', 17: 'seventeen',
18: 'eighteen', 19: 'nineteen', 20: 'twenty',
30: 'thirty', 40: 'forty', 50: 'fifty'} #报时所用英文单词字典。
t = localtime() #获取当前时间数组。
#数组前三个元素对应“年月日”,接下来是“时分秒”。
# t[3] 是时,t[4] 是分,是 int 类型数值。
def time_s(i):
'''数字对应英文字符生成'''
time_s = nums.get(i) #字典中数字对应英文字符获取。
if time_s is None: #字典中没有的数字英文字符生成。
if i > 50:
time_s = '-'.join([nums.get(50), nums.get(i - 50)])
elif i > 40:
time_s = '-'.join([nums.get(40), nums.get(i - 40)])
elif i > 30:
time_s = '-'.join([nums.get(30), nums.get(i - 30)])
elif i > 20:
time_s = '-'.join([nums.get(20), nums.get(i - 20)])
return time_s #返回生成的英文字符。
if flag.lower() == 'a': #用 str.lower() 忽略大小写输入。
h = t[3] % 12 #传入标识符'A' or 'a' ,12h 播报取模。
else: #默认 24h 播报。
h = t[3]
if h == 0: #整点字符串生成。
return f"{time_s(h)} o'clock", \
f'现在是{h}点整' #返回中英文整点字符。
else: #报时字符串生成。
return f'{time_s(h)} {time_s(t[4])}', \
f'现在是{h}点{t[4]}分' #返回中英文字符。
def say_time(n = 30, flag = ''):
'''中英文报时,默认30分钟播报一次''
while True: #死循环播报。(播报不在整分钟上,2022-03-05 优化此段代码,每秒扫描一次,0秒播报。为求精准,只有舍资源占用了。前面是从运行代码算起间隔时间到,扫描当前时间并播报。不但进入后台不报,有时亮屏也没播放。)
sleep(1)
if localtime()[4] % n != 0 \
or localtime()[5] != 0:
continue
print(' ' * 42, end = '\r') #屏幕打印空格清除播报时间字符串。
s = time_s(flag) #生成中英文播报字符。
print(' ', *s, end = '\r') #屏幕打印播报时间。
droid = androidhelper.Android() #安卓助手实例。
droid.ttsSpeak(s[1]) #中文播报。
droid.ttsSpeak(s[0]) #英文播报。
droid = androidhelper.Android() #安卓助手实例。
title = '中英文报时器' #输入窗体标题。
s = '设置报时间隔(分):' #窗体输入提示字符。
#窗体输入。
speaker = droid.dialogGetInput(title, s).result
print('\n'*3) #打印空行。
say_time(int(speaker)) #调用播报
经过这一段时间的调试,作了点优化。(2022-03-12)将现在的代码全部贴在后边。
- 播报不在“0秒”上,用sleep(loacaltime()[5])修正了余秒。
sleep(60 - loacaltime()[5]) # 在此处暂停当前秒数到0秒。
全部代码
#!/sur/bin/nve python
# coding: utf-8
'''
作者:梦幻精灵_cq
QQ:479469838
2022-03-12
'''
import androidhelper #加载安卓助手模块。
from time import localtime, sleep
#加载时间模块的当前时间获取和暂停方法。
def time_s(flag = ''):
'''生成当前时间“时”“分”英文单词字符串'''
nums = {
0: 'zero', 1: 'one', 2: 'two', 3: 'three',
4: 'four', 5: 'five', 6: 'six', 7: 'seven',
8: 'eight', 9: 'nine',10: 'ten', 11: 'eleven',
12: 'twelve', 13: 'thirteen', 14: 'fourteen',
15: 'fifteen', 16: 'sixteen', 17: 'seventeen',
18: 'eighteen', 19: 'nineteen', 20: 'twenty',
30: 'thirty', 40: 'forty', 50: 'fifty'} #报时所用英文单词字典。
t = localtime() #获取当前时间数组。
#数组前三个元素对应“年月日”,接下来是“时分秒”。
# t[3] 是时,t[4] 是分,是 int 类型数值。
def time_s(i):
'''数字对应英文字符生成'''
time_s = nums.get(i) #字典中数字对应英文字符获取。
if time_s is None: #字典中没有的数字英文字符生成。
if i > 50:
time_s = '-'.join([nums.get(50), nums.get(i - 50)])
elif i > 40:
time_s = '-'.join([nums.get(40), nums.get(i - 40)])
elif i > 30:
time_s = '-'.join([nums.get(30), nums.get(i - 30)])
elif i > 20:
time_s = '-'.join([nums.get(20), nums.get(i - 20)])
return time_s #返回生成的英文字符。
if flag.lower() == 'a': #用 str.lower() 忽略大小写输入。
h = t[3] % 12 #传入标识符'A' or 'a' ,12h 播报取模。
else: #默认 24h 播报。
h = t[3]
if t[4] == 0: #整点字符串生成。
return f"{time_s(h)} o'clock", \
f'现在是{h}点整' #返回中英文整点字符。
else: #报时字符串生成。
return f'{time_s(h)} {time_s(t[4])}', \
f'现在是{h}点{t[4]}分' #返回中英文字符。
def say_time(n = 30, flag = ''):
'''中英文报时,默认30分钟播报一次'''
sleep(60 - localtime()[5]) # 消除秒零头
while True: #死循环播报。
print(' ' * 42, end = '\r') #屏幕打印空格清除播报时间字符串。
s = time_s(flag) #生成中英文播报字符。
print(' ', *s, end = '\r') #屏幕打印播报时间。
droid = androidhelper.Android() #安卓助手实例。
droid.ttsSpeak(s[1]) #中文播报。
droid.ttsSpeak(s[0]) #英文播报。
sleep(n*60)
droid = androidhelper.Android() #安卓助手实例。
title = '中英文报时器' #输入窗体标题。
s = '设置报时间隔(1~60分钟):' #窗体输入提示字符。
#窗体输入。
period = droid.dialogGetInput(title, s).result
if period == '':
period = 30
print('\n'*3) #打印空行。
say_time(int(period)) #调用播报
参考文章:
我的HOT博:
- “快乐数”判断(1177阅读)
- 罗马数字转换器(构造元素取模)(1877阅读)
- 罗马数字(转换器|罗生成器)(2451阅读)
- Hot:神奇代码让QQ群昵称色变(7161阅读)
- 斐波那契数列(递归| for )(2418阅读)
- 排序数组元素的重复起止(1208阅读)
- 柱状图中最大矩形(1615阅读)
- 电话拨号键盘字母组合(1236阅读)
- 密码强度检测器(1684阅读)
- 求列表平衡点(1722阅读)
- 字符串统计(2656阅读)
- Hot:尼姆游戏(聪明版首发)(3264阅读) 尼姆游戏(优化版)(839阅读)
推荐条件 点阅破千
Python 入门指南【Python 3.6.3】
好文力荐:
回首页
精品文章:
- 好文力荐:《python 完全自学教程》书稿连载
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
CSDN实用技巧博文: