• 05 七段数码管的实现


    练习:七段数码管的实现。知识点: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()
    七段数码管代码实现
  • 相关阅读:
    java JDBC DAO ORM Domain
    《硅谷钢铁侠-- 埃隆·马斯克的冒险人生》
    在启动MYSQL时出现问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)”
    使用IntelliJ IDEA开发java web
    [django]用日期来查询datetime类型字段
    2020/5/31
    图解排序算法(三)之堆排序
    图解排序算法(二)之希尔排序
    图解排序算法(一)之3种简单排序(选择,冒泡,直接插入)
    Oracle约束(Constraint)详解
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11768054.html
Copyright © 2020-2023  润新知