2014-01-11 52 views
3

安裝:Windows 7的爲什麼Tkinter的askdirectory()在Windows上返回正斜槓?

Python版本:3.3

我正在做一個跨平臺的應用程序,和我有用戶使用的Tkinter的tkinter.filedalog.askdirectory模塊askdirectory()方法給出的目錄。這工作正常,除了在Windows上的某種原因它給我正斜槓。

Windows使用反斜槓,而不是正斜槓,所以當我試圖保存與本地文件斜槓(配置文件存儲目錄,以便它已經結束斜線我要補充),它看起來愚蠢的文本文件:

F:/Pictures/Wallpapers\ 

我用來放置本地斜槓的代碼只是os.sep,它是當前系統的本地目錄分隔符,它在* nix和windows上不同。

def getDownloadPath(self): 
     pathdir=askdirectory() 
     if pathdir=='': 
      return #cancel 
     pathdir+=os.sep 
     self.download_location.delete(0,END) 
     self.download_location.insert(0,pathdir) 

是否有原因文件夾選擇器不返回本地斜槓?我搜索了一下,看不到任何答案。

+1

蟒蛇正斜槓是Windows – joaquin

回答

2

編輯:

我要修改我的答案,因爲我不認爲我是很清楚的。


開始,tkinter.filedialog.askdirectory總是在它返回的路徑使用forwardslashes。所以,你所看到的不是一個錯誤 - 這是功能設計方式的結果。而且,這種行爲在Windows和* nix系統上都會發生。

現在,似乎沒有任何東西可以直接說明爲什麼askdirectory是這樣構建的。 Tkinter總是因爲記錄不完善而聞名。 ;)

然而,也有一些事情要考慮:

  1. \是Python中一個特殊字符。它創建一個escape sequence。因此,如果由askdirectory返回的路徑包含反斜槓,則只會期望它會導致問題。或者,如果沒有,你仍然需要一些安全代碼來防止它們。

  2. 在Windows和* nix系統中,Python在路徑中使用正向散射可以很好地工作。作爲一個例子,下面的代碼:

    open("C:/path/path/") 
    

    同樣工作於此:

    open(r"C:\path\path") 
    

    唯一的區別是,與第二種方法,你必須處理轉義序列。我通過使用原始字符串來完成此操作,這在上面的鏈接中進行了解釋。但是,使用正斜槓會更容易。

  3. 由於Tkinter是跨平臺的,在內部使用規範化路徑構造既方便又高效。因此,爲什麼不使用可以在Windows和* nix系統上工作而不需要轉義的程序呢?

  4. 如果你的必須有一個適合你的應用程序的本地路徑,Python已經有內置的函數來實現它。這些可以在os.path模塊中找到。

考慮到這些原因,建立askdirectory來使用正斜槓似乎是合乎邏輯的。

+2

你有你提供的理由的任何引用完全合法的?如果不是這是恕我直言不是一個答案。 BTW。更改斜線的更安全的方法是使用'os.path.normpath'。 – BartoszKP

+0

我覺得它是用於轉義序列的,但我覺得它們可能應該將它記錄在某處,因爲它看起來像我不知道我在做什麼,如果最終用戶打開我的配置文件。 – Mgamerz

+0

@BartoszKP - 雖然我也很喜歡一個說我所說的話的鏈接,但我個人並不相信我的答案是無效的。我以合理的理由爲我的陳述辯護,並向OP提供解決他的問題的辦法。換句話說,我發佈的是_my_對這個問題的回答。 – iCodez