web-dev-qa-db-fra.com

Dialogue de fichier rapide et facile en Python?

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?

84
Buttons840

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()
158
tomvodi

Vous pouvez utiliser easygui :

import easygui

path = easygui.fileopenbox()

Pour installer easygui , vous pouvez utiliser pip:

pip3 install easygui

Il s'agit d'un seul module pur Python (easygui.py) qui utilise tkinter.

21
jfs

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')
16
FogleBird

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.

4
SQDK

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

2
timc

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
0
Kevin Smyth