一、问题分析
①简单地,我们容易想到用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库的介绍,非常适合新手。
绘制数码管的内容大体如此,你学到了吗