七段数码管 | Python

2017-10-31  本文已影响551人  晏如V5

最近在中国大学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. 程序风格: 常量全大写;内部函数命名用_开头
上一篇 下一篇

猜你喜欢

热点阅读