早衰真可怕,有Python你可不用怕,学了定时休息

本文介绍了如何使用Python开发一个久坐提醒小工具,防止程序员因长时间工作导致的健康问题。通过创建一个GUI应用,设置倒计时并在到达设定时间时自动锁屏,提醒程序员休息。此外,还分享了代码实现细节和打包成exe的步骤。

2019年11月27日在《追我吧》第九期节目的录制过程中,当期参与嘉宾高以翔奔跑时突然减速倒地,节目现场医护人员第一时间展开救治,并紧急将其送往医院。经过两个多小时的全力抢救,医院最终宣布高以翔心源性猝死

此不幸事件发生后,得到了社会各界密切关注。从影迷的惋惜,到对节目组的声讨,以及各种死因分析报道,网上新闻铺天盖地。然而,如果论猝死率最高的职业,不该是我们程序员吗?

猝死高危职业

每年因加班猝死的程序员数以万计,但请问社会同仁是否对我们如此重视过,国家又可曾出台过相关的政策来保护这类高危人群?都没有!!!

image

很累的时候,有人关心你,安慰你,是你的幸运。

如果幸运没有降临到你头上,你要学会用自己的左手温暖自己的右手,

你要告诉自己,一切都会过去的。

**既然他人不关心程序员,我们只能学会自我关怀了。**今天我们就用Python来帮助万千程序员远离猝死!

久坐伤身

记得小米手环第一代发售的时候,就出了久坐提醒这个功能。“久坐”对人身的危害,早被世界所公认。具体有哪些呢?久坐会危害你的结肠、腰椎、颈部、心脏、胰腺、臀部、腿部。至于具体内容,大家可以下来仔细看看。

如此多的危害摆在面前,程序员们却经常因为赶需求、改BUG、查资料而一坐就是几个小时,不到尿憋不挪窝。(就在我写这篇文章的时候,已经在电脑边连续坐了三个小时了…)详细想想,你们是否也有过这些经历!

那么,今天我们用Python开发一个久坐提醒小工具,让每个程序员都能合理休息,定时起身走动走动,远离猝死危害!

程序设计

Python该如何完成久坐提醒这个功能呢?起初考虑定时发邮件、或者微信消息、短信等操作。但专注起来那里有时间关心这些?最后想想,不如开发一个GUI工具,允许程序员设置倒计时,然后到时见电脑自动锁屏,强迫大家起来走走,放松放松。所以有了如下的效果:

image

为了时间设置的范围全面,我添加了支持小数的方式,也是为了能方便录屏演示。

但是为了避免突如其来的锁屏,导致大家不适。所以会在锁屏前10秒给出弹窗提示。这样不至于太过突兀。可这个思路却引发了问题。

image

tkinter的message会阻塞进程,用户不点击取消掉消息窗口,就无法继续执行。为了能使弹出提示消息的同时,继续倒计时读秒,我们需要引入threading和Toplevel的模块,创建一个子窗口,并等待3秒后销毁它。

def notice():

message = Toplevel(root)

message.title(‘提示’)

Label(message, text=‘主人,工作这么久了,准备休息下吧!’

, justify=CENTER, font=(“黑体”, ‘11’)).grid()

time.sleep(3)

message.destroy()

自动锁屏

熟悉bat脚本的童鞋都知道,bat中有shutdown 的命令,可以用来定时重启、关机,但却没有锁屏。查了很久没有结果,最终无奈只能通过pythonctypes模块调用windll,完成锁屏操作了,具体代码如下:

def close_windows():

user32 = windll.LoadLibrary(‘user32.dll’)

user32.LockWorkStation()

代码与使用

-- coding: utf-8 --

@Author : 王翔

@微信号 : King_Uranus

@公众号 : 清风Python

@GitHub : https://github.com/BreezePython

@Date : 2019/11/28 23:23

@Software : PyCharm

@version :Python 3.7.3

@File : CareForCoders.py

from tkinter import *

