中英文报时器(我一直解决不了整数转对应英文单词字符串,这报时器的“残码”可冷放了不少时日)



Python 官网

https://www.python.org/


  这里,才 python 前沿。可惜是英文原版。所以,我要练习英文阅读。🧐🧐


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            ——华罗庚

中英文报时器


  1. 题目
  2. 代码运行效果
  3. 我的思路
  4. 完整代码


题目


  好久以前,想写一个能用英文播放当前时间的报时器,动手写了些代码,但终究不可以完美转化60以内的数字成英文单词。😭
  那些代码就一直“残”那儿了。现在,炼到可以完美数字转英文单词了。才得以写完这个练习。

回首页


代码运行效果

在这里插入图片描述

在这里插入图片描述


回首页


我的思路

  1. 实现目标:分别用中英文播报当前时间,播报间隔可以设定。
  2. 用 time.localtime() 获取当前时间数组,从数组中提取当前小时和分钟数字。
  3. 用英文单词字符-数字对应字典转化数字成英文单词字符串。
  4. 用插值字符串格式化生成中英文播报字符串。
  5. 调用安卓助手语音播报模块播报中英文字符串。
  6. 按设定间隔进行循环播报(默认自启动始,半点播报)。
:时间间隔设置,是调用安卓助手的输入窗体接收输入完成的。

回首页


完整 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博:

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    梦幻精灵_cq

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值