初学python,想做一个自动关电脑的程序,到了晚上11点让电脑自动关机,写了一个简单的python代码。虽然只是一个简单的功能,但是经历了好几次优化的过程
第一个过程:最简单的实现定时关机的功能
from datetime import * import os tmNow = datetime.now() d = date.today() t = time(23,10,0) shtdownTime = datetime.combine(d,t) def ShutDown(): while True: tmNow = datetime.now() timedDelta = (shtdownTime - tmNow).total_seconds() if timedDelta < 60: os.system('shutdown -s -f -t 59') break else: continue if __name__ == '__main__': ShutDown()
上面这个代码已经实现了基本的自动关机功能。使用一个while循环实时监测当前时间距离关机时间还有多少秒,当距离关机时间<1分钟的时候,执行关机的脚本os.system('shutdown -s -f -t 59')
第二个过程:给机主一个弹框提示
但是这样不够人性化,机主也许在工作有需要保存的工作没有保存,这样突然关机导致机主的代码或者游戏进度丢失,所以我想在关机之前给机主一个弹框提示“我要关机了,赶快保存一下!”,这就需要使用win32api库,调用Windows的钩子函数弹出messageBox。改进之后的代码如下:
1 from datetime import * 2 import os 3 4 tmNow = datetime.now() 5 d = date.today() 6 t = time(23,10,0) 7 shtdownTime = datetime.combine(d,t) 8 9 def ShutDown(): 10 while True: 11 tmNow = datetime.now() 12 timedDelta = (shtdownTime - tmNow).total_seconds() 13 if timedDelta < 60: 14 win32api.MessageBox(win32con.NULL, u'还有59s关机,赶快保存一下!', u'温馨提醒', win32con.MB_OK) 15 os.system('shutdown -s -f -t 59') 16 break 17 else: 18 continue 19 20 if __name__ == '__main__': 21 ShutDown()
相比第一段代码只是新增了第15行 win32api.MessageBox(win32con.NULL, u'还有59s关机,赶快保存一下!', u'温馨提醒', win32con.MB_OK),距离开机时间<1分钟的时候,给出一个弹框提示。点击确定按钮开始执行关机脚本。
但是这样又出现了一个问题,如果机主不点击“温馨提醒”对话框的确定按钮,程序就永远也不会执行关机脚本,这样机主哪怕玩到夜里一两点也不会自动关机了。所以就有了第三个过程的改进。
第三个过程:双线程实现,一个线程用来弹出提醒框,另一个线程用来执行关机脚本,也就是我的最终代码。代码如下。
1 #coding=utf-8 2 "shutdown at 23:00" 3 4 from datetime import * 5 import os 6 import win32api 7 import win32con 8 from threading import * 9 10 tmNow = datetime.now() 11 d = date.today() 12 t = time(23,10,0) 13 shtdownTime = datetime.combine(d,t) 14 15 def ShowHint(): 16 while True: 17 tmNow = datetime.now() 18 timedDelta = (shtdownTime - tmNow).total_seconds() 19 if timedDelta < 60: 20 win32api.MessageBox(win32con.NULL, u'还有59s关机,赶快保存一下!', u'温馨提醒', win32con.MB_OK) 21 break 22 else: 23 continue 24 def ShutDown(): 25 while True: 26 tmNow = datetime.now() 27 timedDelta = (shtdownTime - tmNow).total_seconds() 28 if timedDelta < 60: 29 os.system('shutdown -s -f -t 59') 30 break 31 else: 32 continue 33 34 if __name__ == '__main__': 35 threadShowHint = threading.Thread(target=ShowHint) 36 threadShutDown = threading.Thread(target=ShutDown) 37 38 threadShowHint.start() 39 threadShutDown.start()