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

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

直到现在,我才遇到过

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

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

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

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

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

调查

如果查看tkFileDialog模块的源代码,Open类和Directory类都继承自位于tkCommonDialog的_Dialog.

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

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

看起来你的选择

> ttk :: getOpenFile
> ttk :: getSaveFile
> ttk :: chooseDirectory
> ttk :: getAppendFile

结论

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

简单的选择

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

directory = os.path.dirname(os.path.realpath(tkFileDialog.askopenfilename()))

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

但我真的很想要它!

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

点赞