4 votes

Faites glisser et déposez plusieurs fichiers en Python (Windows)

Je commence à apprendre Python, et j'ai pensé à créer un convertisseur d'un fichier à un autre (par exemple, de png à avi ou entre autres extensions de fichier) sous Windows OS pour l'instant.

J'ai écrit un script qui fonctionne bien et complète le processus de conversion, mais je veux l'améliorer en fonctionnalité (et ensuite en graphisme); J'utilise Tkinter et j'ai pensé à charger les fichiers avec la possibilité de les faire glisser-déposer comme entrée pour la prochaine commande de conversion, au lieu d'ouvrir un dossier dans lequel mettre les fichiers comme "source d'entrée". J'ai trouvé ce sujet (drag and drop explorer files to tkinter entry widget python) et je l'ai utilisé de cette façon:

import sys
import os
import Tkinter
from tkdnd_wrapper import TkDND
import shlex, subprocess
from subprocess import Popen, PIPE
import glob
import shutil

root = Tkinter.Tk()
dnd = TkDND(root)
entry = Tkinter.Entry()
entry.grid()

def handle(event):
    inputfilespath = event.data
    event.widget.insert(0, inputfilespath)
    filesdir = os.path.dirname(os.path.realpath(inputfilespath))
    files = glob.iglob(os.path.join(filesdir, "*.myext"))
    for inputfilespath in files:
        if os.path.isfile(inputfilespath):
            subprocess1 = subprocess.Popen([...commande de conversion donnée sous forme de liste, pas de chaîne...], shell=True)
            print "\n\nConversion en cours..."
            subprocess1.wait()
            subprocess1.terminate()
            print "\n\nProcessus terminé!"

dnd.bindtarget(entry, handle, 'text/uri-list')
root.mainloop()

Les problèmes:

  1. Si le nom du fichier contient un espace, il n'y a pas de conversion, et le processus se termine sans même notifier d'erreur. "inputfilespath" veut être le nom générique pour tous les fichiers d'entrée que j'ai sélectionnés, et (pour ce que j'ai lu) je ne peux pas (?) utiliser des guillemets pour une variable d'environnement espérant inclure les espaces blancs dans le nom de fichier...

  2. J'ai essayé de copier différents fichiers (avec la même extension de fichier et sans espace dans le nom de fichier) dans le même dossier, et si je fais glisser-déposer seulement un d'entre eux sur le widget Entry, le processus démarre bien (et c'est super!), mais il continue également pour tous les autres fichiers non-sélectionnés avec la même extension dans le même dossier, alors que si je fais glisser-déposer plusieurs fichiers sur le widget Entry, aucune conversion ne se produit....

3voto

Oblivion Points 941

Il semble que les noms de fichiers contenant des espaces blancs soient enveloppés dans des accolades (style de liste Tcl). Pour obtenir une liste de fichiers utilisable, vous devriez être capable de faire quelque chose comme :

import Tkinter
from untested_tkdnd_wrapper import TkDND

def handle(event):
    files = root.tk.splitlist(event.data)

    for filename in files:
        event.widget.insert('end', filename)

root = Tkinter.Tk()    
lb   = Tkinter.Listbox(root, width=50)
lb.pack(fill='both', expand=1)

dnd = TkDND(root)
dnd.bindtarget(lb, handle, 'text/uri-list')

root.mainloop()

2voto

Arctoran Points 735

Utilisez simplement le dialogue de fichier tkinter, puis faites-le insérer les fichiers dans la zone d'entrée.

Exemple :

filedialog = tkFileDialog.askopenfilenames(*options*)
entry.insert(END, filedialog)

Exemple utilisant StringVar :

entryVar = StringVar()
entry = Entry(textvariable=entryVar)
filedialog = tkFileDialog.askopenfilenames(*options*)
entryVar.set(filedialog)

J'espère que cela vous aidera !

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