初學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()