from tkinter.messagebox import showwarning, showinfo

import time

from ctypes import *

import threading

tkinter GUI工具居中展示

def center_window(master, width, height):

screenwidth = master.winfo_screenwidth()

screenheight = master.winfo_screenheight()

size = ‘%dx%d+%d+%d’ % (width, height, (screenwidth - width) / 2,

(screenheight - height) / 2)

master.geometry(size)

锁定屏幕

def close_windows():

user32 = windll.LoadLibrary(‘user32.dll’)

user32.LockWorkStation()

class CareForCoders:

def user_setting(self):

note = LabelFrame(root, text=“说明”, padx=10, pady=10,

fg=“red”, font=(“黑体”, ‘11’))

note.grid(padx=10, pady=2, sticky=NSEW)

index = Label(note, text=‘程序猿/媛们,久坐伤身请务必定时休息!’)

index.grid()

lb = LabelFrame(root, text=“定时设置(支持小数)”, padx=10,

pady=10, fg=“red”, font=(“黑体”, ‘11’))

lb.grid(padx=10, pady=2, sticky=NSEW)

self.time_entry = Entry(lb)

self.time_entry.grid(row=1, column=0)

unit = Label(lb, text="(单位:分)")

unit.grid(row=1, column=1, padx=5)

self.countdown_lb = Label(text=“休息倒计时:”, justify=LEFT,

font=(“黑体”, ‘11’))

self.countdown_lb.grid(row=2)

self.submit = Button(root, text=“启动”, width=8,

command=lambda: self.get_countdown(self.time_entry.get())

)

self.submit.grid(row=3, column=0, pady=10)

def get_countdown(self, countdown):

try:

_float_countdown = float(countdown)

if _float_countdown

showwarning(“提示:”, message=“倒计时必须为正数!”)

else:

self.countdown_show(_float_countdown * 60)

except ValueError:

showwarning(“提示:”, message=“请填写正确的倒计时!”)

def countdown_show(self, countdown_sec):

self.time_entry.config(state=DISABLED)

self.submit.config(state=DISABLED)

time.sleep(1)

self.countdown_lb.config(text=“休息倒计时: %02d:%02d” %

(countdown_sec // 60, countdown_sec % 60))

root.update()

为了避免突如其来的锁屏,倒计时30秒给出提示…

if countdown_sec == 10:

t = threading.Thread(target=self.notice)

t.start()

if countdown_sec

启动锁屏操作

close_windows()

self.time_entry.config(state=NORMAL)

self.submit.config(state=NORMAL)

self.countdown_lb.config(text=“欢迎主人回来…”)

root.update()

return

countdown_sec -= 1

self.countdown_lb.after(1000, self.countdown_show(countdown_sec))

@staticmethod

def notice():

message = Toplevel(root)

message.title(‘提示’)

Label(message, text=‘主人,工作这么久了,准备休息下吧!’

, justify=CENTER, font=(“黑体”, ‘11’)).grid()

time.sleep(3)

message.destroy()

showinfo(“提示”,message=‘主人,工作这么久了,准备休息下吧!’)

if name == ‘main’:

root = Tk()

center_window(root, 260, 200)

root.resizable(width=False, height=False)

root.title(‘久坐提醒 by:清风Python’)

Main = CareForCoders()

Main.user_setting()

root.mainloop()

大家可以去我的github下载所有文章代码: https://github.com/BreezePython

既然我们要造福万千程序员,那么当然最好可以打包成exe工具,便于脱离环境传播了!使用命令

pyinstaller -F -w -i love.ico CareForCoders.py

进行打包

-F 打包成单个文件,-w 取消cmd窗口 -i 添加软件的ico图标,来看看效果吧:

image

#include

int main()

printf(“学习从来不是一个人的事情,要有个相互监督的伙伴\n”);

printf(“工作需要学习Python或者为了入行、转行学习Python的伙伴\n”);

printf(“可以家裙:457012314,领取100G学习资料\n”);

return 0;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值