2013-07-25 61 views
1

Python版本:2.7版本Tk的8.5對話框窗口選擇文件的數量限制?

參考我以前的問題how to add the selected files from dialog window to a dictionary?

我想選擇對話窗口500個文件,並提取它們的名稱爲字典鍵。文件總大小約爲200M。 我不知道爲什麼我得到一個空的字典。但是,如果我每次選擇少於100個的文件,它每次都能很好地工作。所以我的問題是,是否有對話窗口選擇文件或字典中的鍵的數量限制?

sys.path.append("C:\MY PATH") 
os.environ['PATH']+=";C:\MY PATH" 

print "Please select your txt files in the dialog window >>" 
filez = tkFileDialog.askopenfilenames(parent=root,multiple='multiple',title='Choose a file',filetypes=[('txt file','.txt'),('All files','.*')]) 

mydict = {} 
for FilenameWithPath in filez: 
    path, Filename = os.path.split(str(FilenameWithPath)) 
## Filename = sys.path.basename(FilenameWithPath) 
    mydict[Filename] = len(mydict) 
print "mydict " + str(mydict) 
print "\n" 

,如果我的Selec所有500個文件,它只是給

mydict {} 

任何解決方案?謝謝。

+1

對不起,我不確定這裏是否有誤解,但是您是否說用戶實際上會從文件對話框中手動選擇500個文件?如果有系統的方法來確定你正在使用哪些文件而不是用戶輸入,那麼我會推薦使用類似os.walk()的方法來瀏覽目錄結構並獲取你需要的文件的詳細信息。請你能提供一些關於你的要求的更多信息。 – ChrisProsser

+0

@ChrisProsser,是的,它是手動的,B/C它可以更靈活地選擇你想要的。感謝您的推薦。我更改了代碼,可以檢查它嗎? – Shengen

+0

@ChrisProsser我注意到這裏的bug,結果返回到一個unicode字符串。不知何故,有時它會返回到期望列表中。 – Shengen

回答

2

我想我可以看到問題出在哪裏。我已經做了一些調試,發現返回到filez的數據類型是一個unicode字符串(你似乎期待列表或元組)。

您需要在循環之前將其轉換。如果沒有您的文件名中包含空格這應該只是一個簡單的問題:

file_list = files.split() 

然而,如果不是這種情況,則上述不會工作,以及包含空格的文件名用花括號括起來{}。

這實際上可能是一個根據this page的錯誤。但是,還建議解決方法將字符串轉換爲元組:

file_list= master.tk.splitlist(filez) 

希望這會有所幫助。

+2

是的,返回一個unicode字符串是一個已知的錯誤 - 實際上,我使用的解決方法是'file_list = re.findall('\ {(。*?)\}',file_list)''。無論如何,即使採用了這種修復方法,當我選擇大量文件時,我仍能夠始終如一地重現OP 2.7.5中的錯誤,否則就沒有問題。這個錯誤似乎深藏在'Tkinter'模塊或者'tk/tcl'庫本身內部,因爲我可以看到它發生在幾個上層的純Python級別。 – martineau

+0

FWIW,這裏是一個與unicode字符串問題相關的SO問題:[解析askopenfilenames()的結果?](http://stackoverflow.com/questions/4116249/parsing-the-results-of-askopenfilenames)。對接受的答案BTW的評論說'splitlist()'不起作用。 – martineau

+0

@martineau根據[鏈接](http://stackoverflow.com/questions/4116249),當我設置'master = Tk()',並返回一個錯誤:'name'Tk'未定義',什麼我應該輸入嗎? '進口Tkinter'? – Shengen

相關問題