Wybór pliku w Pythonie za pomocą prostego okna dialogowego

127

Chciałbym uzyskać ścieżkę do pliku jako dane wejściowe w mojej aplikacji konsoli Pythona.

Obecnie mogę tylko poprosić o pełną ścieżkę jako dane wejściowe w konsoli.

Czy istnieje sposób na wywołanie prostego interfejsu użytkownika, w którym użytkownicy mogą wybrać plik zamiast wpisywać pełną ścieżkę?

Mustafa Zengin
źródło

Odpowiedzi:

212

A co powiesz na używanie 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)

Gotowe!

Etaoin
źródło
Otrzymałem TypeError: obiekt 'modułu' nie jest wywoływany przez Tk (). Wycofanie () - jakieś pomysły?
user391339
1
Musiałem zrobić root = Tk.Tk (), a następnie root.withdraw (). Teraz okno dialogowe otwierania pliku nie zamyka się jednak.
user391339
20
Używając Pythona 3.xi uważam, że „Tkinter” ma w rzeczywistości składać się wyłącznie z małych liter, „tkinter”.
WestAce
1
@WestAce tak, zostało zmienione z „Tkinter” na „tkinter” dla Python3
Ben,
1
Czy istnieje sposób, aby zezwolić tylko na określone typy plików? np. Chcę, aby użytkownik wybrał tylko pliki graficzne
Shantanu Shinde
85

Wersja odpowiedzi Etaoin w Pythonie 3.x dotycząca kompletności:

from tkinter.filedialog import askopenfilename
filename = askopenfilename()
Stefano Palazzo
źródło
7
Aby uzyskać całkowitą równoległość, prawdopodobnie powinien również mieć import tkinter+ tkinter.Tk().withdraw().
imallett
4
to nie działa dla mnie (na Mac, Python 3.6.6) otwiera się okno GUI, ale nie można go zamknąć, a otrzymasz beachball śmierci
Ben Vincent
1
to samo tutaj. okno dialogowe pliku nie zamyka się
Cabara
1
ten kod jest dokładnie taki sam, jak zaakceptowana odpowiedź, ale jest niekompletny.
eric
W systemie Mac 10.14.6 otworzyło to wyszukiwarkę plików, a następnie spowodowało awarię całego systemu :(
gaya
29

Z EasyGui (dokumentacja generowane przez pydoc i epydoc dla wersji 0.96):

import easygui
print(easygui.fileopenbox())

Żeby zainstalować:

pip install easygui

Próbny:

import easygui
easygui.egdemo()
jfs
źródło
4
Jak dotąd to najlepsze rozwiązanie. Głównym powodem jest to, że easygui jest pakietem pip i jest łatwy w instalacji
Yonatan Naor,
2
W systemie Mac OSX 10.14.5, python 3.6.7, easygui 0.98.1 dostaję straszną awarię, kiedy próbuję. Niepolecane.
Christopher Barber
Dlaczego otrzymuję invalid syntaxbłąd print easygui.diropenbox()?
Bricktop
1
@ChristopherBarber to samo z 10.14.6. Python po prostu wychodzi.
gaya
11

W Pythonie 2 użyj tkFileDialogmodułu module.

import tkFileDialog

tkFileDialog.askopenfilename()

W Pythonie 3 użyj tkinter.filedialogmodułu.

import tkinter.filedialog

tkinter.filedialog.askopenfilename()
Gary Kerr
źródło
Nie jest częścią standardowej instalacji w Pythonie 3.
miguelmorin
3

Inną opcją do rozważenia jest Zenity: http://freecode.com/projects/zenity .

Miałem sytuację, w której tworzyłem aplikację serwerową w Pythonie (bez komponentu GUI) i dlatego nie chciałem wprowadzać zależności od żadnych zestawów narzędzi GUI w języku Python, ale chciałem, aby niektóre z moich skryptów debugowania były sparametryzowane przez pliki wejściowe i chciałem wizualnie pytaj użytkownika o plik, jeśli nie podał go w wierszu poleceń. Zenity idealnie pasowało. Aby to osiągnąć, wywołaj "zenity --file-selection" używając modułu podprocesu i przechwyć standardowe wyjście. Oczywiście to rozwiązanie nie jest specyficzne dla Pythona.

Zenity obsługuje wiele platform i zdarzyło się, że zostało już zainstalowane na naszych serwerach deweloperskich, więc ułatwiło nam debugowanie / rozwój bez wprowadzania niechcianej zależności.

kylejmcintyre
źródło
0

Uzyskałem znacznie lepsze wyniki z wxPythonem niż tkinter, jak sugeruje ta odpowiedź na późniejsze zduplikowane pytanie:

https://stackoverflow.com/a/9319832

Wersja wxPython utworzyła okno dialogowe pliku, które wyglądało tak samo, jak okno dialogowe otwierania pliku z niemal każdej innej aplikacji na mojej instalacji OpenSUSE Tumbleweed z pulpitem xfce, podczas gdy tkinter stworzył coś ciasnego i trudnego do odczytania z nieznanym interfejsem przewijania bocznego.

Glen Whitney
źródło