七段数码管:https://baike.baidu.com/item/七段数码管 这样的实例在我们的生活中无处不在,而今天,我们学习怎么绘制七段数码管。
用到的内容:前期学过的turtle绘图体系,以及函数的实用
最终效果图:
简要剖析:
我们既然想绘制以上8个七段数码管,那么我们就要先绘制一个七段数码管,想要绘制一个七段数码管,就要先绘制一条线(一个七段数码管是有七条线组成的),像这样我们把一个大问题分解成几个小问题,递进式的解决它们,在以后的问题分析中是十分常见的.
进而考虑绘制一条线:由于数字不同,七条线中的每一条线亮暗也就不同,也就是说一条线有两种状态:亮 暗
我们可以编写一个函数来绘制一条线并且给它一个状态值设定它的状态.
import turtle as t
def drawline(draw):
t.pendown() if draw else t.penup()
t.fd(40)
t.right(90)
绘制线函数:根据状态值draw,来决定pendown(画笔落下)还是penup(画笔抬起),也就是线的两种状态:亮 暗
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190122121442801.png)
反复调用这个函数进而绘制出一个七段数码管:
def drawdigit(digit):#根据数值绘制七段数码管
drawline(True) if dight in [2,3,4,5,6,8,9] else drawline(False)
drawline(True) if dight in [0,1,3,4,5,6,7,8,9] else drawline(False)
drawline(True) if dight in [0,2,3,5,6,8,9] else drawline(False)
drawline(True) if dight in [0,2,6,8] else drawline(False)
t.left(90)
drawline(True) if dight in [0,4,5,6,8,9] else drawline(False)
drawline(True) if dight in [0,2,3,5,6,7,8,9] else drawline(False)
drawline(True) if dight in [2,3,4,5,6,8,9] else drawline(False)
drawline(True) if dight in [0,1,2,3,4,7,8,9] else drawline(False)
t.left(180)
七条线,不同的数字明暗不一样。参数digit是一个数字。
以上完成了第一个七段数码管的绘制,然后我们就要考虑第二个,它的初始位置应该在第一个绘制完成之后,就给出,因此我们在上述代码后面加上:
t.pu()
t.fd(20)
一个数字可以绘制了,那么一串数字也就可以绘制了:
#七段数码管的绘制
import turtle as t
def drawgap():
t.pu()
t.fd(5)
def drawline(draw):#绘制单段数码管
t.pendown() if draw else t.penup()
t.fd(40)
drawgap()
t.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)
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.pu()#为绘制后续数字确定位置
t.fd(20)#为绘制后续数字确定位置
def drawdate(date):#获取日期
for i in date:
drawdigit(eval(i))#通过eval()将数字变成整数
def main(date):
t.setup(800,350,200,200)
t.pu()
t.fd(-300)
t.pensize(5)
t.color("red")
drawdate(date)
t.hideturtle()
t.done()
main(input("请输入一个年月日,与阿拉伯数字形式不加任何标点的形式输入,例:20190122:\n"))
我们可以对这个问题进行优化,比如说,我们之前学习过time库的使用,那么,不防用这个库函数获取系统时间,加上年月日,怎么样?
#七段数码管的绘制
import turtle as t
def drawgap():
t.pu()
t.fd(5)
def drawline(draw):#绘制单段数码管
t.pendown() if draw else t.penup()
t.fd(40)
drawgap()
t.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)
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.pu()#为绘制后续数字确定位置
t.fd(20)#为绘制后续数字确定位置
def drawdate(date):#获取日期
t.pencolor("green")
for i in date:
if i == '年':
t.write('年',font = ("Arial",18,"normal"))
t.pencolor("blue")
t.fd(40)
elif i == "月":
t.write('月',font = ("Arial",18,"normal"))
t.pencolor("yellow")
t.fd(40)
elif i == "日":
t.write('日',font = ("Arial",18,"normal"))
t.pencolor("red")
else:
drawdigit(eval(i))#通过eval()将数字变成整数
def main(date):
t.setup(800,350,200,200)
t.pu()
t.fd(-300)
t.pensize(5)
t.color("red")
drawdate(date)
t.hideturtle()
t.done()
main(input("请输入一个年月日,例:2019年01月22日:\n"))
加上系统时间显示:
#七段数码管的绘制
import turtle as t
import time
def drawgap():
t.pu()
t.fd(5)
def drawline(draw):#绘制单段数码管
t.pendown() if draw else t.penup()
t.fd(40)
drawgap()
t.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)
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.pu()#为绘制后续数字确定位置
t.fd(20)#为绘制后续数字确定位置
def drawdate(date):#获取日期
t.pencolor("green")
for i in date:
if i == '年':
t.write('年',font = ("Arial",18,"normal"))
t.pencolor("blue")
t.fd(40)
elif i == "月":
t.write('月',font = ("Arial",18,"normal"))
t.pencolor("yellow")
t.fd(40)
elif i == "日":
t.write('日',font = ("Arial",18,"normal"))
t.pencolor("red")
else:
drawdigit(eval(i))#通过eval()将数字变成整数
def main(date):
t.setup(1500,650,20,20)
t.pu()
t.fd(-600)
t.pensize(5)
drawdate(time.strftime("%Y年%m月%d日",time.gmtime()))
t.fd(40)
t.color("red")
drawdate(date)
t.hideturtle()
t.done()
main(input("请输入一个年月日,例:2019年01月22日:\n"))
完美!