Python幫助萬千程序員遠離猝死悲劇

高以翔事件

11月27日在《追我吧》第九期節目的錄製過程中,當期參與嘉賓高以翔奔跑時突然減速倒地,節目現場醫護人員第一時間展開救治,並緊急將其送往醫院。經過兩個多小時的全力搶救,醫院最終宣佈高以翔 心源性猝死 。

此不幸事件發生後,得到了社會各界密切關注。從影迷的惋惜,到對節目組的聲討,以及各種死因分析報道,網上新聞鋪天蓋地。然而,如果論猝死率最高的職業,不該是我們程序員嗎?

猝死高危職業

每年因加班猝死的程序員數以萬計,但請問社會同仁是否對我們如此重視過,國家又可曾出臺過相關的政策來保護這類高危人羣? 都沒有!!!

很累的時候,有人關心你,安慰你,是你的幸運。

如果幸運沒有降臨到你頭上,你要學會用自己的左手溫暖自己的右手,

你要告訴自己,一切都會過去的。

既然他人不關心程序員,我們只能學會自我關懷了。 今天我們就用Python來幫助萬千程序員遠離猝死!

久坐傷身

記得小米手環第一代發售的時候,就出了 久坐提醒 這個功能。“ 久坐 ”對人身的危害,早被世界所公認。具體有哪些呢?久坐會危害你的結腸、腰椎、頸部、心臟、胰腺、臀部、腿部。至於具體內容,大家可以下來仔細看看。

如此多的危害擺在面前,程序員們卻經常因爲趕需求、改BUG、查資料而一坐就是幾個小時,不到尿憋不挪窩。(就在我寫這篇文章的時候,已經在電腦邊連續坐了三個小時了…)詳細想想,你們是否也有過這些經歷!

那麼,今天我們用Python開發一個 久坐提醒小工具 ,讓每個程序員都能合理休息,定時起身走動走動,遠離猝死危害!

程序設計

Python該如何完成久坐提醒這個功能呢?起初考慮定時發郵件、或者微信消息、短信等操作。但專注起來那裏有時間關心這些?

最後想想,不如開發一個GUI工具,允許程序員設置倒計時,然後到時見電腦自動鎖屏,強迫大家起來走走,放鬆放鬆。所以有了如下的效果:

爲了時間設置的範圍全面,我添加了支持小數的方式,也是爲了能方便錄屏演示。

但是爲了避免突如其來的鎖屏,導致大家不適。所以會在鎖屏前10秒給出彈窗提示。這樣不至於太過突兀。可這個思路卻引發了問題。

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 的命令,可以用來定時重啓、關機,但卻沒有鎖屏。查了很久沒有結果,最終無奈只能通過python ctypes 模塊調用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 <= 0: 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 < 1: # 啓動鎖屏操作 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(
python學習裙:10667510,最全學習資料,萌新程序員大本營
) 

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

既然我們要造 福萬千程序員,那麼當 然最好可以打包成exe工具,便於脫離環境 傳播了!

使用命令 pyinstaller -F -w -i love.ico CareForCoders.py 進行打包

-F 打包成單個文件,-w 取消cmd窗口 -i 添加軟件的ico圖標,來看看效果吧:

如果大家喜歡,關注公衆號編程學習營,回覆關鍵字: 鎖屏 ,即可獲取代碼及打包好的exe工具。快把這個暖心的小工具,分享給你身邊的朋友們吧!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章