Python tkinter,tkinter.askdirectory()在用户点击';取消';或“X出”,或按Esc键退出窗口
无论我做什么,Python tkinter,tkinter.askdirectory()在用户点击';取消';或“X出”,或按Esc键退出窗口,python,python-3.x,tkinter,filedialog,Python,Python 3.x,Tkinter,Filedialog,无论我做什么,tkinter.filedialog.askdirectory()都会在窗口上的Cancel按钮或Xclose按钮或用户选择Esc时返回初始默认目录(当前目录)。我尝试将初始目录的选项编码为C:\,而不是将脚本保存在E:\中,以尝试控制它。但是,如果选择了Cancel、X或Esc,它仍然返回E:\。我还尝试添加root.protocol以强制X关闭整个程序,但它没有改变行为。我用一个空字符串初始化了目录,这也没有效果。我找到的所有文档和问题/答案都只是声明在这些情况下它应该返回一个
tkinter.filedialog.askdirectory()
都会在窗口上的Cancel
按钮或X
close按钮或用户选择Esc
时返回初始默认目录(当前目录)。我尝试将初始目录的选项编码为C:\
,而不是将脚本保存在E:\
中,以尝试控制它。但是,如果选择了Cancel
、X
或Esc
,它仍然返回E:\
。我还尝试添加root.protocol
以强制X
关闭整个程序,但它没有改变行为。我用一个空字符串初始化了目录,这也没有效果。我找到的所有文档和问题/答案都只是声明在这些情况下它应该返回一个空字符串。我需要这是真的!我看不出这里出了什么问题;提前谢谢你的建议。我得到的唯一提示是,我不确定tkinter消息和文件对话框如何使用根窗口,或者它们是否使用根窗口。我想这就是我可能失去控制的地方
我使用的是Windows10,使用的是Python 3.7.0
以下是我拥有的玩具示例:
import os
import tkinter
import tkinter.filedialog as tkf
class Directory(tkinter.Tk):
def __init__(self):
self.root = tkinter.Tk()
self.root.protocol("WM_DELETE_WINDOW", self.root.quit())
self.root.withdraw()
self.directory = ""
def GetDirectory(self):
self.directory = os.path.abspath(tkf.askdirectory(master = self.root, initialdir = 'C:\\', title = "Select your Source directory"))
print('type directory', type(self.directory), self.directory=="", self.directory)
return self.directory
if __name__ == "__main__":
app = Directory()
Directory.GetDirectory(app)
Output after hitting cancel, Esc, or X:
type directory <class 'str'> False E:\
导入操作系统
进口tkinter
将tkinter.filedialog作为tkf导入
类目录(tkinter.Tk):
定义初始化(自):
self.root=tkinter.Tk()
self.root.protocol(“WM\u DELETE\u WINDOW”,self.root.quit())
self.root.draw()
self.directory=“”
def GetDirectory(self):
self.directory=os.path.abspath(tkf.askdirectory(master=self.root,initialdir='C:\\',title=“选择源目录”))
打印('type directory',type(self.directory),self.directory==“”,self.directory)
返回self.directory
如果名称=“\uuuuu main\uuuuuuuu”:
app=目录()
目录。GetDirectory(应用程序)
点击取消、Esc或X后的输出:
键入目录False:\
问题的原因是您添加了askdirectory
os.path.abspath():返回路径名路径的规范化绝对版本
即使当您取消或按“X”时,它将返回”
,但os.path.abspath(“”)将返回当前文件夹的绝对路径
self.directory = tkf.askdirectory(master=self.root, initialdir='C:\\', title="Select your Source directory")
这只是返回您选择的文件夹的绝对路径。当您不选择任何内容时,它将返回“
您也可以突出显示您得到的输出吗?vs你期望的输出?谢谢,酷云,我已经添加了输出(打印声明)。太好了!谢谢你——这一课我会记住的。:)