Tkinter's tkFileDialog
要使用Tkinter的tkFileDialog,首先要先將tkFileDialog package import進來。
import tkFileDialog
tkFileDialog 的用法大概像下面這樣,依使用需求呼叫不同的方法,並帶入參數就可以了。
tkFileDialog.FunctionName(options)
參數的部分可以帶入 title、filetypes、initialdir、initialfile、multiple、parent、defaultextension 等 (視方法不同可帶入的參數可能會有所不同),分別對應到的是對話框標題、對話框可選擇的檔案類型、初始的目錄、初始的檔案位置、是否支援多選、父視窗、以及預設的附檔名。
... options = {} options['filetypes'] = [("allfiles","*"),("text","*.txt")] options['initialdir'] = "c:\\" options['multiple'] = True options['title'] = "tkFileDialog.askopenfilename" ...
可以呼叫的方法有askopenfilename、asksaveasfilename、askopenfilenames、askopenfile、askopenfiles、asksaveasfile、與askdirectory。
以askopenfilename來說...
... options['title'] = "tkFileDialog.askopenfilename" print tkFileDialog.askopenfilename(**options) or "Without selected!" ...
就是我們一般看到的開啟檔案對話框,方法回傳值為選取的檔案位置。
askopenfilenames 也是一般的開啟檔案對話框,等同於askopenfilename加設multiple參數。這個方法在python 2.6後回傳值從陣列變為字串 (也許是前面提到的multiple參數的關係),所以在取得選取的檔案時我們必須做些處理,可以自行切割,或是透過Tkinter內建的splitlist將字串轉回陣列。
... options['title'] = "tkFileDialog.askopenfilenames" print Tk().tk.splitlist(tkFileDialog.askopenfilenames(**options)) or "Without selected!" ...
askopenfile 跟askopenfilename類似,也是一般的開啟檔案對話框,只是其回傳值改為File物件,可用來直接進一步存取檔案內容。
... options['title'] = "tkFileDialog.askopenfile" fs = tkFileDialog.askopenfile(**options) if fs: print fs.name else: print "Without selected!" ...
askopenfiles 也是開啟一般開啟對話框,可供多選並傳回File物件的陣列。
... options['title'] = "tkFileDialog.askopenfiles" files = tkFileDialog.askopenfiles(**options) print files if files: for fs in files: print fs.name else: print "Without selected!" ...
但這個方法在Python中好像有些問題,所以在運行時會出現錯誤。
錯誤發生的原因可參閱tkFileDialog.py。就筆者看來可能是因為Python 2.6以後askopenfilenames的回傳值從陣列改為字串,這邊卻未跟著修正...
此外,tkFileDialog也可以叫出儲存對話框。我們可以改呼叫asksaveasfilename方法,該方法回傳值為選取的檔案名稱。
... options['title'] = "tkFileDialog.asksaveasfilename" options['defaultextension'] = '.txt' del options['multiple'] print tkFileDialog.asksaveasfilename(**options) ...
也可以改呼叫asksaveasfile方法,回傳值會從字串改為File物件,可直接用來寫入檔案內容。
... del options['filetypes'] del options['defaultextension'] options['title'] = "tkFileDialog.asksaveasfile" print tkFileDialog.asksaveasfile(**options).name ...
若要叫出開啟目錄對話框,可以改呼叫askdirectory方法。
... options['title'] = "tkFileDialog.askdirectory" print tkFileDialog.askdirectory(**options) ...
最後附上筆者測試用的完整範例:
from Tkinter import * import tkFileDialog options = {} options['filetypes'] = [("allfiles","*"),("text","*.txt")] options['initialdir'] = "c:\\" options['multiple'] = True options['title'] = "tkFileDialog.askopenfilename" print tkFileDialog.askopenfilename(**options) or "Without selected!" options['title'] = "tkFileDialog.askopenfilenames" print Tk().tk.splitlist(tkFileDialog.askopenfilenames(**options)) or "Without selected!" options['title'] = "tkFileDialog.askopenfile" fs = tkFileDialog.askopenfile(**options) if fs: print fs.name else: print "Without selected!" options['title'] = "tkFileDialog.askopenfiles" files = tkFileDialog.askopenfiles(**options) print files if files: for fs in files: print fs.name else: print "Without selected!" options['title'] = "tkFileDialog.asksaveasfilename" options['defaultextension'] = '.txt' del options['multiple'] print tkFileDialog.asksaveasfilename(**options) del options['filetypes'] del options['defaultextension'] options['title'] = "tkFileDialog.asksaveasfile" print tkFileDialog.asksaveasfile(**options).name options['title'] = "tkFileDialog.askdirectory" print tkFileDialog.askdirectory(**options)