细讲用Python绘制数码管显示当前时间

一、问题分析

①简单地,我们容易想到用turtle库来绘制七段数码管。

②首先我们知道turtle库绘图的原理是:通过代码控制笔刷一笔一笔地绘制线条,最终构成我们的图案。

③比如,我们最终要绘制出这样一个显示当前时间的效果,该怎么用代码实现呢?
在这里插入图片描述

二、基本思路

  • 步骤1:绘制单个数字对应的数码管
  • 步骤2:获得一串数字,绘制对应的数码管
  • 步骤3:获得当前系统时间,绘制对应的数码管

三、实际操作

  • 步骤1: 绘制单个数码管
    在这里插入图片描述
    如图所示,单个数码管有以下特征:

    • 七段数码管由7个基本线条组成
    • 七段数码管可以有固定顺序
    • 不同数字显示不同的线条
      上代码:
#SevenDigitsDrawV1.py 
import turtle
def drawLine(draw): #绘制单线段数码管
    turtle.pendown() if draw else turtle.penup()  #从起点开始,如果该数字需要该条线段构成,则pendown画实线,如果不需要则penup
    turtle.fd(40)   #每条线段的长度为40像素
    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)            #从中间向左方移动300像素,和平时我们写字找好位置是一样的
    turtle.pensize(5)        #笔刷的尺寸
    drawDate("2020321")      
    turtle.hideturtle()       #隐藏画笔
    turtle.done()
main()

值得注意的是,上述代码都是函数包裹,函数嵌套函数,层层相扣。

  • 步骤2:绘制相对美观的数码管
    我们运行上面的代码,发现每条线段之间都是紧挨着的,和我们平时见的数码管相较之下不美观。所以我们需要:

在这里插入图片描述
我们改动上述代码,增加一个间隔函数:

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)

如此,便能达到上图效果。

  • 步骤3:获得当前系统时间,绘制对应的数码管

      	- 使用time库获得系统当前时间
      	- 增加年月日标记 
      	- 年月日颜色不同
    

首先我要介绍一下time库的两个函数:
在这里插入图片描述
在这里插入图片描述
还有turtle库的一个turtle.write()函数:
在这里插入图片描述
经过改良的代码如下:

#SevenDigitsDrawV1.py 
import turtle, time
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)
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): #获得要输出的数字,dae为日期,格式为'%Y-%m=%d+'
    turtle.pencolor("red")     #调笔刷颜色
    for i in date:
        if i == '-':
            turtle.write('年',font=("Arial",18,"normal"))  #写字函数
            turtle.pencolor("green")
            turtle.fd(40)
        elif i == '=':
            turtle.write('月',font=("Arial",18,"normal"))
            turtle.pencolor("blue")
            turtle.fd(40)
        elif i == '+':
            turtle.write('日',font=("Arial",18,"normal"))
        else:
            drawDigit(eval(i))
def main():
    turtle.setup(800,350,200,200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))  #将读到的系统时间转换成定义的模板格式
    turtle.hideturtle()
main()
    

其实time库的作用还有很多,详情可以查看我的另一篇关于time库的介绍,非常适合新手。
绘制数码管的内容大体如此,你学到了吗

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Python程序,可以绘制数码管来显示当前时间: ```python import time import turtle # 数字字典,每个数字对应的7段数码管的状态 digits = { '0': [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0)], '1': [(1, 0), (1, 1)], '2': [(0, 0), (1, 0), (1, 1), (2, 1), (3, 0)], '3': [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)], '4': [(0, 1), (1, 0), (1, 1), (2, 1)], '5': [(0, 0), (0, 1), (1, 1), (2, 0), (2, 1)], '6': [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)], '7': [(0, 0), (1, 0), (1, 1)], '8': [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0)], '9': [(0, 0), (0, 1), (1, 0), (1, 1), (2, 1)] } # 绘制一个7段数码管 def draw_digit(x, y, digit): turtle.penup() turtle.goto(x, y) turtle.pendown() for seg in digit: turtle.setheading(seg[0] * 90) turtle.forward(seg[1] * 10) # 获取当前时间,格式为HH:MM:SS def get_time(): return time.strftime('%H:%M:%S') # 绘制当前时间的数码管 def draw_time(): turtle.clear() turtle.speed(0) turtle.hideturtle() turtle.pencolor('red') turtle.pensize(5) time_str = get_time() for i in range(len(time_str)): if time_str[i] == ':': continue digit = digits[time_str[i]] draw_digit(-150 + i * 80, 0, digit) # 每隔一秒钟更新一次时间 while True: draw_time() time.sleep(1) ``` 这个程序使用Python的turtle库来绘制数码管。首先,定义了一个字典digits,其中每个数字对应一个7段数码管的状态。然后,定义了一个函数draw_digit,用于绘制一个7段数码管。接着,定义了一个函数get_time,用于获取当前时间。最后,定义了一个循环,每隔一秒钟更新一次时间,调用draw_time函数来绘制当前时间的数码管。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值