Python微项目分享之养老倒计时

作者:JiawuZhang
出品:JiawuLab(公众号ID:jiawulab)

微项目系列是JiawuLab原创栏目,每期选取一个自创项目或发现有趣的项目,进行代码、逻辑分析,达到python学习目的。

大家好,我是JiawuZhang,本期微项目是——养老倒计时。

上期分享的微项目——爱情明信片,您看过吗?如果感兴趣,传送门:**Python微项目分享之爱情明信片

我们对这个小项目升级,通过代码改造后,从文字版变成图文版,整个体验也上升不少。

同时因为这个升级项目,还学到了一个新知识——图像处理库PIL,这是一个很强大的库,比如网络上做动态二维码的MYQR库的底层也是调用的PIL来实现图片处理的,我们还能利用这个库做很多好玩的事情。

项目介绍

最近刷问答,看到有一个提问关注度很高——明年养老金涨的比例是多少?什么时候能领到涨的养老金呢?

咳咳,这个问题,对于我来说好像有点遥远啊。相信阅读这篇文章的大部分朋友也是一样。

从一些回答可以看出:我国的养老金已经实现了连续15年的上涨,明年也就是2020年的上涨也是大概率事件。

哇,好羡慕啊,这个时候再看看自己的工资条,嗯。好希望也能有这样的上涨趋势。

不禁就想到了,还有多久自己开始领养老金,享受国家的待遇啊〜(二哈,醒醒〜)

双十一前一天,我分享过一个事件倒计时的小项目,从后台数据看到,有不少的新朋友阅读,先在此谢谢大家。

我打算将这个项目进行升级,再加上前一期所用到的PIL图片库,让整个项目更饱满。

于是就有这期项目——养老倒计时功能。

项目分析

1、倒计时计算 利用原先事件倒计时项目的部分代码,做一个从现在到退休的时间计算。

我初步的想法是,输入现在的年纪,然后根据法定60岁的退休年龄,(女性同胞是50岁),计算出差值。

有个问题,直接输入年纪或是生日信息,这都是太隐私的事情,不方便程序的普适性,

比如你能让一位女性输入自己的真实年龄吗?又或是谁会轻易输入自己的生日呢?

所以决定,用户输入一个退休时间,然后通过代码计算出还剩多长时间就可以了。

2、生成图片 使用图像处理PIL库,将相应的信息画在图片上,然后写上合适的文字。

所以需要找一些图片,大家都知道网上用图片都是要钱的,我只能找一些免费的图片做样式啦。

然后利用上期介绍的爱情明信片的部分代码,来完成文字信息的填写。

码代码

上面分析完成,又到了码代码的时间。

首先,原来的事件倒计时的代码,有哪些可用的呢?我发现“count(event, endtime)”函数是能用的。

def count(event, endtime):
    # 目标时间格式
    if '.' in endtime:
        form = '%Y.%m.%d'
    elif '-' in endtime:
        form = '%Y-%m-%d'
    elif '/' in endtime:
        form = '%Y/%m/%d'
    # 目标时间类型转化
    endate = datetime.datetime.strptime(endtime, form)
    while True:
        # 获得现在时间
        today = datetime.datetime.now()
        # 时间差
        day = (endate-today).days              # 得到还有几天
        second = (endate-today).seconds     # 得到还有几秒
        sec = int(second % 60)                 # 根据秒数得到还有几秒
        minute = int(second/60 % 60)           # 根据秒得到分钟数
        hour = int(second/60/60)      # 根据秒数得到小时
        if hour > 24:
            hour = hour-24      # 如果超过24小时,就要算超过1天,所以要减去24
        timestr = f"距离({event})还有 {day} 天 {hour} 小时 {minute} 分钟 {sec} 秒"
        print('\r', timestr, end='')

不过这部分代码中,循环目的是闪动显示,而这次我们只需要得到相应的数值就可以了,所以需要去掉循环。

然后时间计算部分都需要调整,我们只需要知道多少天就可以了。

最后代码调整为:

# 导入区
import datetime

def count(endtime):
    if "." in endtime:
        form = '%Y.%m.%d'
    elif '-' in endtime:
        form = '%Y-%m-%d'
    elif '/' in endtime:
        form = '%Y/%m/%d'

    endate = datetime.datetime.strptime(endtime, form)
    today = datetime.datetime.now()
    day = (endate-today).days
    if day >= 0:
        return day
    else:
        return 0

这里加了判断,目的是当用户输入早于今天的日期时,不要输出一个负值,这里的"day"可以为负值的。

获得剩余时间后,我们就来在图片上做处理,我们在上期代码的基础上做一些修改就好了。

