作者: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实现公众号开发