七段数码管绘制

简介: 七段数码管绘制

效果图



20210629191253413.gif


文章目录

效果图


一.问题分析


二.编码


三.优化


四.完整代码


如下,就是七段数码管,小时候的计算器,电子手表中经常见,现在也是哈😀,好,今天就用所学习的Python基础结合turtle绘图体系制作出来。


一.问题分析


20210629154311537.png


就用不久前学的turtle绘图体系来试试看

这个七段数码管有7根线条组成,用不同的数来显示线条

先完成一条线,然后完成一串数字,最后获取当前的时间并显示,perfect!!!


二.编码


首先用到turtle库,引入我们的库

import turtle #引入库


使用函数绘制一条线,因为这个大小一样,之后调用函数就0k了,是不是很简单呢。


def drawLine(draw):
    turtle.pendown() if draw else turtle.penup()    #如果画了就放下画笔,否则抬起画笔
    turtle.fd(40)       #四十像素
    turtle.right(90)        #转向右90度,画下一条。


然后我们画出一个数码管,一共有七条线,如上图,所有的数都从一走,drawdigit函数是一个0-9的数字,第一条横除了0,1,7不需要其他都需要,以此类推。


这里要注意画完前4条海龟回到原点了,我们需要让它转头左转90度,继续直线。代码如下:


def drawDigit(digit): #根据数字绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20) #为绘制后续数字确定位置


到这第一步就完成了,下面来完成获取一段数字,绘制出数码管。


我需要一个循环读这一段字符,最后通过主函数main进行封装,有点C的意思。


def drawDate(date): #获得要输出的数字
    for i in date:
        drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate('20210629')
    turtle.hideturtle()
    turtle.done()
main()


效果:


三.优化



数码管间隔的函数定义:


def drawGap(): #绘制数码管间隔
    turtle.penup()
    turtle.fd(5)


调用:


import turtle
def drawGap(): #绘制数码管间隔
    turtle.penup()
    turtle.fd(5)
def drawLine(draw):
    drawGap()
    turtle.pendown() if draw else turtle.penup()    #如果画了就放下画笔,否则抬起画笔
    turtle.fd(40)       #四十像素
    drawGap()
    turtle.right(90)        #转向右90度,画下一条。
def drawDigit(digit): #根据数字绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字
    for i in date:
        drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate('20210629')
    turtle.hideturtle()
    turtle.done()
main()


之前:


20210629172127505.png


优化:


20210629172244689.png


获取系统时间,绘制七段数码管

这里要借助之前学习的库time


使用time库获取当前系统时间


增加年月日


添加颜色


import time


四.完整代码



import turtle as t
import time
def drawGap(): #绘制数码管间隔
    t.penup()
    t.fd(5)
def drawLine(draw):
    drawGap()
    t.pendown() if draw else t.penup()    #如果画了就放下画笔,否则抬起画笔
    t.fd(40)       #四十像素
    drawGap()
    t.right(90)        #转向右90度,画下一条。
def drawDigit(digit): #根据数字绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,6,8] else drawLine(False)
    t.left(90)
    drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
    t.left(180)
    t.penup() #为绘制后续数字确定位置
    t.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字
    t.pencolor("red")
    for i in date:
        if i == '-':
            t.write('年',font=("Arial", 18, "normal"))
            t.pencolor("Lime")
            t.fd(40)
        elif i == '=':
            t.write('月',font=("Arial", 18, "normal"))
            t.pencolor("blue")
            t.fd(40)
        elif i == '+':
            t.write('日',font=("Arial", 18, "normal"))
        else:
            drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
    t.setup(1000, 500, 200, 200)
    t.penup()
    t.fd(-300)
    t.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
    t.hideturtle()
    t.done()
main()


效果:


20210629182048268.png


相关文章
|
NoSQL PHP 数据库
Mindoc 安装与部署
Mindoc 安装与部署
495 0
|
运维 算法 Linux
LVS详解(四)——LVS安装与配置命令
LVS详解(四)——LVS安装与配置命令
425 2
|
安全 数据安全/隐私保护
配置samba的访问密码和用户名
出于安全问题,需要为samba配置密码: $ smbpasswd -a 按提示输入想使用的密码即可 另外 /etc/samba/smb.conf 的 [global] 段必须有: security = user 如此这般,局域网的人访问你的电脑都需要以上命令设置的用户名和密码。
11913 2
|
8月前
|
机器学习/深度学习 自然语言处理 小程序
MiniMax开源超长文本处理神器,魔搭社区助力开发者推理部署
Transfermor架构与生俱来的二次计算复杂度,及其所带来的上下文窗口瓶颈,一直为业界所关注。此前,MiniMax开源了MiniMax-01系列模型,采用创新的线性注意力架构,使得模型能够在100万个token长度的上下文窗口上进行预训练;而在推理时,实现了高效处理全球最长400万token的上下文,是目前最长上下文窗口的20倍。
498 0
|
4月前
|
设计模式 人工智能 自然语言处理
AI生成的Logo版权归谁?
AI 生成 Logo 已成为设计领域的重要应用,广泛用于个人品牌和商业场景。本文分析了 AI 生成 Logo 的版权归属问题,结合国内外法律案例指出,用户若深度参与创作,如精心设计提示词、调整参数等,可主张著作权。同时介绍了多个主流 AI Logo 工具的版权规则,并提供确保版权与商用安全的实用技巧,包括审查授权条款、优化创作过程及商标注册建议。
330 5
|
存储 PyTorch API
NVIDIA Triton系列09-为服务器添加模型
本文介绍了如何为NVIDIA Triton模型仓库添加新模型。通过示例模型`inception_graphdef`的配置文件`config.pbtxt`,详细解释了模型名称、平台/后端名称、模型执行策略、最大批量值、输入输出节点及版本策略等配置项。内容涵盖了模型的基本要素和配置细节,帮助读者更好地理解和使用Triton服务器。
258 0
|
存储 弹性计算 数据可视化
高效、弹性,阿里云工业仿真行业解决方案解读
近日,全球领先的云计算厂商阿里云宣布最新HPC优化实例hpc8ae的正式商业化,该实例依托阿里云自研的「飞天+CIPU」架构体系,搭载第四代AMD EPYC处理器,专为高性能计算应用优化,特别适用于计算流体、有限元分析、多物理场模拟等仿真类应用,CAE场景下的性价比最少提升50%。
Windows中如何查看被占用的端口、杀掉对应的进程
这篇文章介绍了在Windows系统中如何查看被占用的端口号以及如何杀掉占用端口的进程,包括使用命令提示符的`netstat -ano | findstr 端口号`命令查找进程PID,然后通过任务管理器或`taskkill /PID PID号`命令来结束进程。
Windows中如何查看被占用的端口、杀掉对应的进程
|
JavaScript 前端开发 编译器
纯前端如何实现批量dom转图片,并下载成压缩包
【8月更文挑战第22天】纯前端如何实现批量dom转图片,并下载成压缩包
451 0
|
机器学习/深度学习 存储 算法
Pandas中的get_dummies()函数实战应用详解
Pandas中的get_dummies()函数实战应用详解
958 1