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

Mga*_*erz 6 python windows tkinter python-3.x

设置:Windows 7

Python版本:3.3

我正在制作一个跨平台的应用程序,我让用户使用askdirectory()Tkintertkinter.filedalog.askdirectory模块中的方法提供一个目录。这很好用,除了 Windows 上的某些原因,它给了我正斜杠。

Windows 使用反斜杠,而不是正斜杠,所以当我尝试使用本机文件斜杠保存文本文件时(配置文件存储目录,所以它有一个我必须添加的结尾斜杠),它看起来很傻:

F:/Pictures/Wallpapers\
Run Code Online (Sandbox Code Playgroud)

我用来放置本机斜杠的代码只是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)
Run Code Online (Sandbox Code Playgroud)

文件夹选择器是否有理由不返回本机斜杠?我用谷歌搜索并没有看到任何答案。

小智 3

编辑:

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


首先,tkinter.filedialog.askdirectory 始终在返回的路径中使用正斜杠。因此,您所看到的不是错误,而是函数设计方式的结果。此外,Windows 和 *nix 系统上都会出现此行为。

现在,似乎没有任何东西可以直接说明为什么askdirectory要这样建造。Tkinter 一直因文档记录不足而闻名。;)

然而,有一些事情需要考虑:

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

  2. Python 在路径中带有正斜杠的 Windows 和 *nix 系统上都可以正常工作。举个例子,这段代码:

    open("C:/path/path/")
    
    Run Code Online (Sandbox Code Playgroud)

    其工作原理与此相同:

    open(r"C:\path\path")
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 由于 Tkinter 是跨平台的,因此在内部使用规范化路径构造既方便又高效。因此,为什么不使用一种可以在 Windows 和 *nix 系统上运行且无需任何转义的系统呢?

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

考虑到这些原因,askdirectory使用正斜杠构建似乎是合乎逻辑的。

  • 您提供的原因有任何参考吗?如果不是,恕我直言,这不是答案。顺便提一句。更改斜杠的更安全方法是使用“os.path.normpath”。 (2认同)