J'ai un script simple qui analyse un fichier et charge son contenu dans une base de données. Je n'ai pas besoin d'une interface utilisateur, mais pour l'instant, je demande à l'utilisateur que le fichier soit analysé à l'aide de raw_input
, ce qui est très désagréable, notamment parce que l'utilisateur ne peut pas copier/coller le chemin. Je voudrais un moyen rapide et facile de présenter une boîte de dialogue de sélection de fichier à l'utilisateur. Ce dernier peut sélectionner le fichier, puis il est chargé dans la base de données. (Dans mon cas d'utilisation, s'ils choisissaient le mauvais fichier, l'analyse échouerait et ce ne serait pas un problème même s'il était chargé dans la base de données.)
import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()
Ce code est proche de ce que je veux, mais il laisse un cadre vide gênant ouvert (qui ne peut pas être fermé, probablement parce que je n'ai pas enregistré de gestionnaire d'événement proche).
Je n'ai pas besoin d'utiliser tkInter, mais comme il se trouve dans la bibliothèque standard Python, c'est un bon candidat pour la solution la plus rapide et la plus simple.
Quel est un moyen rapide et facile de demander un fichier ou un nom de fichier dans un script sans autre interface utilisateur?
Tkinter est le moyen le plus simple si vous ne voulez pas avoir d'autres dépendances. Pour afficher uniquement la boîte de dialogue sans aucun autre élément de l'interface graphique, vous devez masquer la fenêtre racine à l'aide de la méthode withdraw
:
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
Variante Python 2:
import Tkinter, tkFileDialog
root = Tkinter.Tk()
root.withdraw()
file_path = tkFileDialog.askopenfilename()
Essayez avec 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')
Si vous n'avez pas besoin de l'interface utilisateur ou si le programme ne s'exécute pas dans une interface de ligne de commande, vous pouvez analyser le chemin d'accès au fichier en tant qu'argument. Cela vous permettrait d'utiliser la fonctionnalité de saisie semi-automatique de votre CLI pour trouver rapidement le fichier dont vous avez besoin.
Cela ne sera probablement utile que si le script est non interactif en plus de l’entrée du chemin du fichier.
Découvrez EasyGUI, un module très facile à utiliser qui devrait faire l'affaire - http://easygui.sourceforge.net/
Vous utiliseriez la fonction fileopenbox détaillée sur cette page de documentation de l'API - https://easygui.readthedocs.io/en/latest/api.html
pywin32
donne accès à la fonction GetOpenFileName
win32. De la exemple
import win32gui, win32con, os
filter='Python Scripts\0*.py;*.pyw;*.pys\0Text files\0*.txt\0'
customfilter='Other file types\0*.*\0'
fname, customfilter, flags=win32gui.GetOpenFileNameW(
InitialDir=os.environ['temp'],
Flags=win32con.OFN_ALLOWMULTISELECT|win32con.OFN_Explorer,
File='somefilename', DefExt='py',
Title='GetOpenFileNameW',
Filter=filter,
CustomFilter=customfilter,
FilterIndex=0)
print 'open file names:', repr(fname)
print 'filter used:', repr(customfilter)
print 'Flags:', flags
for k,v in win32con.__dict__.items():
if k.startswith('OFN_') and flags & v:
print '\t'+k