效果图
文章目录
效果图
一.问题分析
二.编码
三.优化
四.完整代码
如下,就是七段数码管,小时候的计算器,电子手表中经常见,现在也是哈😀,好,今天就用所学习的Python基础结合turtle绘图体系制作出来。
一.问题分析
就用不久前学的turtle绘图体系来试试看
这个七段数码管有7根线条组成,用不同的数来显示线条
先完成一条线,然后完成一串数字,最后获取当前的时间并显示,perfect!!!
二.编码
首先用到turtle库,引入我们的库
import turtle #引入库
使用函数绘制一条线,因为这个大小一样,之后调用函数就0k了,是不是很简单呢。
def drawLine(draw): turtle.pendown() if draw else turtle.penup() #如果画了就放下画笔,否则抬起画笔 turtle.fd(40) #四十像素 turtle.right(90) #转向右90度,画下一条。
然后我们画出一个数码管,一共有七条线,如上图,所有的数都从一走,drawdigit函数是一个0-9的数字,第一条横除了0,1,7不需要其他都需要,以此类推。
这里要注意画完前4条海龟回到原点了,我们需要让它转头左转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) #为绘制后续数字确定位置
到这第一步就完成了,下面来完成获取一段数字,绘制出数码管。
我需要一个循环读这一段字符,最后通过主函数main进行封装,有点C的意思。
def drawDate(date): #获得要输出的数字 for i in date: drawDigit(eval(i)) #通过eval()函数将数字变为整数 def main(): turtle.setup(800, 350, 200, 200) turtle.penup() turtle.fd(-300) turtle.pensize(5) drawDate('20210629') turtle.hideturtle() turtle.done() main()
效果:
三.优化
数码管间隔的函数定义:
def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5)
调用:
import turtle 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) #转向右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) turtle.pensize(5) drawDate('20210629') turtle.hideturtle() turtle.done() main()
之前:
优化:
获取系统时间,绘制七段数码管
这里要借助之前学习的库time
使用time库获取当前系统时间
增加年月日
添加颜色
import time
四.完整代码
import turtle as t import time def drawGap(): #绘制数码管间隔 t.penup() t.fd(5) def drawLine(draw): drawGap() t.pendown() if draw else t.penup() #如果画了就放下画笔,否则抬起画笔 t.fd(40) #四十像素 drawGap() t.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) 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): #获得要输出的数字 t.pencolor("red") for i in date: if i == '-': t.write('年',font=("Arial", 18, "normal")) t.pencolor("Lime") t.fd(40) elif i == '=': t.write('月',font=("Arial", 18, "normal")) t.pencolor("blue") t.fd(40) elif i == '+': t.write('日',font=("Arial", 18, "normal")) else: drawDigit(eval(i)) #通过eval()函数将数字变为整数 def main(): t.setup(1000, 500, 200, 200) t.penup() t.fd(-300) t.pensize(5) drawDate(time.strftime('%Y-%m=%d+',time.gmtime())) t.hideturtle() t.done() main()
效果: