美文网首页
七段数码管 | Python

七段数码管 | Python

作者: 晏如V5 | 来源:发表于2017-10-31 13:40 被阅读551次

    最近在中国大学MOOC网站,跟着北理工嵩天老师团队,学习《Python语言程序设计》。其中,第5周的课后练习,是要实现一个模拟的七段数码管,并用它显示日期。

    不得不说,老师给的练习指导超有水平,寥寥几句话介绍了七段数码管的原理。读完之后,解题思路也就有了。

    数码管是一种价格便宜、使用简单的发光电子器件,广泛应用在价格较低的电子类产品中,其中,七段数码管最为常用。七段数码管(seven-segment indicator)由7段数码管拼接而成,每段有亮或不亮两种情况,改进型的七段数码管还包括一个小数点位置,如下图所示。

    七段数码管的结构图.png

    我摸索了几天,交作业如下:

    输出结果如下图

    七段数码管_400.png

    源代码

    # exercise05.py
    # 七段数码管
    
    # 2017年10月27日,第一版。 helen.chan@163.com
    # 2017年10月31日,第2版。加入颜色参数。 helen.chan@163.com
    # 2017年10月31日,第3版。将要显示的1~F作为参数传给函数,方便调用。helen.chan@163.com
    # 2017年10月31日,第3.1版。输入为字符串时,转为数码管输出。helen.chan@163.com
    # 2017年10月31日,第3.2版。取当前系统时间,转为数码管输出。helen.chan@163.com
    # 2017年10月31日,第4版。实现数码管变色的效果。helen.chan@163.com
    
    # 相关常量定义
    # INDICATOR_X为横向管的长度,INDICATOR_Y为纵向管的长度,INDICATOR_W为粗细;
    # INDICATOR_CELL_WIDE为容纳字符的格子的宽度; INDICATOR_CELL_HEIGHT 为容纳字符的格子的高度。
    # DOT_SIZE是小数点的大小,DOT_TO_LEFT为小数点到左边的距离,DOT_TO_HEAD为小数点到上边的距离。
    # LEFT左边距, HEADING上边距, RIGHT右边距, BOTTOM下边距
    # COLOR画笔颜色
    
    
    import turtle
    import datetime
    
    INDICATOR_X = 30
    INDICATOR_Y = 40
    INDICATOR_W = 2
    
    INDICATOR_CELL_HEIGHT = 90
    INDICATOR_CELL_WIDE = 50
    
    DOT_SIZE = 5
    DOT_TO_LEFT = 40
    DOT_TO_HEAD = 75
    
    LEFT = 100
    HEADING = 100
    RIGHT = 100
    BOTTOM = 100
    
    COLOR = "pink"                      #我真的是粉红控,^_^
    
    turtle.pensize(INDICATOR_W)
    turtle.color(COLOR)
    turtle.hideturtle()                 #隐藏画笔的形状,默认是箭头       
    
    # 点亮a到g段数码管和小数点灯的函数
    def _show_a(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(0)
        turtle.goto(x, y)
        turtle.pendown()
        turtle.forward(INDICATOR_X)
        turtle.penup()
        
    def _show_b(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(270)
        turtle.goto(x + INDICATOR_X, y)
        turtle.pendown()
        turtle.forward(INDICATOR_Y)
        turtle.penup()
        
    def _show_c(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(270)
        turtle.goto(x + INDICATOR_X, y - INDICATOR_Y)
        turtle.pendown()
        turtle.forward(INDICATOR_Y)
        turtle.penup()
        
    def _show_d(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(180)
        turtle.goto(x + INDICATOR_X, y - INDICATOR_Y * 2)
        turtle.pendown()
        turtle.forward(INDICATOR_X)
        turtle.penup()
        
    def _show_e(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(90)
        turtle.goto(x, y-INDICATOR_Y*2)
        turtle.pendown()
        turtle.forward(INDICATOR_Y)
        turtle.penup()
    
    def _show_f(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(90)
        turtle.goto(x, y - INDICATOR_Y)
        turtle.pendown()
        turtle.forward(INDICATOR_Y)
        turtle.penup()
        
    def _show_g(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(0)
        turtle.goto(x , y - INDICATOR_Y)
        turtle.pendown()
        turtle.forward(INDICATOR_X)
        turtle.penup()
        
    def _show_dp(color, x, y):
        turtle.color(color)
        turtle.penup()
        turtle.setheading(0)
        turtle.goto(x + DOT_TO_LEFT, y - DOT_TO_HEAD)
        turtle.pendown()
        turtle.dot(DOT_SIZE, color)
        turtle.penup()
    
    
    # 显示0到F的函数
    def show0(color, x, y):
        _show_a(color, x, y)
        _show_b(color, x, y)
        _show_c(color, x, y)
        _show_d(color, x, y)
        _show_e(color, x, y)
        _show_f(color, x, y)
    
    def show1(color, x, y):
        _show_b(color, x, y)
        _show_c(color, x, y)
        
    def show2(color, x, y):
        _show_a(color, x, y)
        _show_b(color, x, y)
        _show_g(color, x, y)
        _show_e(color, x, y)
        _show_d(color, x, y)
    
    def show3(color, x, y):
        _show_a(color, x, y)
        _show_b(color, x, y)
        _show_g(color, x, y)
        _show_c(color, x, y)
        _show_d(color, x, y)
    
    def show4(color, x, y):
        _show_f(color, x, y)
        _show_g(color, x, y)
        _show_b(color, x, y)
        _show_c(color, x, y)
    
    def show5(color, x, y):
        _show_f(color, x, y)
        _show_g(color, x, y)
        _show_c(color, x, y)
        _show_d(color, x, y)
        _show_a(color, x, y)
    
    def show6(color, x, y):
        _show_a(color, x, y)
        _show_f(color, x, y)
        _show_e(color, x, y)
        _show_d(color, x, y)
        _show_c(color, x, y)
        _show_g(color, x, y)
    
    def show7(color, x, y):
        _show_a(color, x, y)
        _show_b(color, x, y)
        _show_c(color, x, y)
        
    def show8(color, x, y):
        _show_a(color, x, y)
        _show_f(color, x, y)
        _show_g(color, x, y)
        _show_c(color, x, y)
        _show_d(color, x, y)
        _show_e(color, x, y)
        _show_b(color, x, y)
        
    def show9(color, x, y):
        _show_a(color, x, y)
        _show_f(color, x, y)
        _show_g(color, x, y)
        _show_b(color, x, y)
        _show_c(color, x, y)
        _show_d(color, x, y)
    
    def showA(color, x, y):
        _show_f(color, x, y)
        _show_e(color, x, y)
        _show_a(color, x, y)
        _show_b(color, x, y)
        _show_c(color, x, y)
        _show_g(color, x, y)
        
    def showB(color, x, y):
        _show_f(color, x, y)
        _show_e(color, x, y)
        _show_g(color, x, y)
        _show_c(color, x, y)
        _show_d(color, x, y)
    
    def showC(color, x, y):
        _show_a(color, x, y)
        _show_f(color, x, y)
        _show_e(color, x, y)
        _show_d(color, x, y)
        
    def showD(color, x, y):
        _show_b(color, x, y)
        _show_c(color, x, y)
        _show_g(color, x, y)
        _show_e(color, x, y)
        _show_d(color, x, y)
    
    def showE(color, x, y):
        _show_a(color, x, y)
        _show_f(color, x, y)
        _show_e(color, x, y)
        _show_g(color, x, y)
        _show_d(color, x, y)
    
    def showF(color, x, y):
        _show_a(color, x, y)
        _show_f(color, x, y)
        _show_e(color, x, y)
        _show_g(color, x, y)
    
    def showdot(color, x, y):       #显示小数点,由于小数点就是由dp那个灯决定的,所以只需调用show_dp()
        _show_dp(color, x, y)
    
        
        
    def show(char, color, x, y):
        #i = -400           #turtle以屏幕中心为原点,所以先向西偏移一些。
        if char == "0": 
            show0(color, x, y)
        elif char == "1":   
            show1(color, x, y)
        elif char == "2":
            show2(color, x, y)
        elif char == "3":
            show3(color, x, y)
        elif char == "4":
            show4(color, x, y)
        elif char == "5":
            show5(color, x, y)
        elif char == "6":
            show6(color, x, y)
        elif char == "7":
            show7(color, x, y)
        elif char == "8":
            show8(color, x, y)
        elif char == "9":
            show9(color, x, y)
        elif char == "a":
            showa(color, x, y)
        elif char == "b":
            showb(color, x, y)
        elif char == "c":
            showc(color, x, y)
        elif char == "d":
            showd(color, x, y)
        elif char == "e":
            showe(color, x, y)
        elif char == "f":
            showf(color, x, y)
        else:
            showdot(color, x, y)
        
        
        
    def main():
        string = datetime.datetime.now().strftime('%Y-%m-%d')       # 我不生产代码,我只是代码的搬运工,:(
        
        # 我调整出来的彩红序列,美美哒
        rainbow = ["red", "orange", "yellow", "springgreen", "cyan", "skyblue", "mediumpurple"]     # 因为前面设计的颜色控制采用的传字符串方式,所以暂用一个颜色序列来实现变色的功能
        
        start = -240
        for i in range(len(string)):
            show(string[i], rainbow[i%len(rainbow)], start + i*50, 0)
    
    
    main()
    
    
    

    后记

    这代码只是一个练习,有很多不漂亮的地方。只能算个人笔记,几点体会写下来备忘:

    1. turtle.home():作用是把画笔移动到原点位置,相当于一个初始化操作
    2. turtle.penup():抬起画笔,不留下轨迹;turtle.pendown():落下画笔,留下轨迹
    3. 程序风格: 常量全大写;内部函数命名用_开头

    相关文章

      网友评论

          本文标题:七段数码管 | Python

          本文链接:https://www.haomeiwen.com/subject/evkbpxtx.html