要使用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)

Link

	tkFileDialog - Tkinter Wiki