我是您的朋友義縣遊學電子科技,今天我跟大家分享一個小應用。利用python實現一個網絡應用,具有定時關機功能和語音報時功能。
下面我先來介紹一下python。python這門語言想必大家都聽說過,就算沒學習過,大家肯定也或多或少地通過網際網路了解過一些。它具有入門簡單,開發效率高,用途廣泛等特點。您一定對於這幾個優點的描述看膩了吧。老實講,對於python而言它的這幾樣優點確實是其他語言所不能比擬的。您要是學習過dart語言,您就跟深有體會了。dart與js類似,語法的使用比js還要糟糕。網絡上有句話叫"反人類的設計",用在dart身上簡直貼切。話說遠了,我們還說python。python的語法類似與c++,但是比c++更靈活一些。如果您學習過c++,那肯定很快就入門python了。
但是入門簡單不代表深入還簡單哦!任何一款程式語言,您學習後用到項目中,就會發現項目中遇到的問題,往往不是程式語言本身而是行業技術的限制或通病。例如您覺得python上手很簡單,但讓你用python去做一個人工智慧應用出來。您肯定犯難!為什麼呢?套用我剛說的那句話:項目中遇到的問題,往往不是程式語言本身而是行業技術的限制或通病。程式語言python我們基本掌握了,但為何還是覺得這個人工智慧的應用很難呢?問題就在於我們對於人工智慧行業和開發思路,思維方式不夠了解。這與用什麼工具無關,你用c++,c#,go,java同樣會面臨這樣的問題。所以我得出的結論就是,您一定要記好哦。
程式語言就是一種工具入門即可,您更應該學習的是專注該領域的思維方式,解決問題的方法或者思路。只有這樣,您在工作中才能得心應手,不至於換個工作環境用另外一種程式語言就蒙圈了不知如何下手了。
言歸正傳吧!今天這個應用利用了百度的報時api,所以需要聯網. 下面這個圖片是界面。
開始之前我們需要做一些準備工作:
1安裝python3.7
2.安裝pyqt包,它提供了python的gui界面,安裝方式是打開cmd窗口輸入pip
install pyqt即可。
3.安裝pycharm開發工具。連結大家自行搜索下載
開發環境準備好以後,我先介紹一下思路。首先我們用pyqt做一個界面,界面的模樣就是上邊運行界面的樣子了。下面是我的主函數:其中MainWindow1是pyqt生成的界面類,實例化給w.然後定義了一個1000ms的一個定時器,用於1s顯示一次時間(通過w.showtime方法完成的顯示)及報時和關機時間的判斷。關機時間也是1秒判斷一次的。其中多線程主要體現在語音報時功能上和關機時間的倒計時。因為語音報時是單獨一個個體因此放入一個單獨的進程中,這樣在1秒計時的時候不會互相影響,否則會出現語音報時中斷的現象。
if __name__ == "__main__":a = QApplication(sys.argv) w = MainWindow1() path='d:/語音'#設置語音保存的路徑.每次運行都會刪除該目錄後重新建立.保證目錄下文件的大小 if os.path.exists(path):#判斷給定的目錄是否存在 shutil.rmtree('d:/語音/')#無需權限的刪除目錄 os.mkdir('d:/語音/')#創建目錄 # timer對象的信號timeout 連接到w對象的lcdtime函數(槽) timer.timeout.connect(w.showtime)#信號槽連接 timer.timeout.connect(w.shutdown) w.timeEdit.editingFinished.connect(w.shutdown_ready) timer.start(1000) w.show() # 可以生成窗口 th = threading.Thread(None, w.speak, '線程1', ('歡迎使用語音報時程序,作者:金元慶',), None) # ('歡迎使用語音報時程序,作者:金元慶',)是w.speak的元祖參數.speak()只有一個參數,所以加逗號 th.start() sys.exit(a.exec_())
下邊是showtime方法的內容,是pyqt的一個lcdNumber控制項的顯示功能:
def showtime(self):self.lcdNumber.display(time.strftime('%H:%M:%S')) # time.strftime('%H:%M:%S')顯示時間(時間顯示格式)
然後是shutdown()方法內容。這是重點,首先把self.speak方法放入線程1中,方法中主要是實現調用百度語音合成api.當設置好關機時間後按下回車確認,這時開始倒計時,倒計時時間到,會調用window的一個關機命令行命令:
os.system("shutdown -s") # L註銷,R重啟,s關機
python通過os.syetem(「命令」)來實現調用Windows的命令行命令。
下邊代碼中的keyPressEvent方法實現了python按鍵的檢測功能,代碼中是檢測是否按下了回車鍵和esc鍵。
我把部分原始碼貼出來分享給大家,因為源碼太長了,根本沒法貼出來。如果有喜愛的朋友可以關注我後私信哦。我把源碼發給您。
def shutdown(self):#將語音報時單獨放進一個線程,效果和槽調用沒啥區別 #th = threading.Thread(None, self.showtime, '線程7', ( ), None) # ()為showtime的參數,為空 #th.start() '''使用datetime顯示當前時間 import datetime print(datetime.datetime.now().strftime('%Y,%m,%d,%H,%M,%S') ) ''' #15分鐘報時 import time #print(time.localtime())#time.struct_time(tm_year=2016, tm_mon=12, tm_mday=1, tm_hour=20, tm_min=31, tm_sec=41, tm_wday=3, tm_yday=336, tm_isdst=0) if (time.localtime().tm_min%15==0)&(time.localtime().tm_sec==0): #print('每隔15分報時') strtime='當前時間是'+str(+time.localtime().tm_hour)+'時'+str(time.localtime().tm_min)+'分'+str(time.localtime().tm_sec)+'秒'+str(time.localtime().tm_year)+'年'+str(time.localtime().tm_mon)+'月'+str(time.localtime().tm_mday)+'日'+'星期'+str(time.localtime().tm_wday+1)+','+'開發者金元慶' #print(strtime) th = threading.Thread(None, self.speak, '線程1', (strtime,),None) # (1,2)為time1的參數 th.start() import time #print('當前時間',time.localtime()) #print('將給定的秒數轉化成距離1970年的時間',time.localtime(40)) #print('當前時間距離1970年的秒數',time.mktime(time.localtime())) #print('當前時間距離1970年的秒數轉成時間',time.localtime(time.mktime(time.localtime()))) if (self.bb==1): shut_time=QTime() self.timeEdit_2.setTime(shut_time.fromMSecsSinceStartOfDay(abs(self.timeEdit.time().msecsTo(QTime.currentTime()))))#msecsTo(當前時間)-->返回timedit控制項的顯示時間到當前時間的毫秒,fromMSecsSinceStartOfDay(毫秒)--->生成一個新的時間對象,並將毫秒轉成時間 if (time.strftime('%H:%M:%S') == self.timeEdit.text()): th = threading.Thread(None, self.speak, '線程2', ("用戶您好!您已經觸發關機事件,20秒後即將關機.按下esc鍵可取消關機",), None) # (1,2)為time1的參數 th.start() #print("親愛的用戶,你好,你已經觸發了關機事件!約10秒後關機") self.cc=2 self.bb=2 #print('當前時間', time.strftime('%H:%M:%S')) # 顯示時間 # range(0,10) 0123..9 #for ii in range(10, 0, -1): elif (self.cc==2 )& (self.dd<3)&(abs(QTime.currentTime().msecsTo( self.timeEdit.time()))>20000): self.dd = self.dd + 1 print("倒計時:",self.dd, "秒") th = threading.Thread(None, self.speak, '線程3', ("倒計時"+str(self.dd)+"秒",), None) # (1,2)為time1的參數 th.start() th.join(1.5) elif self.dd==3: self.dd=0 self.cc=0 #timer.timeout.disconnect(self.shutdown) th = threading.Thread(None, self.speak, '線程4', ("關機",), None) # (1,2)為time1的參數 th.start() print("關機") #sys.exit() # 退出程序,下邊的語句不執行 #os.system("shutdown -s") # L註銷,R重啟,s關機 #def paintEvent(self, QPaintEvent): # print('設置時間', self.timeEdit.text()) # 讀取timeedit的設置的時間 #print('當前時間', time.strftime('%H:%M:%S')) # 顯示時間def keyPressEvent(self, KeyEvent): if KeyEvent.key() == Qt.Key_Escape: # key_escape是qt的esc按鍵常量 參考http://doc.qt.io/qt-5/qt.html#Key-enum th = threading.Thread(None, self.speak, '線程5', ("您取消了關機",), None) # (1,2)為time1的參數 th.start() #print('esc鍵,您取消了關機!') self.dd = 0#停止關機動作 self.cc = 0#cc停止倒計時數秒 #sys.exit() # 退出程序,下邊的語句不執行 if KeyEvent.key() == Qt.Key_Enter: self.bb=1 th = threading.Thread(None, self.speak, '線程6', ("您設置了自動關機時間",), None) # (1,2)為time1的參數 th.start()