Добавить несколько расширений в один тип файлов mac — tkinter/filedialog/askopenfilename

Я пытаюсь использовать tkinter.filedialog для выбора файла на Mac.

Он отлично работает с одним типом файла следующим образом:

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

Однако я хочу выбрать файлы xlsx или xls. Я искал и нашел вопрос filedialog, tkinter и открытие файлов. Я использую аналогичный способ, но он не работает с Mac, если я перейду на этот:

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

Как мне изменить выбор файлов xlsx или xls в диалоговом окне файлов?


person Joe    schedule 07.06.2017    source источник


Ответы (3)


Кажется, что вы должны разделять шаблоны подстановочных знаков пробелом, а не ; (проверено на 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.
  • Точно так же поведение сопоставления части базового имени файла — например, foo.txt или foo*.txt — похоже, зависит от платформы: в Windows это работает с предваряемым * (*foo.txt и *foo*.txt), тогда как в macOS они, похоже, ничему не соответствуют.

Если поведение, зависящее от платформы, связано с разными версиями tkinter, сообщите нам об этом.


[1] Якуб Блаха сообщает, что "*.xlsx *.xls" на самом деле не работает для него в Python 3.7.4 на Windows 10 версии 1903 (хотя такой проблемы я не вижу); на всякий случай опустите *, если он не нужен.

person mklement0    schedule 07.06.2017

По крайней мере, в Windows, если вы хотите иметь возможность открывать несколько типов файлов, но всегда только по одному, ваш код должен выглядеть так:

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

Если вы хотите иметь возможность выбирать оба типа файлов одновременно, не переключаясь между ними, они должны иметь одинаковое имя.

filedialog.askopenfilename(filetypes=[("Excel file","*.xlsx"),("Excel file", "*.xls")])
person J.P.    schedule 02.08.2018

Несколько расширений в Windows 10 работают у меня так. Например, поиск файлов 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",
                                                          "*.*")))
person LetzerWille    schedule 31.12.2020