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

长按扫码关注我
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 放假过后,离家去了成都。租住房子里的多肉,就没了人浇水照顾。 时隔一个月回来,看到阳台上的多肉,心生怜惜。所有的叶...
    箜溪晓阅读 145评论 0 1
  • 不知怎么的现在有这么一种感觉,感觉似乎一下子渡到了中年,上有老下有小的,感觉这种生活似乎离自己还有一阵子距离,怎...
    蜗牛的眼镜阅读 381评论 0 0
  • 随着网站进入我们的生活和工作,一个企业的产品想要红火,销售的出去,在网上销售或者推广是必不可少的手段。 而网站优化...
    1f4c756f327e阅读 181评论 0 0