在一种文件类型中添加多个扩展名 mac - tkinter/filedialog/askopenfilename

Add multiple extensions in one filetypes mac - tkinter/filedialog/askopenfilename

我正在尝试使用 tkinter.filedialog 选择 Mac 中的文件。

以这种方式对一种文件类型工作正常:

filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")])

但是,我想选择 xlsxxls 文件。我搜索了一下,发现了一个问题filedialog, tkinter and opening files。我使用类似的方式,但如果我更改为 Mac,它就无法使用:

filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx; *.xls")])

我应该如何更改以在文件对话框中选择 xlsxxls 文件?

看来你必须用 space 分隔通配符模式而不是 ;(在 Python 3.5.1 上验证) :

from tkinter import filedialog

# add `, initialdir="..."` to set the initial directory shown in the dialog
filedialog.askopenfilename(filetypes=[("Excel files", ".xlsx .xls")])

注:

  • 虽然 "*.xlsx *.xls" 也可以工作(至少在 Windows 和 macOS 上),但最初的 * 不是必需的。[1]
  • .**.* 是否有效(无过滤器)似乎取决于平台; 省略 filetypes 在这种情况下是更好的选择。
  • 类似地,匹配部分 base 文件名的行为 - 类似于 foo.txtfoo*.txt - 似乎与平台有关:在 Windows,这些确实有效,带有前缀 **foo.txt*foo*.txt),而在 macOS 上它们似乎不匹配。

如果依赖于平台的行为改为/也链接到不同的 tkinter 版本,请告诉我们。


[1] Jakub Bláha 报告说 "*.xlsx *.xls" 在 Windows 10 版本 1903 上的 Python 3.7.4 中实际上对他不起作用(虽然我没有看到同样的问题);为了安全起见,如果不需要,请省略 *

至少在 Windows,如果您希望能够打开多种文件类型但每次只能打开一种文件类型,您的代码必须如下所示:

filedialog.askopenfilename(filetypes=[("Excel file","*.xlsx"),("Excel file 97-2003","*.xls")])

如果您希望能够同时 select 两种文件类型而不在它们之间切换,它们需要具有相同的名称。

filedialog.askopenfilename(filetypes=[("Excel file","*.xlsx"),("Excel file", "*.xls")])

Windows10 上的多个扩展对我来说是这样的。例如搜索 python 个文件。

py_exts = r"*.py  *.py3 *.pyc  *.pyo  *.pyw  *.pyx  *.pyd  *.pxd  *.pyi  *.pyi  *.pyz  *.pywz *.rpy  *.pyde *.pyp  *.pyt  *.xpy  *.ipynb"  

filename = filedialog.askopenfilename(initialdir=SEEN,
                                              title="Select a File",
                                              filetypes=(("video files",
                                                          video_exts),
                                                         ("python files", py_exts),
                                                         ("all files",
                                                          "*.*")))
filedialog.askopenfilename(initialdir="/",title="Select an Image",filetypes=[("PNG","asterisk.png"),("JPG","asterisk.jpg"),("JPEG","asterisk.jpeg"),("ICON","asterisk.ico")])

为了使用多种文件类型,您必须将要包含的每种文件类型作为单独的二元组添加到以逗号分隔的列表中。或者,如果您想允许所有文件类型,您可以尝试:("All Files","asterisk.asterisk").

注意:请使用键盘输入的实际星号