05 七段数码管的实现

社会主义新天地 提交于 2019-12-03 02:23:29

练习:七段数码管的实现。知识点:turtle库的使用

实现思路:

  1. 单个数字数码管的绘制实现

  2. 多个数字数码管的绘制实现

  3. 根据当前系统时间绘制数码管

那七段数码管的样子是什么样呢,咱来看图1分析下

图1:七段代码管

这个图就是七段数码管(话说,我只看过电路图里有这玩意儿,坚定了我要学python的信念,啥都能玩儿啊)

经过画图论证,发现以下笔画线路(图2),画笔可以一笔到位(也就是笔画线路不重复)。当然了,这个笔画线路是从左往右实现的(要是你想从右往左也是可以的,不过咱写字习惯从左往右)。

图2:图2

知识点:

数码管的绘制需要引用[turtle]库,那么,turtle库是干啥的呢?

据我们讲师的解释是【入门级的图形函数绘制库】,直白的说,就是使用该类库进行程序绘图。

我的理解吧,turtle库就相当于咱们养了一只小海龟,闲着无聊了,指挥它在沙滩上作画(莫名有点装13的感觉,我只是个入门级的小白,请各位大佬不仅手下留情,更要嘴下留情啊)。

turtle常用的知识点有啥(目前我还不清楚哪些是函数,哪些是属性,后期修改)

代码实现,咱们以数字3来示例:

  • 单个数字数码管的绘制

导入turtle库

import turtle

创建一个‘海龟’画笔对象,定义画笔的属性,先定义画笔的样式和绘制速度

t = turtle.Pen()
t.shape("turtle")   # 画笔样式,默认是箭头→,这里设置成小海龟,个人喜好
t.speed(3)          # 画笔绘制速度,0-9,0:速度最慢,依次递增,9的速度最快

根据图2来看,3要实现的笔画有1,2,3,6,7。定义一个画数字的方法

# 是否落笔,画出内容
def drawLine(flag):
    if flag:
        t.down()    # 落笔
    else:
        t.up()      # 抬笔
    t.fd(40)        # 画40px的线条
    t.right(90)     # 下一笔,画笔方向沿水平方向顺时针旋转90°再继续画。顺时针旋转角度使用right()

# 绘制数字
def drawDight(num):
    # 笔画1 存在的数字
    drawLine(True) if num in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    # 笔画2 存在的数字
    drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    # 笔画3 存在的数字
    drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    # 笔画4 存在的数字
    drawLine(True) if num in [0, 2, 6, 8] else drawLine(False)
    # 笔画4结束后,可以发现画笔的方向指向水平方向右侧,但是笔画5的方向是水平向上
    # 这时画笔需要沿水平方向逆时针旋转90°,逆时针旋转,使用left()
    t.left(90)
    # 笔画5 存在的数字
    drawLine(True) if num in [4, 5, 6, 8, 9, 0] else drawLine(False)
    # 笔画6 存在的数字
    drawLine(True) if num in [2, 3, 5, 6, 7, 8, 9, 0] else drawLine(False)
    # 笔画7 存在的数字
    drawLine(True) if num in [1, 2, 3, 4, 7, 8, 9, 0] else drawLine(False)

调用绘制的方法,实现3的数码管

# 我写了一个主函数,来设置画布的大小、画笔颜色以及画笔的大小
def main():
    turtle.setup(500, 400)  # 可以理解画布的大小
    t.pencolor('red')       # 画笔的颜色
    t.pensize(5)            # 画笔的大小
    drawDight(3)

main()
turtle.done()       # 内容绘制完毕后,不关闭窗口

实现后的效果如图(我还没学会怎么制作动态图,待我学会,将动态效果上传上来,暂时就委屈下各位看客了)

  • 多个数字的绘制代码

在单个数字的绘制代码中,修改了绘制数字和主函数的代码,这里就只贴出改动的代码

