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

Dhr*_*ick 3 python tkinter

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

tkFileDialog.askdirectory(parent=root, title=dirtext1)
Run Code Online (Sandbox Code Playgroud)

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

tkFileDialog.askopenfilename(parent=root, title=filetext)
Run Code Online (Sandbox Code Playgroud)

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

en_*_*ght 7

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

调查

如果你看一下tkFileDialog模块的源代码,那么它们OpenDirectory类都继承自_Dialog,位于tkCommonDialog.

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

但是当我们到达Dialog类(_Dialog的父级)时,我们看到它通过给定名称调用tcl命令.内置的名称是"tk_getOpenFile"和"tk_chooseDirectory".在此之后我们没有很多python级别的命令自由.如果我们去看看其他tcl脚本是否可用,我们会感到失望.

看起来你的选择

  • ttk::getOpenFile
  • ttk::getSaveFile
  • ttk::chooseDirectory
  • ttk::getAppendFile

结论

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

简单的选择

从您的评论来看,它似乎是一个可行的简单解决方案可能会使用

directory = os.path.dirname(os.path.realpath(tkFileDialog.askopenfilename()))
Run Code Online (Sandbox Code Playgroud)

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

但我真的很想要它!

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