148 votes

Dialogue rapide et facile sur les fichiers en Python ?

J'ai un simple script 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 le fichier à analyser en utilisant la commande raw_input ce qui est très rébarbatif, 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, il peut sélectionner le fichier, puis il est chargé dans la base de données. (Dans mon cas d'utilisation, si l'utilisateur choisit le mauvais fichier, l'analyse échouera et ce ne sera pas un problème même si le fichier est 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 ennuyeux ouvert (qui ne peut pas être fermé, probablement parce que je n'ai pas enregistré de gestionnaire d'événement de fermeture).

Je ne suis pas obligé d'utiliser tkInter, mais comme il fait partie de la bibliothèque standard de Python, c'est un bon candidat pour la solution la plus rapide et la plus facile.

Quel est le moyen le plus simple et le plus rapide de demander un fichier ou un nom de fichier dans un script sans aucune autre interface utilisateur ?

307voto

tomvodi Points 3559

Tkinter est le moyen le plus simple si vous ne voulez pas avoir d'autres dépendances. Pour n'afficher que le dialogue sans aucun autre élément de l'interface graphique, vous devez masquer la fenêtre racine à l'aide de la fonction withdraw méthode :

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

35voto

J.F. Sebastian Points 102961

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 Python pur ( easygui.py ) qui utilise tkinter .

26voto

FogleBird Points 23405

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

8voto

Kevin Smyth Points 351

pywin32 permet d'accéder à la GetOpenFileName fonction win32. A partir 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

8voto

TarmoPikaro Points 11

En utilisant tkinter (python 2) ou Tkinter (python 3) il est en effet possible d'afficher un dialogue d'ouverture de fichier (Voir d'autres réponses ici). Notez cependant que l'interface utilisateur de cette boîte de dialogue est obsolète et ne correspond pas aux nouvelles boîtes de dialogue d'ouverture de fichiers disponibles dans Windows 10.

De plus, si vous cherchez un moyen d'intégrer le support python dans votre propre application, vous découvrirez rapidement que la bibliothèque tkinter n'est pas un code source ouvert et qu'il s'agit même d'une bibliothèque commerciale.

(Par exemple, une recherche sur "activetcl pricing" vous conduira à cette page web : https://reviews.financesonline.com/p/activetcl/ )

La bibliothèque tkinter coûtera donc de l'argent à toute application souhaitant intégrer python.

J'ai réussi à trouver la bibliothèque pythonnet :

(Licence MIT)

La commande suivante permet d'installer pythonnet :

pip3 install pythonnet

Vous trouverez ici un exemple d'utilisation de la boîte de dialogue Ouvrir un fichier :

https://stackoverflow.com/a/50446803/2338477

Permettez-moi de copier un exemple ici aussi :

import sys
import ctypes
co_initialize = ctypes.windll.ole32.CoInitialize
#   Force STA mode
co_initialize(None)

import clr 

clr.AddReference('System.Windows.Forms')

from System.Windows.Forms import OpenFileDialog

file_dialog = OpenFileDialog()
ret = file_dialog.ShowDialog()
if ret != 1:
    print("Cancelled")
    sys.exit()

print(file_dialog.FileName)

Si l'interface utilisateur plus complexe vous manque également - voir Demo dossier dans pythonnet git.

Je ne suis pas sûr de la portabilité sur d'autres systèmes d'exploitation, je n'ai pas essayé, mais .net 5 est prévu pour être porté sur plusieurs systèmes d'exploitation (Recherche " .net 5 platforms "), https://devblogs.microsoft.com/dotnet/introducing-net-5/ ) - cette technologie est donc également à l'épreuve du temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X