1. 程式人生 > >python應用(2):寫個python程式給自己用

python應用(2):寫個python程式給自己用

用python寫一個程式,然後在命令列上執行,看不到介面(UI),這種程式很常見了,叫命令列程式。然而很多人,特別是不懂程式的人,更需要看到的是一個有介面的,能通過滑鼠操作的程式,畢竟已經邁進“視窗”的時代,雖然Dos還存在。所以,怎麼用python弄出有介面的程式呢? 介面也是一個工具,所以,有沒有介面工具庫呢?必須得有,而且有很多個,你搜索“python介面庫”就可以看到很多這方面的介紹,而我要介紹的,是python最早就有的**tkinter**,通過它來實現介面程式。 tkinter內建在python中,所以不用再安裝,直接import進來使用就是了。沿用上一節介紹的文字轉語音的程式,我現在要寫一個介面程式,上面有兩個按鈕,一個用來選擇文字檔案,一個是“轉換成語音”,來看看怎麼實現吧。 ### (1)TTS的GUI程式 ``` from tkinter import * import tkinter.messagebox as msgbox import tkinter.filedialog as filedlg import os import pyttsx3 from pydub import AudioSegment import threading txtfile = "" window = Tk() pathlabel = Label(window, text="...") def fileFunc(): default_dir = "檔案路徑" global txtfile global pathlabel txtfile = filedlg.askopenfilename(title="選擇檔案", initialdir=(os.path.expanduser(default_dir))) (path, fname) = os.path.split(txtfile) pathlabel["text"] = fname def converThreadFunc(content): outfile = "out.aiff" tts = pyttsx3.init() tts.save_to_file(content, outfile) tts.runAndWait() def convertFunc(): if len(txtfile) == 0: msgbox.showinfo("提示", "請先選擇文字檔案") return content = open(txtfile, "r", encoding="utf-8").read() if len(content)==0: msgbox.showinfo("提示", "文字檔案沒有內容,轉換終止,不輸出語音檔案") return t1 = threading.Thread(target=converThreadFunc, args=(content,)) t1.start() t1.join() outfile = "out.aiff" AudioSegment.from_file(outfile).export("out.mp3", format="mp3") msgbox.showinfo("提示", "轉換成功,程式目錄下的out.mp3就是最終的語音檔案:%s" % os.getcwd()) os.system("open '%s'" % os.getcwd()) def main(): window.title("TTS-文字轉換語音") window.geometry("320x320+100+100") filebtn = Button(window, text="選擇文字檔案", command=fileFunc) convertbtn = Button(window, text="轉換成語音", command=convertFunc) filebtn.place(x=10, y=10) pathlabel.place(x=10, y=40) convertbtn.place(x=10, y=80) window.mainloop() if __name__=="__main__": main() ``` 抓重點來看。 1、使用了tkinter的控制元件,messagebox是提示框,filedialog是檔案選擇控制元件,再比如Button跟Label,這些都是常用的控制元件,它們的建立跟屬性設定,也有不少詳情,你可以搜尋來了解。 2、這裡用place方法來設定控制元件的位置,類似的方法還有pack、grid等。 3、業務邏輯上,重點是處理兩個按鈕的點選事件,也就是那兩個def出來的xxFunc函數了。 4、文字轉語音的處理,使用了上節介紹的程式碼,也沒有什麼神祕的。 5、pyttsx3.engine的函式runAndWait在執行完後會結束當前執行緒,所以,不能在主執行緒即UI執行緒來執行這個函式,而要啟動一個thread來執行它,否則runAndWait執行後主介面就會消失,這不是預期的事情。 執行起來後的一個截圖是這樣的: ![tts-gui截圖](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/python/python%E5%86%99%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F%E7%BB%99%E8%87%AA%E5%B7%B1%E7%94%A8/%E8%BF%90%E8%A1%8C%E6%88%AA%E5%9B%BE.jpg) 程式弄好了,先不管它醜不醜吧,至少功能可以用了。如果是自己使用的話,那怎麼樣才能快速地啟用這個程式呢? ### (2)結合alfred來呼叫程式 之前介紹過怎麼在mac系統上快速地切換或啟動一個程式,使用的工具就是alfred,這是一個超級好用的工具。那現在再次使用alfred來啟用剛才寫的程式。 關於alfred的安裝或使用,網上很多介紹,我之前介紹“mac環境與工具”時也有介紹,但是,這裡有一個地方要注意:**手動用終端執行上面的python程式是可以正常運作的,但一旦通過alfred執行python程式,那在AudioSegment.form_file時就會異常,最終export不出語音檔案,就算直接在python程式碼中執行ffmpeg命令也一樣會失敗,判斷是,alfred執行python指令碼的情況下,AudioSegment(包括它使用的ffmpeg)沒有許可權訪問檔案。** 考慮到這種情況,就要變通一下了:讓alfred開啟一個新的終端,並且讓這個終端執行python程式--按這個思路來製作工具。 1、在alfred上新建一個“Script Filter”: ![tts啟用入口](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/python/python%E5%86%99%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F%E7%BB%99%E8%87%AA%E5%B7%B1%E7%94%A8/%E5%88%9B%E5%BB%BAtt%1Cs%E7%9A%84%E6%BF%80%E6%B4%BB%E5%85%A5%E5%8F%A3.jpg) 2、新的terminal會執行cmd.sh指令碼,這個指令碼是這樣的: ``` cd '/Users/freejet/Library/Application Support/Alfred 3/Alfred.alfredpreferences/workflows/user.workflow.4D91A493-39F3-433C-9D33-65917236A6F5' source ~/Desktop/pyenv/bin/activate python3 demo_gui.py ``` 先是cd到這個alfred指令碼即workflow所在的目錄,這個目錄路徑你可以通過右鍵workflow找到,然後啟用python3的環境(第一節介紹到的內容),最後執行python程式也就是上面介紹的“TTS的GUI程式”。 把這個cmd.sh放到當前workflow的目錄中,這樣alfred才能找到它。 3、執行一下,效果是這樣的: ![tts執行效果](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/python/python%E5%86%99%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F%E7%BB%99%E8%87%AA%E5%B7%B1%E7%94%A8/tts.gif) 最後的那個out.mp3就是最終想要的檔案,你可以聽一下(如果你是在公眾號內看到這篇文章的話): (out.mp3試聽) 對應的文字是這樣的: > 瑤草一何碧,春入武陵溪。溪上桃花無數,花上有黃鸝,我欲穿花尋路,直入白雲深處,浩氣展虹霓。只恐花深裡,紅露溼人衣。坐玉石,欹玉枕,拂金徽。謫仙何處,天人伴我白螺杯。我為靈芝仙草,不為朱脣丹臉,長嘯亦何為!醉舞下山去,明月逐人歸。——宋.黃庭堅《水調歌頭.遊覽》 你已經開始吐槽了吧:這語音效果怎麼這麼差! 傳統的TTS就這樣子了,有得聽就不錯了,如果想要“有感情”的效果那一般要使用成熟的語音合成介面,或者自己訓練一個出來。但不管語音效果怎麼樣,本文的目的已經達到了:**怎麼用python寫一個程式,然後給自己快速地呼叫到。so,see y