效果图
如下,就是七段数码管,小时候的计算器,电子手表中经常见,现在也是哈😀,好,今天就用所学习的Python基础结合turtle绘图体系制作出来。
Let‘s go
一.问题分析
- 就用不久前学的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()
效果:
你是我零零碎碎烦躁无趣琐事里,耀眼可爱的存在