python 当前时间的前一天_Python小实践——实现系统当前时间的七段数码管的显示...

fd67a7409ff35b627229d756fc342066.png

Hello,大家好,今年这个暑假大家全国各地时不时还爆发着疫情,也不敢出去玩,呆在家里就是surfing the Internet。鉴于大一刚刚结束,上课期间也学习了C语言,就想着暑假自学Python,这也就是题图上的那个小代码的诞生历程。y1s1,这个看上去是不是有点炫酷的亚子。


狠人话不多,先上一个动态的视频,看看效果~

知乎视频​www.zhihu.com

是不是挺好玩的呀~(不要你觉得,我觉得好玩就行♪(^∀^●)ノ


咳咳~言归正传,现在就来讲一波这个代码的实现过程吧

在开始写代码之前,我们要先来分析一下这个问题需要用到的知识,当思路清晰之后,我们再去写代码,可以做到事半功倍的效果。

我们可以把这个工作分成两个大的模块:

  • 为了能在屏幕中画出来数码管的形式,我们需要引入绘图标准库——turtle库
  • 在实现绘图功能之后,我们还需要能够获得系统的时间

我们接下来写代码就从这两方面下手


import turtle
import time

这两行相信即使是编程小白也是可以看懂的,就是引入了两个模块,分别是turtle海龟库和时间库。

Python语言中我们要在开始引入我们需要用到的标准库的时候的语法是:

import<标准库名>

def drawGap():
    turtle.penup()
    turtle.fd(5)

这里定义了一个函数,Python语言中定义函数的格式是:

def <函数名>(<参数>):

<语句块>

我们这个函数是为了绘制数码管之间的间隙,所以命名是drawGap()


在这里先介绍几个turtle库中的常用函数:

turtle.setup(650,350,200,200)

#启动窗口的大小和位置(注意这里参数的数值是指像素)

#(参数:窗口宽度,窗口高度(窗口大小参数),x坐标,y坐标(位置))

turtle.penup()

#海龟飞行 画笔抬起。将海龟从画布上抬起,接下来画笔的移动轨迹不会不会画在画布上

turtle.pendown()

#海龟爬行 画笔放下。将飞起的海龟重新放回画布,这样移动轨迹就留在了画布上

(上面这两个函数是一对函数,分别是抬起和放下,我们要绘制移动轨迹,就要turtle是在画布上爬行,要是不绘制轨迹,就要turtle飞起哦~~~

turtle.fd(k)

#海龟直线前进k个像素

turtle.circle(r,angle)

#海龟从当前位置以半径为r,行走一个angle角度的弧线,其中angle为正数则逆时针行走,负数则顺时针行走

turtle.pensize(d) =turtle.width(d)

#海龟腰围 画笔的宽度为d个像素

ps:与函数width()功能完全一样

turtle.pencolor("purple")

#海龟变色 画笔颜色

'''

pencolor()

参数可以有三种形式

1.颜色字符串 "purple"

2.RGB小数值 0.63,0.13.0.94

3.RGB的元组值 (0.63,0.13.0.94)

系统默认使用0-1的小数值来刻画RGB

.colormode(mode)可以改变小数值或整数值来表示RGB

1.0代表小数值模式

255代表整数值模式

'''

turtle.seth(-40)

#方向控制函数

seth()将海龟当前方向转变成绝对坐标下的角度(就按照我们的平面直角坐标系看就可以了)

此外还有两种海龟坐标转向的方法分别是:

turtlre.left(angle)

turtle.right(angle)

他们的作用就是看着在海龟当前行进方向下左转或右转一个角度。

这三个函数我们可以想象生活中的实例,seth()就像是我们知道的东南西北,不管我们人想那个方向走,这四个方向是不会变的。然后left()和right()就是我们自己行走过程的←和→,这方向是随着我们发生变化的。

好啦,turtle的函数就介绍到这里喽~


我们来看一下数码管怎么画:

e5e5e95cca67b0756454692be54140aa.png

首先要会绘制一条线,一条线包括两端的Gap()段和中间的实线段

def drawLine(draw):
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)

这里就是画线段的函数drawLine()

其中 turtle.pendown() if draw else turtle.penup()是而语句分支结构的紧凑形式,

表达的就是如果draw是True,我们就将turtle放到画布上,如果是False,我们将turtle抬起,那么我们走的路径就不会出现在画布上。

到这一步我们就可以实现七段数码管的任意段数的绘制,下面我们就画各种数字(0-9):

5c0a9535323cff3a82a090138a946b30.png
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)

这个地方需要我们对着各个数字,按照上面那个图片的1-7的顺序来绘制每个数字。

经过上面的三个函数,我们就实现了数字的绘制,我们的第一个任务就完成了,到这可以小小庆祝一波,我们已经完成了50%的工作♪(^∀^●)ノ


今天先到这里了有点小累,明天再继续,我先把源代码奉上:

import turtle
import 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):
    turtle.pencolor("gold") if date[-1]=='@' else turtle.pencolor("red")
    for i in date:
        if i=='-':
            turtle.right(90)
            turtle.fd(18)
            turtle.left(90)
            turtle.write('年',font=("Arial",18,"normal"))
            turtle.pencolor("green")
            turtle.left(90)
            turtle.fd(18)
            turtle.right(90)
            turtle.fd(40)
        elif i=='=':
            turtle.right(90)
            turtle.fd(18)
            turtle.left(90)
            turtle.write('月',font=("Arial",18,"normal"))
            turtle.pencolor("blue")
            turtle.left(90)
            turtle.fd(18)
            turtle.right(90)
            turtle.fd(40)
        elif i== '+':
            turtle.right(90)
            turtle.fd(18)
            turtle.left(90)            
            turtle.write('日',font=("Arial",18,"normal"))
            turtle.pencolor("brown")
            turtle.left(90)
            turtle.fd(18)
            turtle.right(90)
            turtle.fd(40)
        elif i== '<':
            turtle.right(90)
            turtle.fd(18)
            turtle.left(90)
            turtle.write('时',font=("Arial",18,"normal"))
            turtle.pencolor("purple")
            turtle.left(90)
            turtle.fd(18)
            turtle.right(90)
            turtle.fd(40)
        elif i== '>':
            turtle.right(90)
            turtle.fd(18)
            turtle.left(90)            
            turtle.write('分',font=("Arial",18,"normal"))
            turtle.left(90)
            turtle.fd(18)
            turtle.right(90)
            turtle.fd(40)
        elif i== '@':
            turtle.pencolor("gold")
            turtle.right(90)
            turtle.fd(18)
            turtle.left(90)            
            turtle.write('秒',font=("Arial",18,"normal"))
            turtle.left(90)
            turtle.fd(18)
            turtle.right(90)
        else:
            drawDigit(eval(i))
def main():
    turtle.setup(1600,350,200,200)
    turtle.speed("fastest")
    turtle.penup()
    turtle.fd(-600)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+%H<%M>',time.localtime()))
    drawDate(time.strftime('%S@',time.localtime()))
    turtle.hideturtle()
    turtle.done()
main()

你的赞同和喜欢可以留下一个嘛 (≧▽≦)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值