最近在中国大学MOOC网站,跟着北理工嵩天老师团队,学习《Python语言程序设计》。其中,第5周的课后练习,是要实现一个模拟的七段数码管,并用它显示日期。
不得不说,老师给的练习指导超有水平,寥寥几句话介绍了七段数码管的原理。读完之后,解题思路也就有了。
七段数码管的结构图.png数码管是一种价格便宜、使用简单的发光电子器件,广泛应用在价格较低的电子类产品中,其中,七段数码管最为常用。七段数码管(seven-segment indicator)由7段数码管拼接而成,每段有亮或不亮两种情况,改进型的七段数码管还包括一个小数点位置,如下图所示。
我摸索了几天,交作业如下:
输出结果如下图
七段数码管_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()
后记
这代码只是一个练习,有很多不漂亮的地方。只能算个人笔记,几点体会写下来备忘:
- turtle.home():作用是把画笔移动到原点位置,相当于一个初始化操作
- turtle.penup():抬起画笔,不留下轨迹;turtle.pendown():落下画笔,留下轨迹
- 程序风格: 常量全大写;内部函数命名用_开头
网友评论