为什么Tkinter的askdirectory()会在Windows上返回正斜杠?

时间:2014-01-11 23:48:17

标签: python windows python-3.x tkinter

设置:Windows 7

Python版本:3.3

我正在创建一个跨平台应用程序,我让用户使用Tkinter的askdirectory()模块中的tkinter.filedalog.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)

文件夹选择器没有返回原生斜杠的原因吗?我用Google搜索,没有找到答案。

2 个答案:

答案 0 :(得分:2)

修改

我要编辑我的答案,因为我认为我不是很清楚。


首先,tkinter.filedialog.askdirectory 始终在其返回的路径中使用forwardslashes。所以,你所看到的不是一个错误 - 它是功能设计方式的结果。此外,Windows和* nix系统上都会出现此问题。

现在,似乎没有任何东西可以直接说明为什么askdirectory以这种方式构建。 Tkinter总是因为记录不佳而闻名。 ;)

但是,有几件事需要考虑:

  1. \是Python字符串中的特殊字符。它会创建一个escape sequence。因此,如果askdirectory返回的路径包含反斜杠,则只会导致它出现问题。或者,如果没有,您仍然需要一些安全代码来防止它们。

  2. Python在Windows和* nix系统上运行良好,路径中有forwardslashes。例如,这段代码:

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

    与此完全相同:

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

    唯一的区别是,使用第二种方法,您必须处理转义序列。我通过使用原始字符串来完成此操作,在上面的链接中对此进行了解释。但是,使用forwards的方法要容易得多。

  3. 由于Tkinter是跨平台的,因此在内部使用规范化路径构造既方便又高效。因此,为什么不在没有必要转义的情况下使用适用于Windows和* nix系统的那个?

  4. 如果必须具有应用程序的本机路径,Python已经具有内置函数来实现它。这些可以在os.path模块中找到。

  5. 考虑到这些原因,构建askdirectory以使用转发符号似乎是合乎逻辑的。

答案 1 :(得分:1)

Windows(NT)实际上支持使用正斜杠定义的路径。 甚至可能有区分大小写的文件名。 请参阅WinAPI CreateFile - FILE_FLAG_POSIX_SEMANTICS。它在NTFS上受支持。

http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx