咱们有学习中国大学MOOC嵩天老师的小伙伴吗,在我学习到七段数码管时就想过能不能使它更智能,更加接近咱们日常生活中的电子时钟一样运作呢,甚至能查看我们所在地区的时间,超越咱们生活中一般的电子时钟,让我们带着这份好奇,一起学习吧。
基于简单的七段数码管进行改进,使得它具有可选择时区,就像生活中的电子时钟一样可更新时间,最后再根据自己的喜好还可以添加自己喜欢的图片(封面图片即时钟背景取自湖南农业大学“湘农青年”公众号)。
一、知识准备:pyhton基础知识,使用pip安装第三方库pytz以及它的使用方法,turtle作图能力,time、datetime库的运用。
二、理解数码管的绘制流程,这里给出一种方法,引用嵩天老师的方法,按照这个逻辑,大家也能通过改变起点、方向想出专属自己的流程,此博客重在分享创意,对七段数码管的逻辑不做过多说明。
三、引用所需要的库
import turtle as t #引用turtle库作图
import time as ti #引用time库对时间进行处理
import datetime as dt #引用datetime库获取时间
import pytz as p #引用pytz库对时区进行转换
四、做出程序框架
#此模块准备画布以及图片
def background(area):
#gap使得所画线段更有数码感
def drawGap():
#简单的画直线与改变方向
def drawLine(draw):
#根据数字特征画出数字
def drawDigit(digit):
#画出数字还不够,还需要在画出每段数字后写出它所对应的年月日时分秒
def drawDate(date):
#主函数
def main(num,flag):
#这是为了能够通过一次运行就可以查看所有不同时区的时间,而写出的对mian()函数的循环
def xunhuan(num,mode):
五、完整代码:
import turtle as t #引用turtle库作图
import time as ti #引用time库对时间进行处理
import datetime as dt #引用datetime库获取时间
import pytz as p #引用pytz库对时区进行转换
def background(area): #设置绘图窗口使得它在不同主题颜色的环境下均以黑色作为背景,并且能够让打印出城市名称
window=t.Screen()
window.bgcolor('black')
window.bgpic('D:\python\laboratory\laboratory\pic.png')
window.setup(1080,200)
window.title('{}标准时间'.format(area))
def drawGap(): #使得线条有数码感(参考中国大学mooc嵩天老师的python教程)
t.penup()
t.fd(5)
def drawLine(draw): #画线条(参考中国大学mooc嵩天老师的python教程)
t.pendown() if draw else t.penup()
t.fd(40)
drawGap()
t.right(90)
def drawDigit(digit): #画出不同数字(参考中国大学mooc嵩天老师的python教程并做出了改良)
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
t.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
t.left(180)
t.penup()
t.fd(20)
def drawDate(date): #传入参数date为一个字符串,根据字符串‘%Y+%m-%d*%H/%M:%S?’判断该作图,还输出文字信息(年、月、日、时、分、秒)
t.pencolor('cyan')
for i in date:
if i=='+':
t.pencolor('white')
t.write('年',font=('Arial',18,'normal'))
t.pencolor('cyan')
t.fd(40)
elif i=='-':
t.pencolor('white')
t.write('月',font=('Arial',18,'normal'))
t.pencolor('cyan')
t.fd(40)
elif i=='*':
t.pencolor('white')
t.write('日',font=('Arial',18,'normal'))
t.pencolor('cyan')
t.fd(40)
elif i=='/':
t.pencolor('white')
t.write('时',font=('Arial',18,'normal'))
t.pencolor('cyan')
t.fd(40)
elif i==':':
t.pencolor('white')
t.write('分',font=('Arial',18,'normal'))
t.pencolor('cyan')
t.fd(40)
elif i=='?':
t.pencolor('white')
t.write('秒',font=('Arial',18,'normal'))
else:
drawDigit(eval(i))
def main(num,flag):
t.penup()
t.fd(-500)
t.pensize(4)
t.hideturtle()
if flag==1: #flag参数起标记作用,判断该次作图是否为第一次,是则按步骤将数码管画出来
t.speed(0)
else: #否则直接输出结果
t.tracer(0,10)
tz=p.timezone(timezone[num])
time=dt.datetime.now(tz)
strf=time.strftime('%Y+%m-%d*%H/%M:%S?')
drawDate(strf[2:])
ti.sleep(1)
t.done
def xunhuan(num,mode): #循环主函数,便于在选择的第一个城市时间输出(会输出30次,对应下面的for循环)完成后,选择其他城市(一共有15个城市参考pyta库,可增减)
flag=1
if mode=='b':
main(num,flag)
else:
main(0,flag)
flag-=1
if mode=='b':
for i in range(30): #b模式下每个时区只会数30个数,但可以在数完后选择其他时区
t.clear()
t.home()
main(num,flag)
if i==1:
t.clear()
t.home()
else:
for i in range(3600): #a和c模式下只会显示北京时间或其他地区时间,并数1个小时
t.clear()
t.home()
main(num,flag)
if i==1:
t.clear()
t.home()
mode=input('''请选择您所需要的时钟模式(输入字母序号即可):
a.北京标准时间
b.多时区模式
c.其他单时区
''')
area=['北京:Asia/Shanghai','伦敦:Europe/London','纽约:America/New_York','东京:Asia/Tokyo','巴黎:Europe/Paris','香港:Asia/Hong_Kong','悉尼:Australia/Sydney','新德里:Asia/Kolkata','迪拜:Asia/Dubai','新加坡:Asia/Singapore','莫斯科:Europe/Moscow','柏林:Europe/Berlin','罗马:Europe/Rome','圣保罗:America/Sao_Paulo','洛杉矶:America/Los_Angeles']
timezone=['Asia/Shanghai','Europe/London','America/New_York','Asia/Tokyo','Europe/Paris','Asia/Hong_Kong','Australia/Sydney','Asia/Kolkata','Asia/Dubai','Asia/Singapore','Europe/Moscow','Europe/Berlin','Europe/Rome','America/Sao_Paulo','America/Los_Angeles']
if mode=='b':
num=int(input('''以下是一些世界主要城市,请选择您需要查看的地区时间(输入序号即可):
0.北京:Asia/Shanghai
1.伦敦:Europe/London
2.纽约:America/New_York
3.东京:Asia/Tokyo
4.巴黎:Europe/Paris
5.香港:Asia/Hong_Kong
6.悉尼:Australia/Sydney
7.新德里:Asia/Kolkata
8.迪拜:Asia/Dubai
9.新加坡:Asia/Singapore
10.莫斯科:Europe/Moscow
11.柏林:Europe/Berlin
12.罗马:Europe/Rome
13.圣保罗:America/Sao_Paulo
14.洛杉矶:America/Los_Angeles
'''))
if num>14: #这个if语句可以避免前面的input因为操作失误使得输入错误而产生运行错误
num=int(input())
for i in range(15):
if i!=0:
num=int(input())
background(area[num])
xunhuan(num,mode)
t.clear()
t.home()
elif mode=='a':
background(area[0])
xunhuan(0,mode)
else:
num=int(input('''以下是一些世界主要城市,请选择您需要查看的地区时间(输入序号即可):
0.北京:Asia/Shanghai
1.伦敦:Europe/London
2.纽约:America/New_York
3.东京:Asia/Tokyo
4.巴黎:Europe/Paris
5.香港:Asia/Hong_Kong
6.悉尼:Australia/Sydney
7.新德里:Asia/Kolkata
8.迪拜:Asia/Dubai
9.新加坡:Asia/Singapore
10.莫斯科:Europe/Moscow
11.柏林:Europe/Berlin
12.罗马:Europe/Rome
13.圣保罗:America/Sao_Paulo
14.洛杉矶:America/Los_Angeles
'''))
background(area[num])
xunhuan(num,mode)
运行效果:
有a、b、c三个功能哦
右上角显示时区, 这里的时钟在第一次作完图后可以一秒一秒的运作而不会重新完整的绘制一遍,在a、c功能里时钟可以连续运作24个小时,b功能里选定一个时区后每一个只会数30个数,数完它会停止运作,这时咱们可以直接再选择其他时区而不用退出程序。