25

I am trying to use tkinter.filedialog to choose the file in Mac.

It works fine with one filetype in this way:

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

However, I want to choose either xlsx or xls files. I searched and found a question filedialog, tkinter and opening files. I use the similar way but it does not work with Mac if I change to this:

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

How should I change to choose either xlsx or xls files in the file dialog?

Chris Collett
  • 1,074
  • 10
  • 15
Joe
  • 365
  • 1
  • 3
  • 8

4 Answers4

50

It seems that you must separate the wildcard patterns with a space rather than ; (verified on 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")])

Note:

  • While "*.xlsx *.xls" would work too (at least on Windows and macOS), the initial * isn't necessary.[1]
  • Whether .* or *.* works (no filter) seems to be platform-dependent; omitting filetypes is the better option in that case.
  • Similarly, the behavior of matching part of the base filename - something like foo.txt or foo*.txt - appears to be platform-dependent: on Windows, these do work, with a prepended * (*foo.txt and *foo*.txt), whereas on macOS they seem to match nothing.

If the platform-dependent behaviors are instead / also linked to different tkinter versions, do let us know.


[1] Jakub Bláha reports that "*.xlsx *.xls" didn't actually work for him in Python 3.7.4 on Windows 10 version 1903 (though I don't see the same problem); to be safe, omit the * if not needed.

mklement0
  • 382,024
  • 64
  • 607
  • 775
8

At least on Windows, if you want to be able to open multiple filetypes but always only one at a time, your code has to look like this:

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

If you want to be able to select both file types at the same time without switching between them, they need to have the same name.

filedialog.askopenfilename(filetypes=[("Excel file","*.xlsx"),("Excel file", "*.xls")])
J.P.
  • 83
  • 1
  • 4
1

Multiple extensions on Windows 10 work for me like this. For example searching for python files.

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",
                                                          "*.*")))
LetzerWille
  • 5,355
  • 4
  • 23
  • 26
0
filedialog.askopenfilename(initialdir="/",title="Select an Image",filetypes=[("PNG","asterisk.png"),("JPG","asterisk.jpg"),("JPEG","asterisk.jpeg"),("ICON","asterisk.ico")])

In order to use multiple file types, you have to add each file type you want to include as an individual 2-tuple combined in list separated by comma. Or if you want to allow all file types you can try: ("All Files","asterisk.asterisk").

Note: Please use actual asterisk symbol from keyboard