Python项目实践:绘制七段数码管

绘制一个时间的七段数码管
七段数码管:https://baike.baidu.com/item/七段数码管
Python项目实践:绘制七段数码管_第1张图片
Python项目实践:绘制七段数码管_第2张图片
Python项目实践:绘制七段数码管_第3张图片
Python项目实践:绘制七段数码管_第4张图片
Python项目实践:绘制七段数码管_第5张图片
思考:
1. 绘制一条线
2. 绘制七条线,同时规定每条线绘制的先后顺序
3. 根据不同的数字绘制这七条线中的某几条,构成一个数字
4. 传入一个时间,绘制多个数字
5. 获得系统时间,绘制多个数字
6. 获得系统时间,绘制多个数字,添加年月日、颜色等元素

  • 七段数码管是由七个基本线条构成的,所以首先要能够绘制这七个基本线条。可以看到七段数码管的七个线条是有固定顺序的,它构成了一个数字8的形状,我们可以从左边的一个位置开始,将它们逐一编号,形成一个行动的序列,这样的一个行动序列可以覆盖这七条线段。在这七段线条中不同的线条是否被绘制就能形成不同的数字。
  • 通过函数将功能做一个分割,定义一个函数drawLine,这个函数的作用就是画一条线。画一条线又分两种情况,是真实地画一条线,还是让海龟移飞过去并不画线,可以通过一个变量draw来控制,作为函数drawLine的参数。如果draw是真值,就让画笔落下,如果不是,就让画笔抬起来飞过去
  • 如果绘制中不加判断,调用drawLine,每一条线都会被绘制出来,绘制的结果就是一个数字8。可以设计一个函数drawDigit,根据参数digit来决定如何绘制对应的数字,digit取值范围为0~9的数字,判断当前给的整数是几,如果给出的数字是digit=8,那么每一条线段都要被真实绘制,如果给出的数字是digit=0,那么第一条线就不需要被真实绘制
  • 通过给出一个字符串时间,将字符串中的每个数字取出赋值给digit,让digit根据确定的规则绘制线段
# 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()

Python项目实践:绘制七段数码管_第6张图片
Python项目实践:绘制七段数码管_第7张图片
Python项目实践:绘制七段数码管_第8张图片

# 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()

Python项目实践:绘制七段数码管_第9张图片
Python项目实践:绘制七段数码管_第10张图片
- 模块化思维:将一个大的功能分成一个个小的功能,确定了每一个模块的接口做好封装。七段数码管的绘制就是一个小的模块,其中的每个小线段的绘制也是一个小的模块,封装好之后,通过定义函数,就可以用函数的名字代表它的功能。定义好功能之后,就可以用这个功能来形成更多的功能。
- 规则化思维绘制七段数码管的时候,我们并没有根据不同的数据绘制一个具体的形状,而是让程序无论是什么样的数字都走了七条线,只是在走不同线的时候,用参数来控制是真实绘制还是飞过去并不绘制,用这样的方式抽象了绘制七段数码管的一个过程,将这种过程变为一种规则,在规则中用一些参数来控制它,并且由计算机来自动执行。
Python项目实践:绘制七段数码管_第11张图片
带刷新的时间倒计时效果:

# 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()

Python项目实践:绘制七段数码管_第12张图片
Python项目实践:绘制七段数码管_第13张图片

PS. source. python123.io

你可能感兴趣的:(turtle库,python)