-需求:用程序绘制七段数码管
-该怎么做?
turtle绘图体系 ----> 七段数码管绘制
基本思路:
-步骤一:绘制单个数字对应的数码管
-步骤二:获得一串数字,绘制对应的数码管
-步骤三:获得当前系统时间,绘制对应的数码管
import turtle
def drawLine(draw): #绘制单段数码管
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
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) #为绘制后续数字确定位置
根据参数digit来决定如何绘制对应的数字,参数digit是一个数字,取值范围是0~9,然后我们判断当前给的整数是几,如果你给的整数是8,那么你的每一条线段都要被真实绘制,如果给的整数是0,那你的第一条线段就不需要被绘制。
import turtle
def drawLine(draw): #绘制单段数码管。定义了一个函数drawLine(),用于绘制单段数码管。如果draw为True,则将画笔降下(pendown),否则将画笔抬起(penup)。然后向前移动40个像素(fd(40)),再右转90度(right(90))。
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管。定义了一个函数drawDigit(),用于根据给定的数字绘制七段数码管。根据不同的数字,通过调用drawLine()函数来绘制对应的数码管段。在绘制完每个数字后,画笔移动到下一个数字的起始位置。
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False) # 绘制第1段数码管,对应数字2、3、4、5、6、8、9
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False) # 绘制第2段数码管,对应数字0、1、3、4、5、6、7、8、9
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False) # 绘制第3段数码管,对应数字0、2、3、5、6、8、9
drawLine(True) if digit in [0,2,6,8] else drawLine(False) # 绘制第4段数码管,对应数字0、2、6、8
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False) # 绘制第5段数码管,对应数字0、4、5、6、8、9
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False) # 绘制第6段数码管,对应数字0、2、3、5、6、7、8、9
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False) # 绘制第7段数码管,对应数字0、1、2、3、4、7、8、9
turtle.left(180)
turtle.penup() #为绘制后续数字确定位置
turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字。定义了一个函数drawDate(),用于根据给定的日期字符串绘制相应的数字。它遍历日期字符串中的每个字符,并将字符转换为数字,并调用drawDigit()函数绘制对应的数字。
for i in date:
drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main(): #设置一些初始值。定义了一个主函数main(),在这个函数中设置了绘制窗口的大小(setup()),将画笔抬起(penup()),向左移动300个像素(fd(-300)),设置画笔的大小为5个像素(pensize(5)),调用drawDate()函数绘制日期字符串对应的数字,隐藏海龟图标(hideturtle()),最后调用turtle模块的done()函数以结束程序。
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20181010')
turtle.hideturtle()
turtle.done()
main()
深入讲解
基本思路
-步骤1:绘制单个数字对应的数码管
-步骤2:获得一串数字,绘制对应的数码管
-步骤3:获得当前系统时间,绘制对应的数码管
-使用time库获得系统当前时间
-增加年月日标记
-年月日颜色不同
绘制漂亮的七段数码管
-增加七段数码管之间线条间隔
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)
def drawDigit(digit): #根据数字绘制七段数码管。定义了一个函数drawDigit(),用于根据给定的数字绘制七段数码管。根据不同的数字,通过调用drawLine()函数来绘制对应的数码管段。在绘制完每个数字后,画笔移动到下一个数字的起始位置。
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False) # 绘制第1段数码管,对应数字2、3、4、5、6、8、9
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False) # 绘制第2段数码管,对应数字0、1、3、4、5、6、7、8、9
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False) # 绘制第3段数码管,对应数字0、2、3、5、6、8、9
drawLine(True) if digit in [0,2,6,8] else drawLine(False) # 绘制第4段数码管,对应数字0、2、6、8
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False) # 绘制第5段数码管,对应数字0、4、5、6、8、9
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False) # 绘制第6段数码管,对应数字0、2、3、5、6、7、8、9
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False) # 绘制第7段数码管,对应数字0、1、2、3、4、7、8、9
turtle.left(180)
turtle.penup() #为绘制后续数字确定位置
turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字。定义了一个函数drawDate(),用于根据给定的日期字符串绘制相应的数字。它遍历日期字符串中的每个字符,并将字符转换为数字,并调用drawDigit()函数绘制对应的数字。
for i in date:
drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main(): #设置一些初始值。定义了一个主函数main(),在这个函数中设置了绘制窗口的大小(setup()),将画笔抬起(penup()),向左移动300个像素(fd(-300)),设置画笔的大小为5个像素(pensize(5)),调用drawDate()函数绘制日期字符串对应的数字,隐藏海龟图标(hideturtle()),最后调用turtle模块的done()函数以结束程序。
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20181010')
turtle.hideturtle()
turtle.done()
main()
import turtle,time
...略
def drawDate(date): #date为日期,格式为'%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:
drawDight(eval(i))
def main():
...(略)
import turtle
import 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): # 获得要输出的数字
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)) # 通过eval()函数将数字变为整数
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()
turtle.done()
main()
举一反三
理解思维方法
-模块化思维:确定模块接口,封装功能
-规则化思维:抽象过程为规则,计算机自动执行
-化繁为简:将大功能变为小功能,分而治之
应用问题扩展
-绘制带小数点的七段数码管
-带刷新的时间倒计时效果
-绘制高级的数码管