繁体   English   中英

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

[英]How can I use the same dialog box in Tkinter to browse and select files and directories?

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

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

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

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

这允许我只选择文件。 到目前为止,我使用单独的按钮访问这些对话框,每个按钮调用这些功能之一。 无论如何可以使用单个对话框选择文件或文件夹吗?

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

调查

如果您查看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 内置函数)和 os 模块制作自己的对话框应该很容易。

简单替代

从您的评论看来,一个可行的简单解决方法可能是使用

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

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

但我真的很想要!

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

我有过类似的问题。 最后,我使用 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 所有文件一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM