Python 如何使用Tkinter中的相同对话框浏览和选择文件和目录?

Python 如何使用Tkinter中的相同对话框浏览和选择文件和目录?,python,tkinter,Python,Tkinter,我正在使用Tkinter为python脚本构建GUI。我需要一个按钮,打开一个对话框,让我选择文件和目录。 到现在为止,我遇到过 tkFileDialog.askdirectory(parent=root, title=dirtext1) 只允许在对话框中选择目录 以及 这样我就可以选择文件了。到目前为止,我使用单独的按钮访问这些对话框,每个按钮调用其中一个函数。 是否可以使用单个对话框选择文件或文件夹?我不这么认为。没有内置类可以轻松完成这项工作 调查 如果查看tkFileDialog模块的

我正在使用Tkinter为python脚本构建GUI。我需要一个按钮,打开一个对话框,让我选择文件和目录。 到现在为止,我遇到过

tkFileDialog.askdirectory(parent=root, title=dirtext1)
只允许在对话框中选择目录 以及

这样我就可以选择文件了。到目前为止,我使用单独的按钮访问这些对话框,每个按钮调用其中一个函数。
是否可以使用单个对话框选择文件或文件夹?

我不这么认为。没有内置类可以轻松完成这项工作

调查

如果查看
tkFileDialog
模块的源代码,则
打开的
类和
目录
类都继承自
\u对话框
,位于
tkCommonDialog

到目前为止还不错;这些类很简单,只扩展了两个方法
\u fixresult
是一个钩子,它根据您的选项进行过滤(有希望),并且
\u fixoptions
添加正确的tcl参数(如初始目录)

但是当我们进入Dialog类(Dialog的父类)时,我们看到它以给定的名称调用tcl命令。内置的名称是“tk_getOpenFile”和“tk_chooseddirectory”。在此之后,我们没有太多python级别的命令自由度。如果我们去看别的什么

看来你的选择是正确的

  • ttk::getOpenFile
  • ttk::getSaveFile
  • ttk::选择目录
  • ttk::getAppendFile
结论

老鼠!幸运的是,使用列表框、输入字段、按钮(和其他tk内置项)和操作系统模块创建自己的对话框应该很容易

简单的备选方案

从您的评论来看,这似乎是一个可行的简单解决方法

directory = os.path.dirname(os.path.realpath(tkFileDialog.askopenfilename()))
他们必须选择一个文件,但“打开”按钮将“返回路径”,即路径是从文件位置计算出来的

但我真的想要它


如果出于某种原因,您确实想要这种行为,但不想重新制作小部件,那么可以直接调用tcl脚本。可以从getOpenFile复制代码,并提供更松散的参数,以便选择更通用的对象。这不是我的专长,似乎是一个非常糟糕的主意,但这是您直接调用tcl的方式,您可以在这里了解有关底层命令的更多信息。

我不这么认为。没有内置类可以轻松完成这项工作

调查

如果查看
tkFileDialog
模块的源代码,则
打开的
类和
目录
类都继承自
\u对话框
,位于
tkCommonDialog

到目前为止还不错;这些类很简单,只扩展了两个方法
\u fixresult
是一个钩子,它根据您的选项进行过滤(有希望),并且
\u fixoptions
添加正确的tcl参数(如初始目录)

但是当我们进入Dialog类(Dialog的父类)时,我们看到它以给定的名称调用tcl命令。内置的名称是“tk_getOpenFile”和“tk_chooseddirectory”。在此之后,我们没有太多python级别的命令自由度。如果我们去看别的什么

看来你的选择是正确的

  • ttk::getOpenFile
  • ttk::getSaveFile
  • ttk::选择目录
  • ttk::getAppendFile
结论

老鼠!幸运的是,使用列表框、输入字段、按钮(和其他tk内置项)和操作系统模块创建自己的对话框应该很容易

简单的备选方案

从您的评论来看,这似乎是一个可行的简单解决方法

directory = os.path.dirname(os.path.realpath(tkFileDialog.askopenfilename()))
他们必须选择一个文件,但“打开”按钮将“返回路径”,即路径是从文件位置计算出来的

但我真的想要它

如果出于某种原因,您确实想要这种行为,但不想重新制作小部件,那么可以直接调用tcl脚本。可以从getOpenFile复制代码,并提供更松散的参数,以便选择更通用的对象。这不是我的专长,似乎是一个非常糟糕的主意,但这是您直接调用tcl的方式,也是您可以了解有关底层命令的更多信息的地方。

我也遇到过类似的问题。 最后,我使用askopenfilenames()(复数)并从文件中分割路径。然后使用单选按钮,要求用户选择是要处理目录中的所有文件,还是只处理他们选择的文件

filetypes = [('All files', '*.*'), ('CSV files', '*.csv'),]
data_list = askopenfilenames(title='Select folder', filetypes=filetypes)
data_dir = data_list[0].rsplit('/', 1)[0]
我之所以提到它,是因为askopenfilenames()没有得到太多建议,但更接近于选择一个文件夹,就像ctrl+a all files一样。

我也遇到过类似的问题。 最后,我使用askopenfilenames()(复数)并从文件中分割路径。然后使用单选按钮,要求用户选择是要处理目录中的所有文件,还是只处理他们选择的文件

filetypes = [('All files', '*.*'), ('CSV files', '*.csv'),]
data_list = askopenfilenames(title='Select folder', filetypes=filetypes)
data_dir = data_list[0].rsplit('/', 1)[0]

我之所以提到它,是因为askopenfilenames()没有得到太多建议,但更接近于选择一个文件夹,ctrl+a也可以选择所有文件。

当按下按钮时,是否要依次调用
askdirectory()
askopenfilename()
,我想有一个共同的对话框来选择文件或文件夹。(编辑问题以澄清这一点)虽然它们在tkinter中没有真正做到这一点的内置方式,但您可以要求用户使用
tkinter.askopenfilename()
选择一个文件,然后在所选文件上使用
os.path.dirname()
,以获取选择文件的目录,有效地从同一个对话框返回文件和目录。那就太好了