Escolhendo um arquivo em Python com caixa de diálogo simples

127

Gostaria de obter o caminho do arquivo como entrada no meu aplicativo de console Python.

Atualmente, só posso solicitar o caminho completo como uma entrada no console.

Existe uma maneira de acionar uma interface de usuário simples em que os usuários possam selecionar o arquivo em vez de digitar o caminho completo?

Mustafa Zengin
fonte

Respostas:

212

Que tal usar o tkinter?

from Tkinter import Tk
from tkinter.filedialog import askopenfilename

Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

Feito!

Etaoin
fonte
Eu recebi TypeError: o objeto 'module' não pode ser chamado em Tk (). Retirada () - alguma idéia?
user391339
1
Eu tive que fazer root = Tk.Tk () e depois root.withdraw (). Agora, a janela de diálogo de arquivo aberto não fecha.
user391339
20
Usando o Python 3.xe acredito que "Tkinter" deve ser todo em minúsculas, "tkinter".
WestAce 29/06
1
@WestAce sim, foi alterado de "Tkinter" para "tkinter" para Python3
Ben
1
Existe alguma maneira de permitir apenas certos tipos de arquivos? por exemplo. Quero que o usuário selecione apenas arquivos de imagem
Shantanu Shinde
85

Versão do Python 3.x da resposta da Etaoin quanto à integridade:

from tkinter.filedialog import askopenfilename
filename = askopenfilename()
Stefano Palazzo
fonte
7
Para paralelismo total, provavelmente também deve ter import tkinter+ tkinter.Tk().withdraw().
precisa saber é o seguinte
4
isso não funciona para mim (no Mac, Python 3.6.6) A janela GUI é aberto, mas você não pode fechá-lo e você começa beachball da morte
Ben Vincent
1
o mesmo aqui. o diálogo de arquivo não vai fechar
Cabara
1
esse código é exatamente o mesmo que a resposta aceita, mas incompleto.
eric
No Mac 10.14.6, isso abriu o Localizador de arquivos e depois travou todo o sistema :(
gaya
29

Com o EasyGui (documentação gerada pelo pydoc e epydoc para a versão 0.96):

import easygui
print(easygui.fileopenbox())

Para instalar:

pip install easygui

Demo:

import easygui
easygui.egdemo()
jfs
fonte
4
Esta é a melhor solução até agora. A principal razão é que EasyGUI é um pacote de pip e fácil de instalar
Yonatan Naor
2
No Mac OSX 10.14.5, python 3.6.7, easygui 0.98.1, recebo uma falha horrível ao tentar isso. Não recomendado.
Christopher Barber
Por que estou recebendo invalid syntaxerro print easygui.diropenbox()?
Bricktop
1
@ChristopherBarber mesmo com 10.14.6. Python continua saindo.
gaya
11

No Python 2, use o tkFileDialogmódulo

import tkFileDialog

tkFileDialog.askopenfilename()

No Python 3, use o tkinter.filedialogmódulo

import tkinter.filedialog

tkinter.filedialog.askopenfilename()
Gary Kerr
fonte
Não faz parte da instalação padrão no Python 3.
miguelmorin 25/09/19
3

Outra opção a considerar é o Zenity: http://freecode.com/projects/zenity .

Eu tive uma situação em que estava desenvolvendo um aplicativo de servidor Python (nenhum componente da GUI) e, portanto, não queria introduzir uma dependência em nenhum kit de ferramentas da GUI do python, mas queria que alguns dos meus scripts de depuração fossem parametrizados pelos arquivos de entrada e quisesse solicitar visualmente ao usuário um arquivo se ele não especificou um na linha de comando. Zenity foi um ajuste perfeito. Para conseguir isso, chame "zenity --file-selection" usando o módulo de subprocesso e capture o stdout. Obviamente, esta solução não é específica para Python.

O Zenity suporta várias plataformas e já estava instalado em nossos servidores de desenvolvimento, facilitando nossa depuração / desenvolvimento sem introduzir uma dependência indesejada.

kylejmcintyre
fonte
0

Obtive resultados muito melhores com o wxPython do que com o tkinter, conforme sugerido nesta resposta a uma pergunta duplicada posterior:

https://stackoverflow.com/a/9319832

A versão wxPython produziu o diálogo de arquivo que parecia o mesmo do arquivo aberto de praticamente qualquer outro aplicativo na minha instalação do OpenSUSE Tumbleweed com a área de trabalho do xfce, enquanto o tkinter produziu algo apertado e difícil de ler com uma interface de rolagem lateral desconhecida.

Glen Whitney
fonte