def retirepic(x):
    m = random.randint(1, 10)
    im = Image.open(path + f'retire/{m}.jpg').convert('RGB')
    im = im.filter(ImageFilter.BoxBlur(5))
    draw = ImageDraw.Draw(im)
    # 设置本次使用的字体
    font1 = ImageFont.truetype('./Fonts/SourceHanSansCN-Medium_0.otf', 120)
    font2 = ImageFont.truetype('./Fonts/SourceHanSansCN-Medium_0.otf', 50)
    color = (217, 217, 217, 255)

    # 计算各文本的放置位置
    txtSize_1 = draw.textsize('世界那么美好', font2)
    pos_1 = (im.size[0] - txtSize_1[0]) / 2
    txtSize_2 = draw.textsize('我想去体验尝试一下', font2)
    pos_2 = (im.size[0] - txtSize_2[0]) / 2
    txtSize_3 = draw.textsize('寿命可以有长短', font2)
    pos_3 = (im.size[0] - txtSize_3[0]) / 2
    txtSize_4 = draw.textsize("青春却可以没有期限", font2)
    pos_4 = (im.size[0] - txtSize_4[0]) / 2
    txtSize_5 = draw.textsize('距离光荣退休', font2)
    pos_5 = (im.size[0] - txtSize_5[0]) / 2
    txtSize_6 = draw.textsize('还 有', font2)
    pos_6 = (im.size[0] - txtSize_6[0]) / 2
    txtSize_9 = draw.textsize('"在岗一分钟,奋斗六十秒"', font2)
    pos_9 = (im.size[0] - txtSize_9[0]) / 2

    # 设置文本放置位置,居中
    draw.text((pos_1, 200), '世界那么美好', fill=color, font=font2)
    draw.text((pos_2, 320), '我想去体验尝试一下', fill=color, font=font2)
    draw.text((pos_3, 450), '寿命可以有长短', fill=color, font=font2)
    draw.text((pos_4, 570), "青春却可以没有期限", fill=color, font=font2)
    draw.text((pos_5, 750), '距离光荣退休', fill=color, font=font2)
    draw.text((pos_6, 870), '还 剩', fill=color, font=font2)
    draw.text((pos_9, 1310), '"在岗一分钟,奋斗六十秒"', fill=color, font=font2)

    # 设置变化的文本属性
    day = f'{x}天'
    sec = f'{x * 24}小时 | {x * 24 * 3600} 秒'

    txtSize_7 = draw.textsize(day, font1)
    pos_7 = (im.size[0] - txtSize_7[0]) / 2
    txtSize_8 = draw.textsize(sec, font2)
    pos_8 = (im.size[0] - txtSize_8[0]) / 2

    draw.text((pos_7, 990), day, fill=color, font=font1)
    draw.text((pos_8, 1190), sec, fill=color, font=font2)

    # 绘制线框
    pos_line = [(20, 20),
             (im.size[0] - 20, 20),
             (im.size[0] - 20, im.size[1] - 20),
             (20, im.size[1] - 20),
             (20, 20)]
    draw.line(pos_line, fill=color, width=5)

    filename = 'retire.png'
    im.save(filename)

先将图片放于“retire”文件夹中,然后给“retirepic”函数传进剩余时间的参数,整个代码就能执行了。

来看看我用代码生成的两张图片:

是不是很像那么回事。(二哈〜)

你也可以按照自己的想法来改造代码,做出更多不同的玩法,是不是很趣呢。

同时我也将这个功能上线到公众号了,只要输入“养老倒计时+退休时间”就能获得指定的图片啦。如下图:

细心的朋友,应该能看到图片的左上角会有一个编码,这个是我根据数据库的功能,搭建的会员体系,每位朋友都有指定的编码,无论背景怎么换,编码都是一致的。

这段时间做了很多微项目的分享,主要的目的是为了让大家对python的基础运用更熟悉一些,也能通过一些小项目锻炼处理问题的思维。

公众号运营了一段时间,虽然经常会把一些小项目做成互动的功能,但是还是觉得少了点什么。

比如上期的爱情明信片,这期的养老倒计时,都是玩一会儿,就没有继续下去的动力了。

而市面上最常见的维系粉丝活跃度的功能——签到积分体系。是一个很系统的,小巧的功能。

我将会在后面一段时间,利用python来搭建我自己的签到积分系统,并且将每一步的思考及操作都分享出来。

所以大家都能看到新的实验系列文章啦,敬请期待〜

(项目源代码已上传到公众号,回复“养老源代码”可获取。)


本次的微项目——养老倒计时——分享结束。如果您喜欢这期文章,请麻烦点个赞,支持一下。

欢迎您关注公众号:JiawuLab,或者给我留言,说说你遇到的问题,我们一起探讨。

推荐阅读

Python微项目分享之事件倒计时

Python微项目分享之幸运球抽奖

我的公众号开发(总结)一文学会python实现公众号开发

长按扫码关注我

你可能感兴趣的:(Python微项目分享之养老倒计时)