绘制一个时间的七段数码管
七段数码管:https://baike.baidu.com/item/七段数码管
思考:
1. 绘制一条线
2. 绘制七条线,同时规定每条线绘制的先后顺序
3. 根据不同的数字绘制这七条线中的某几条,构成一个数字
4. 传入一个时间,绘制多个数字
5. 获得系统时间,绘制多个数字
6. 获得系统时间,绘制多个数字,添加年月日、颜色等元素
# Drawdigit.py
import turtle
def drawLine(draw): # 绘制单段数码管
turtle.pendown() if draw else turtle.penup()
turtle.forward(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.forward(30) # 未确定后续数字确定位置
def drawDate(date): # 获得要输出的数字
for i in date:
drawDigit(eval(i)) # 通过eval将字符串编程整数
def main():
turtle.setup(800, 300, 200, 200)
turtle.penup()
turtle.forward(-300)
turtle.pensize(8)
drawDate("20181010")
turtle.done()
main()
# Drawdigit.py
import turtle, time
def drawGap():
turtle.penup()
turtle.forward(5)
def drawLine(draw): # 绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.forward(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.forward(20) # 未确定后续数字确定位置
def drawDate(date): # 获得要输出的数字
turtle.pencolor("red")
for i in date:
if i == "-":
turtle.write("年", font=("Arial", 30, "normal"))
turtle.pencolor("green")
turtle.forward(50)
elif i == "=":
turtle.write("月", font=("Arial", 30, "normal"))
turtle.pencolor("blue")
turtle.forward(50)
elif i == "+":
turtle.write("日", font=("Arial", 30, "normal"))
else:
drawDigit(eval(i)) # 通过eval将字符串编程整数
def main():
turtle.setup(900, 300, 200, 200)
turtle.penup()
turtle.forward(-300)
turtle.pensize(8)
drawDate(time.strftime("%Y-%m=%d+", time.gmtime()))
turtle.done()
main()
- 模块化思维:将一个大的功能分成一个个小的功能,确定了每一个模块的接口做好封装。七段数码管的绘制就是一个小的模块,其中的每个小线段的绘制也是一个小的模块,封装好之后,通过定义函数,就可以用函数的名字代表它的功能。定义好功能之后,就可以用这个功能来形成更多的功能。
- 规则化思维:绘制七段数码管的时候,我们并没有根据不同的数据绘制一个具体的形状,而是让程序无论是什么样的数字都走了七条线,只是在走不同线的时候,用参数来控制是真实绘制还是飞过去并不绘制,用这样的方式抽象了绘制七段数码管的一个过程,将这种过程变为一种规则,在规则中用一些参数来控制它,并且由计算机来自动执行。
带刷新的时间倒计时效果:
# Drawdigit.py
import turtle
def drawGap():
turtle.penup()
turtle.forward(10)
def drawLine(draw): # 绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.forward(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.forward(20) # 未确定后续数字确定位置
def drawDate(date): # 获得要输出的数字
turtle.pencolor("red")
for i in reversed(range(date)):
nums = str(i)
for num in nums:
drawDigit(eval(num)) # 通过eval将字符串编程整数
turtle.clear()
width = len(nums)
turtle.forward(-80 * width)
# 画一段长度是40,左右各空10,画完之后前进20,做好准备画下一个数字,回退应退,80
def main():
turtle.setup(600, 300, 200, 200)
turtle.penup()
turtle.forward(-100)
turtle.pensize(15)
turtle.speed("fast")
drawDate(12)
turtle.done()
turtle.hideturtle()
main()
PS. source. python123.io