一、问题分析

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

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

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

python数码管时分秒 python绘制数码管_数码管

二、基本思路

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

python数码管时分秒 python绘制数码管_ide_02


我们改动上述代码,增加一个间隔函数:

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库的两个函数:

python数码管时分秒 python绘制数码管_数码管_03


python数码管时分秒 python绘制数码管_数码管_04


还有turtle库的一个turtle.write()函数:

python数码管时分秒 python绘制数码管_python_05


经过改良的代码如下:

#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库的介绍,非常适合新手。
绘制数码管的内容大体如此,你学到了吗