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!”



就是我們一般看到的開啟檔案對話框,方法回傳值為選取的檔案位置。


image



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中好像有些問題,所以在運行時會出現錯誤。


image



錯誤發生的原因可參閱tkFileDialog.py。就筆者看來可能是因為Python 2.6以後askopenfilenames的回傳值從陣列改為字串,這邊卻未跟著修正…


image



此外,tkFileDialog也可以叫出儲存對話框。我們可以改呼叫asksaveasfilename方法,該方法回傳值為選取的檔案名稱。




options[‘title’] = “tkFileDialog.asksaveasfilename”
options[‘defaultextension’] = ‘.txt’
del options[‘multiple’]
print tkFileDialog.asksaveasfilename(**options)


image



也可以改呼叫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)


image



最後附上筆者測試用的完整範例:



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