# 绘制数字
def drawDight(num):
    # 笔画1 存在的数字
    drawLine(True) if num in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    # 笔画2 存在的数字
    drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    # 笔画3 存在的数字
    drawLine(True) if num in [2, 3, 5, 6, 8, 9, 0] else drawLine(False)
    # 笔画4 存在的数字
    drawLine(True) if num in [0, 2, 6, 8] else drawLine(False)
    # 笔画4结束后,可以发现画笔的方向指向水平方向右侧,但是笔画5的方向是水平向上
    # 这时画笔需要沿水平方向逆时针旋转90°,逆时针旋转,使用left()
    t.left(90)
    # 笔画5 存在的数字
    drawLine(True) if num in [4, 5, 6, 8, 9, 0] else drawLine(False)
    # 笔画6 存在的数字
    drawLine(True) if num in [2, 3, 5, 6, 7, 8, 9, 0] else drawLine(False)
    # 笔画7 存在的数字
    drawLine(True) if num in [1, 2, 3, 4, 7, 8, 9, 0] else drawLine(False)
    # 当一个数字画完后,将画笔方向调整为水平向右,并虚画20px,为其他数字的绘制做准备
    t.up()  # 抬笔,虚画
    t.left(180)  # 将画笔方向沿水平方向逆时针调整180°,使画笔方向水平向右
    t.fd(20)  # 将画笔沿水平方向向前行进20px,为其他数字做准备


# 我写了一个主函数,来设置画布的大小、画笔落笔位置、画笔颜色以及画笔的大小
def main():
    turtle.setup(1000, 800)  # 可以理解画布的大小
    t.up()
    t.backward(400)  # 画笔落笔位置
    t.pencolor('red')  # 画笔的颜色
    t.pensize(5)  # 画笔的大小
    t.down()
    data = "20191030"
    for i in data:
        drawDight(eval(i))

实现效果(没有截全屏,空白内容太多了):

  • 根据当前系统时间绘制数码管

从多个数字的绘制效果来看,基本上已经实现了数码管的绘制,但图1中的数字之间是有截断的,并且我想要根据系统时间自动获取时间,完善后的完整代码示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:albert time:2019/10/29
#
import turtle
import time

t = turtle.Pen()
t.shape("turtle")   # 画笔样式,默认是箭头→,这里设置成小海龟,个人喜好
t.speed(9)          # 画笔绘制速度,0-9,0:速度最慢,依次递增,9的速度最快


def drawGap():
    t.up()
    t.fd(5)


# 调整文字位置,使文字居中
def txt_center():
    t.left(180)
    t.fd(40)
    t.right(90)
    t.up()
    t.fd(80)
    t.down()


def drawLine(flag):
    drawGap()
    if flag:
        t.down()
    else:
        t.up()
    t.fd(40)
    drawGap()
    t.right(90)


def drawText():
    t.right(90)
    t.fd(40)


def drawDight(num):
    drawLine(True) if num in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if num in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if num in [0, 2, 6, 8] else drawLine(False)
    t.left(90)
    drawLine(True) if num in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if num in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if num in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    t.up()
    t.left(180)
    t.fd(20)


def get_data(data):
    for i in data:
        if i == '/':
            drawText()
            t.write('年', font=("Arial", 50, "normal"))
            t.pencolor('green')
            txt_center()
        elif i == '-':
            drawText()
            t.write('月', font=("Arial", 50, "normal"))
            t.pencolor('blue')
            txt_center()
        elif i == '+':
            drawText()
            t.write('日', font=("Arial", 50, "normal"))
        else:
            drawDight(eval(i))

# 主函数
def main():
    turtle.setup(1000, 600)
    t.up()
    t.backward(400)
    t.pencolor('red')
    t.pensize(5)
    t.down()
    get_data(time.strftime('%Y/%m-%d+', time.gmtime()))


main()
turtle.done()
七段数码管代码实现

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!