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 一直因文档记录不足而闻名。;)
然而,有一些事情需要考虑:
\是Python字符串中的特殊字符。它创建一个转义序列。因此,如果返回的路径包含askdirectory反斜杠,则只会导致问题。或者,如果没有,您仍然需要一些安全代码来防止它们。
Python 在路径中带有正斜杠的 Windows 和 *nix 系统上都可以正常工作。举个例子,这段代码:
open("C:/path/path/")
Run Code Online (Sandbox Code Playgroud)
其工作原理与此相同:
open(r"C:\path\path")
Run Code Online (Sandbox Code Playgroud)
唯一的区别是,使用第二种方法时,您必须处理转义序列。我通过使用原始字符串来完成此操作,上面的链接对此进行了解释。然而,仅使用正斜杠要容易得多。
由于 Tkinter 是跨平台的,因此在内部使用规范化路径构造既方便又高效。因此,为什么不使用一种可以在 Windows 和 *nix 系统上运行且无需任何转义的系统呢?
如果您的应用程序必须有一个本机路径,Python 已经有内置函数来实现它。这些可以在模块中找到os.path。
考虑到这些原因,askdirectory使用正斜杠构建似乎是合乎逻辑的。