细讲用Python绘制数码管显示当前时间

Serwa ·
更新时间:2024-09-20
· 761 次阅读

一、问题分析

①简单地,我们容易想到用turtle库来绘制七段数码管。

②首先我们知道turtle库绘图的原理是:通过代码控制笔刷一笔一笔地绘制线条,最终构成我们的图案。

③比如,我们最终要绘制出这样一个显示当前时间的效果,该怎么用代码实现呢?
在这里插入图片描述

二、基本思路 步骤1:绘制单个数字对应的数码管 步骤2:获得一串数字,绘制对应的数码管 步骤3:获得当前系统时间,绘制对应的数码管 三、实际操作

步骤1: 绘制单个数码管
在这里插入图片描述
如图所示,单个数码管有以下特征:

七段数码管由7个基本线条组成 七段数码管可以有固定顺序 不同数字显示不同的线条
上代码: #SevenDigitsDrawV1.py import turtle def drawLine(draw): #绘制单线段数码管 turtle.pendown() if draw else turtle.penup() #从起点开始,如果该数字需要该条线段构成,则pendown画实线,如果不需要则penup turtle.fd(40) #每条线段的长度为40像素 turtle.right(90) #画完每条线段后右转90度 def drawDigit(digit): #根据数字绘制七段数码管,判断要绘制的数字是否需要该线段构成 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) turtle.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) turtle.left(180) turtle.penup() #为绘制后续数字确定位置 相当于平时我们写字抬手移动一点距离继续写另外一个字 turtle.fd(20) #为绘制后续数字确定位置 def drawDate(date): #获得要输出的数字 for i in date: #遍历输入的字符串 drawDigit(eval(i)) #通过eval()函数将数字字符变为整数 def main(): turtle.setup(800,350,200,200) #构建一个绘图的窗体 turtle.penup() #笔起 turtle.fd(-300) #从中间向左方移动300像素,和平时我们写字找好位置是一样的 turtle.pensize(5) #笔刷的尺寸 drawDate("2020321") turtle.hideturtle() #隐藏画笔 turtle.done() main()

值得注意的是,上述代码都是函数包裹,函数嵌套函数,层层相扣。

步骤2:绘制相对美观的数码管
我们运行上面的代码,发现每条线段之间都是紧挨着的,和我们平时见的数码管相较之下不美观。所以我们需要:

在这里插入图片描述
我们改动上述代码,增加一个间隔函数:

def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5)

并修改单线段绘制函数:

def drawLine(draw): #绘制单线段数码管 drawGap() turtle.pendown() if draw else turtle.penup() turtle.fd(40) drawGap() turtle.right(90)

如此,便能达到上图效果。

步骤3:获得当前系统时间,绘制对应的数码管

- 使用time库获得系统当前时间 - 增加年月日标记 - 年月日颜色不同

首先我要介绍一下time库的两个函数:
在这里插入图片描述
在这里插入图片描述
还有turtle库的一个turtle.write()函数:
在这里插入图片描述
经过改良的代码如下:

#SevenDigitsDrawV1.py import turtle, time def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(draw): #绘制单线段数码管 drawGap() turtle.pendown() if draw else turtle.penup() turtle.fd(40) drawGap() turtle.right(90) def drawDigit(digit): #根据数字绘制七段数码管 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) turtle.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) turtle.left(180) turtle.penup() #为绘制后续数字确定位置 turtle.fd(20) #为绘制后续数字确定位置 def drawDate(date): #获得要输出的数字,dae为日期,格式为'%Y-%m=%d+' turtle.pencolor("red") #调笔刷颜色 for i in date: if i == '-': turtle.write('年',font=("Arial",18,"normal")) #写字函数 turtle.pencolor("green") turtle.fd(40) elif i == '=': turtle.write('月',font=("Arial",18,"normal")) turtle.pencolor("blue") turtle.fd(40) elif i == '+': turtle.write('日',font=("Arial",18,"normal")) else: drawDigit(eval(i)) def main(): turtle.setup(800,350,200,200) turtle.penup() turtle.fd(-300) turtle.pensize(5) drawDate(time.strftime('%Y-%m=%d+',time.gmtime())) #将读到的系统时间转换成定义的模板格式 turtle.hideturtle() main()

其实time库的作用还有很多,详情可以查看我的另一篇关于time库的介绍,非常适合新手。
绘制数码管的内容大体如此,你学到了吗


作者:王保保丶



数码管 用python 当前时间 Python 数码

需要 登录 后方可回复, 如果你还没有账号请 注册新账号