python实现数码管绘制的自我练习

非常高兴可以第一次在csdn上面完成我的第一个博客

作为python初学者,我开始完成第一个有关于引用库的第一次练习

数码管的绘制:任务功能拆分

首先我们要对于这个任务进行功能拆分,怎样进行数码管绘制时间呢?

  1. 第一步 ,怎样绘制一段数码管。
  2. 第二部 ,数码管之间的间隔怎么解决?
  3. 怎样完成对于时间的引用。
  4. 编写程序。

所要引用的函数和使用方法

库名 turtle

 import turtle
 turtle.speed(speed)#画笔速度
 turtle.penup()#抬笔
 turtle.pendown()#落笔
 turtle.pensize(pensize)#画笔的粗细程度,可选,输入整数
 turtle.fd(length)#画笔向前运行,距离为length
 turtle.right(angele)#画笔转向(向右边转向),转向度数为:angle
 turtle.pencolor(color)#改变画笔的颜色,在这里可以选择输入
 turtle.hideturtle()#隐藏画笔,画笔实在是太丑了。。。
 turtle.done()#停笔,但是不关闭窗口,少了这个代码执行完毕就会关闭turtle窗口
 
 在这里我一般都把它设置为0,也就是最快
 '''讲实话,python的绘图速度简直太慢了搞成0应该就可以在我睡觉之前运行完成了吧[doge]'''

库名 time

import time 
time.strftime(tpl,ts)
#在这里面有两个参数,第一个参数:tpl. tpl是一段格式化的模板字符串参数,用来定义输出的效果。
#第二个参数 ts 这个是计算机可以识别的时间参数,我们利用time.time()函数来获取。这个函数我们可以这样去理解:我们在tpl这个模板字符串中按模板返回ts的值。
time.gmtime()#获取当前系统的时间,返回一段计算机可以识别的时间。
#返回实例 python idle 环境下操作
>>> time.gmtime()
time.struct_time(tm_year=2020, tm_mon=10, tm_mday=9, tm_hour=14, tm_min=20, tm_sec=41, tm_wday=4, tm_yday=283, tm_isdst=0)

分析程序结构:单个数码管的绘制。

实例8的绘制

我们按 8这个数字来分析
8 这个数字在数码管中我们可以用这几下步骤。

  1. 落笔
  2. 向前走一段像素。
  3. 向右转 90
  4. 重复1~3三个步骤
  5. 重复1~3三个步骤
  6. 重复1~3三个步骤
  7. 向左转90
  8. 重复1~3三个步骤
  9. 重复1~3三个步骤
  10. 重复1~3三个步骤
  11. 重复1~3三个步骤
#代码如下
def drowGap():  #设置一个一个数码管之间的间距
    turtle.penup()
    turtle.fd(5)

def drawLine(draw): #落笔向前走40 再右转
    drowGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drowGap()
    turtle.right(90)
drawLine(True)
drawLine(True)
drawLine(True)
drawLine(True)
turtle.left(90)
drawLine(True)
drawLine(True)
drawLine(True)
drawLine(True)

好了现在我们知道了怎样去完成8 的绘制,来看看怎样绘制其他的数码管呢?

其他数码管的绘制

如果说,绘制8的时候我们在所有的数码管上面都留下了痕迹,那么我们可以这样地理解,绘制9的时候,我们只需要在其中步骤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)  #向左边转向180度
    turtle.penup() #抬笔
    turtle.fd(20) #向前走20像素

这个函数完成了单个数码管数字的绘制。

注意:我们在最后 turtle.fd(20) 是为了使得数码管数字向右平移一段像素,接下来我们每绘制一个数码管数字就会向右平移一段像素,这样的话,我们就会输出十分美观的数码管数字了。

年月日的判断问题

对于年月日,我们可以这样来描述问题,当获得一段已经由 time.strftime() 函数填充完毕的模板字符串的时候,只需要找出其中的标识符,就可以完成对于年,月,日的判断,在这里,我们对于年月日分别用以下符号进行标识。

“-”
“+”
“=”

判断代码如下

def drawDate(date):  #判断年月日
    turtle.pencolor("red")
    for i in date:  
        if i == "-":   #如果出现标识符'-',就会返回“年”汉字
            turtle.write("年", font=("Arial", 18, "normal"))
            turtle.pencolor("green")
            turtle.fd(40)
        elif i == "=":  #如果出现标识符“=”,就会返回“月”汉字
            turtle.pencolor()
            turtle.write("月", font=("Arial", 18, "normal"))
            turtle.fd(40)
        elif i == "+": #如果出现标识符“+“,就会返回”日“汉字
            turtle.write("日", font=("Arial", 18, "normal"))
            turtle.pencolor('blue')
            turtle.fd(40)
        else:  #对于其他的字符串中的元素,我们不做处理,对其进行去引号处理,也就是返回一段数码管。
            drawDigit(eval(i))

开始绘制一段完整的数码管数字——主函数的定义

在这里我们对数码管进行集成化处理

def main():
    turtle.setup(800, 350, 200, 200)#建立起来一个长为800像素,宽为350像素的海龟绘图框,它的位置相对于屏幕坐标为200,200
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+', time.gmtime()))
    turtle.hideturtle()
    turtle.done()

    

所有代码

import turtle
import time #库的引用
turtle.speed(0)

def drowGap():  #设置一个一个数码管之间的间距
    turtle.penup()
    turtle.fd(5)


def drawLine(draw): #落笔向前走40 再右转
    drowGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drowGap()
    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)  #向左边转向180度
    turtle.penup() #抬笔
    turtle.fd(20) #向前走20像素


def drawDate(date):  #判断年月日
    turtle.pencolor("red")
    for i in date:  
        if i == "-":   #如果出现标识符'-',就会返回“年”汉字
            turtle.write("年", font=("Arial", 18, "normal"))
            turtle.pencolor("green")
            turtle.fd(40)
        elif i == "=":  #如果出现标识符“=”,就会返回“月”汉字
            turtle.pencolor()
            turtle.write("月", font=("Arial", 18, "normal"))
            turtle.fd(40)
        elif i == "+": #如果出现标识符“+“,就会返回”日“汉字
            turtle.write("日", font=("Arial", 18, "normal"))
            turtle.pencolor('blue')
            turtle.fd(40)
        else:  #对于其他的字符串中的元素,我们不做处理,对其进行去引号处理,也就是返回一段数码管。
            drawDigit(eval(i))


def main():
    turtle.setup(800, 350, 200, 200)#建立起来一个长为800像素,宽为350像素的海龟绘图框,它的位置相对于屏幕坐标为200,200
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+', time.gmtime()))
    turtle.hideturtle()
    turtle.done()

main()

结尾

很快,工作就全部完成了,
让我们来看看运行结果吧
就是这个样子

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值