zoukankan      html  css  js  c++  java
  • 031 实例7-七段数码管绘制

    一、"七段数码管绘制"问题分析

    1.1 问题分析

    七段数码管

    031-实例7-七段数码管绘制-01.jpg?x-oss-process=style/watermark

    • 需求:用程序绘制七段数码管,似乎很有趣
    • 该怎么做呢?

    turtle绘图体系 --> 七段数码管绘制

    1.2 七段数码管绘制时间

    031-实例7-七段数码管绘制-02.jpg?x-oss-process=style/watermark

    二、"七段数码管绘制"实例讲解(上)

    2.1 基本思路

    • 步骤1:绘制单个数字对应的数码管
    • 步骤2:获得一串数字,绘制对应的数码管
    • 步骤3:获得当前系统时间,绘制对应的数码管

    2.2 步骤1

    步骤1: 绘制单个数码管

    • 七段数码管由7个基本线条组成
    • 七段数码管可以有固定顺序
    • 不同数字显示不同的线条

    031-实例7-七段数码管绘制-03.jpg?x-oss-process=style/watermark

    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)  # 为绘制后续数字确定位置
    

    2.3 步骤2

    步骤2: 获取一段数字,绘制多个数码管

    031-实例7-七段数码管绘制-04.jpg?x-oss-process=style/watermark

    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)  # 为绘制后续数字确定位置
    
    
    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('20181010')
        turtle.hideturtle()
        turtle.done()
    
    
    main()
    

    三、"七段数码管绘制"实例讲解(下)

    3.1 绘制漂亮的七段数码管

    • 增加七段数码管之间线条间隔

    031-实例7-七段数码管绘制-05.jpg?x-oss-process=style/watermark

    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):  # 根据数字绘制七段数码管
        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('20181010')
        turtle.hideturtle()
        turtle.done()
    
    
    main()
    

    3.2 步骤3

    步骤3:获得当前系统时间,绘制对应的数码管

    • 使用time库获得系统当前时间
    • 增加年月日标记
    • 年月日颜色不同
    import turtle, 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):  # 根据数字绘制七段数码管
        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):  #data为日期,格式为 '%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:
                drawDigit(eval(i))
    
    
    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()
    

    031-实例7-七段数码管绘制-06.jpg?x-oss-process=style/watermark

    四、"七段数码管绘制"举一反

    4.1 理解方法思维

    • 模块化思维:确定模块接口,封装功能
    • 规则化思维:抽象过程为规则,计算机自动执行
    • 化繁为简:将大功能变为小功能组合,分而治之

    4.2 应用问题的扩展

    • 绘制带小数点的七段数码管
    • 带刷新的时间倒计时效果
    • 绘制高级的数码管

    031-实例7-七段数码管绘制-07.jpg?x-oss-process=style/watermark

  • 相关阅读:
    iOS BUG整理-记录我近期视频开发遇到的问题
    iOS 翻译-UIWebView的基本简介-官方文档翻译
    iOS 翻译-Xcode使用-文档翻译
    4.redis设计与实现--跳跃表
    3.redis设计与实现--字典
    2.redis设计与实现--链表
    1.redis设计与实现--简单动态字符串
    12.编码问题讨论
    11.nginx upload module + python django 后台 实现视频上传与切片
    10.nginx+ffmpeg上搭建HLS切片
  • 原文地址:https://www.cnblogs.com/nickchen121/p/11190787.html
Copyright © 2011-2022 走看看