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

时间:2016-03-25 16:49:28

标签: python tkinter

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

tkFileDialog.askdirectory(parent=root, title=dirtext1)

只允许在对话框中选择目录 而且,

tkFileDialog.askopenfilename(parent=root, title=filetext)

允许我只选择文件。截至目前,我使用单独的按钮访问这些对话框,每个按钮调用其中一个功能。 无论如何使用单个对话框选择文件或文件夹?

2 个答案:

答案 0 :(得分:7)

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

<强>研究

如果您查看tkFileDialog模块的源代码,OpenDirectory类都会从位于_Dialog的{​​{1}}继承。

到目前为止很好;这些类很简单,只扩展了两个方法。 tkCommonDialog是一个基于您的选项(有希望的)过滤的钩子,_fixresult添加了正确的tcl参数(如初始目录)。

但是当我们到达Dialog类(_Dialog的父级)时,我们看到它通过给定名称调用tcl命令。内置的名称是“tk_getOpenFile”和“tk_chooseDirectory”。在此之后我们没有很多python级别的命令自由。如果我们去看看其他tcl scripts are avaliable, we are disappointed

看起来你的选择

  • _fixoptions
  • ttk::getOpenFile
  • ttk::getSaveFile
  • ttk::chooseDirectory

<强>结论

大鼠!幸运的是,使用列表框,输入字段,按钮(和其他tk-builtins)以及os模块创建自己的对话框应该很容易。

简单替代

从您的评论中看,似乎可行的简单解决方法可能是使用

ttk::getAppendFile

他们必须选择一个文件,但“打开”按钮将“返回路径”,从路径是从文件位置计算

但我真的很想要它!

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

答案 1 :(得分:0)

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

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

之所以提及它,是因为askopenfilename s ()并没有得到太多建议,但是更接近选择文件夹的位置,就像ctrl + A所有文件一样。