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 ?

6voto

SQDK Points 3177

Si vous n'avez pas besoin de l'interface utilisateur ou si vous souhaitez que le programme s'exécute dans une interface de programmation, vous pouvez analyser le chemin d'accès au fichier en tant qu'argument. Cela vous permettrait d'utiliser la fonction d'autocomplétion de votre CLI pour trouver rapidement le fichier dont vous avez besoin.

Cela ne serait probablement utile que si le script n'est pas interactif en dehors de l'entrée du chemin d'accès au fichier.

4voto

Daemon Points 1

Une autre option os-agnostique consiste à utiliser pywebview :

import webview

def webview_file_dialog():
    file = None
    def open_file_dialog(w):
        nonlocal file
        try:
            file = w.create_file_dialog(webview.OPEN_DIALOG)[0]
        except TypeError:
            pass  # user exited file dialog without picking
        finally:
            w.destroy()
    window = webview.create_window("", hidden=True)
    webview.start(open_file_dialog, window)
    # file will either be a string or None
    return file

print(webview_file_dialog())

Environnement : python3.8.6 sur Mac - bien que j'ai déjà utilisé pywebview sur Windows 10.

0voto

Kiki Jewell Points 366

Je viens de tomber sur cette petite astuce pour Windows uniquement : exécuter powershell.exe à partir d'un sous-processus.

import subprocess

sys_const = ssfDESKTOP # Starts at the top level
# sys_const = 0x2a # Correct value for "Program Files (0x86)" folder
powershell_browse = "(new-object -COM 'Shell.Application')."
powershell_browse += "BrowseForFolder(0,'window title here',0,sys_const).self.path"

ret = subprocess.run(["powershell.exe",powershell_browse], stdout=subprocess.PIPE)
print(ret.stdout.decode())

Notez l'utilisation facultative de constantes de dossier système. (Il y a une obscure coquille dans shldisp.h qui fait que la constante "Program Files (0x86)" a été mal assignée. J'ai ajouté un commentaire avec la valeur correcte. Il m'a fallu un peu de temps pour le découvrir).

Plus d'informations ci-dessous :

Constantes du dossier système

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