Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter,tkinter.askdirectory()在用户点击';取消';或“X出”,或按Esc键退出窗口_Python_Python 3.x_Tkinter_Filedialog - Fatal编程技术网

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你期望的输出?谢谢,酷云,我已经添加了输出(打印声明)。太好了!谢谢你——这一课我会记住的。:)