2012-02-16 10 views
57

Ho un semplice script che analizza un file e carica il suo contenuto in un database. Non ho bisogno di un'interfaccia utente, ma in questo momento sto chiedendo all'utente di analizzare il file utilizzando raw_input che è il più ostile, soprattutto perché l'utente non può copiare/incollare il percorso. Vorrei un modo facile e veloce per presentare all'utente una finestra di selezione dei file, che possono selezionare il file e quindi caricarlo nel database. (Nel mio caso d'uso, se è successo a scegliere il file sbagliato, fallirebbe l'analisi, e non sarebbe un problema, anche se è stato caricato nel database.)Finestra di dialogo dei file semplice e veloce in Python?

import tkFileDialog 
file_path_string = tkFileDialog.askopenfilename() 

Questo codice è vicino a quello che Voglio, ma lascia aperta una fastidiosa cornice vuota (che non può essere chiusa, probabilmente perché non ho registrato un gestore di eventi chiuso).

Non è necessario utilizzare tkInter, ma dal momento che si trova nella libreria standard Python è un buon candidato per la soluzione più rapida e semplice.

Qual è un modo semplice e veloce per richiedere un file o un nome file in uno script senza alcuna altra UI?

+0

piccola correzione: è possibile incollare in un terminale (sembra che tu sia su Windows) facendo clic con il pulsante destro del mouse nell'area di testo e selezionando "Incolla" dal menu di scelta rapida. – Deestan

+1

Nessun menu di scelta rapida è disponibile in un prompt raw_input di Python. – Buttons840

+2

raw_input avviene nel terminale, che ha un menu di scelta rapida. – Deestan

risposta

108

Tkinter è il modo più semplice se non si vuole avere eventuali altre dipendenze. Per visualizzare solo la finestra di dialogo senza altri elementi GUI, si deve nascondere la finestra principale con il metodo withdraw:

import tkinter as tk 
from tkinter import filedialog 

root = tk.Tk() 
root.withdraw() 

file_path = filedialog.askopenfilename() 

Python 2 variante:

import Tkinter, tkFileDialog 

root = Tkinter.Tk() 
root.withdraw() 

file_path = tkFileDialog.askopenfilename() 
+3

Questa dovrebbe essere la risposta accettata. È semplice, efficace e finché non si creano nuove finestre Tk di root più e più volte, va bene (e per non dire che è esattamente la risposta che stavo cercando quando ho trovato questo thread). – Andrew

+2

L'ho usato solo per il mio lavoro. Funziona benissimo su Fedora, ma su Ubuntu fa scomparire qualsiasi cifra matplotlib che segue. Praticamente dopo pylab.show() si blocca. Sono ancora in grado di digitare il terminale, ma non succede nulla. Anche la CPU passa allo 0% per il mio programma. Qualche consiglio? – Diana

+15

Su python3: 'tkinter.filedialog.askopenfilename()' – jfs

4

Se non è necessaria l'interfaccia utente o si prevede che il programma venga eseguito in una CLI, è possibile analizzare il percorso file come argomento. Ciò ti consentirebbe di utilizzare la funzione di completamento automatico della tua CLI per trovare rapidamente il file che ti serve.

Questo probabilmente sarebbe utile solo se lo script non è interattivo oltre all'input del percorso file.

+0

Questa è una soluzione valida, anche se mi sento triste dentro ogni volta che devo usare la riga di comando di Windows. Sono in un ambiente Windows. – Buttons840

+2

Vedo. La CLI di Windows è così negativa rispetto a Unix. Capisco perché un raccoglitore di file sarebbe pulito. Immagino forse trascinare e rilasciare il file sullo script e quindi leggere il nome del file come argomento? (http://mindlesstechnology.wordpress.com/2008/03/29/make-python-scripts-droppable-in-windows/) Ciò lo renderebbe molto più semplice se non implicasse la copia fisica del file. Non sono su un bancomat di Windows, quindi non posso testare come si comporta. È possibile distribuire facilmente la modifica del registro in un file .reg se è necessario installarlo su più macchine. – SQDK

+0

In alternativa è possibile avere un file .bat passare il nome del file allo script come argomento. Questo non coinvolge alcun hack del Registro di sistema. – SQDK

2

Partenza EasyGUI, molto facile da usare modulo che dovrebbe fare il lavoro - http://easygui.sourceforge.net/

Si potrebbe utilizzare la funzione fileopenbox - http://www.ferg.org/easygui/easygui.html#-fileopenbox

+1

Perché dovrei? Ti va di dare qualche esempio? – Buttons840

+1

Mi dispiace - sul mio telefono quindi non posso dare un esempio. Si desidera utilizzare il fileopenbox - http://www.ferg.org/easygui/easygui.html#-fileopenbox – timc

+1

Non sono riuscito a trovare un collegamento per il download per easygui. Ho provato a easy_install easyGui, ma non è riuscito (Pypi dice di scaricare da una pagina 404'ed). Nel complesso, non è stato molto facile. – Buttons840

17

È possibile utilizzare easygui:

import easygui 

path = easygui.fileopenbox() 

Per installa easygui, è possibile utilizzare pip:

pip3 install easygui 

È un singolo modulo Python puro (easygui.py) che utilizza tkinter.

+3

Il progetto easygui è stato arrestato, non ulteriormente aggiornato - attualmente genera un errore/eccezione durante l'esecuzione su Python 3.5, forse considera altre opzioni – pepe

+2

@pepe: Non vedo alcun avviso in [il repository del progetto] (https://github.com/robertlugg/easygui) (l'ultimo commit è il 15 maggio) – jfs

+0

buono a sapersi, thx, forse qualcuno lo ha prelevato: vedi https://easygui.wordpress.com/2013/03/06/easygui-project -shuts-down-2/ – pepe

14

Prova con wxPython:

import wx 

def get_path(wildcard): 
    app = wx.App(None) 
    style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST 
    dialog = wx.FileDialog(None, 'Open', wildcard=wildcard, style=style) 
    if dialog.ShowModal() == wx.ID_OK: 
     path = dialog.GetPath() 
    else: 
     path = None 
    dialog.Destroy() 
    return path 

print get_path('*.txt') 
Problemi correlati