安装程序:Windows 7
Python版本:3.3
我正在制作一个跨平台的应用程序,并且我有用户在Tkinter的tkinter.filedalog.askdirectory
模块中使用askdirectory()
方法给出一个目录。 这工作正常,除了在Windows上的某些原因,它给了我正斜杠。
Windows使用反斜杠,而不是正斜杠,所以当我试图用本机文件斜杠保存文本文件(configuration文件存储的目录,所以它有一个结尾斜杠,我不得不添加),它看起来愚蠢:
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)
文件夹select器是否不返回本地斜线? 我search了一下,看不到任何答案。
编辑:
我要编辑我的答案,因为我不认为我很清楚。
开始, tkinter.filedialog.askdirectory
总是在它返回的路径中使用正tkinter.filedialog.askdirectory
。 所以,你所看到的并不是一个错误 – 这是功能设计的结果。 而且,这种行为在Windows和* nix系统上都会发生。
现在,似乎没有任何东西直接说明为什么askdirectory
是这样建立的。 Tkinter总是因为记录不当而闻名。 ;)
但是,有几件事情需要考虑:
\
是Python字符串中的一个特殊字符。 它创建一个转义序列 。 因此,如果由askdirectory
返回的路径包含反斜杠,则只会预期会导致问题。 或者,如果没有,你仍然需要一些安全代码来防止它们。
在Windows和* nix系统上,Python都可以正常工作,并且在路径中使用正斜杠。 作为一个例子,这个代码:
open("C:/path/path/")
作用与此相同:
open(r"C:\path\path")
唯一的区别是,用第二种方法,你必须处理转义序列。 我通过使用一个原始字符串,这是在上面的链接解释。 但是,使用正斜杠要容易得多。
因为Tkinter是跨平台的,所以在内部使用标准化的路径结构既方便又高效。 因此,为什么不使用在Windows和* nix系统上工作而没有任何必要的转义?
如果你的应用程序必须有一个本地路径,那么Python已经有内置的函数了。 这些可以在os.path
模块中找到。
考虑到这些原因,建立askdirectory
来使用正askdirectory
似乎是合乎逻辑的。
Windows(NT)实际上支持用正斜杠定义的路径。 甚至可以有区分大小写的文件名。 请参阅WinAPI CreateFile – FILE_FLAG_POSIX_SEMANTICS。 它在NTFS上受支持。
http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx