J'essaie d'obtenir une liste de noms de fichiers de tkinter.filedialog.askopenfilenames () à Python 3.2.
files = askopenfilenames(initialdir="C:\\Users\\BVCAP\\Videos", title="Select files") self.num_files.set(len(files))
5 Réponses :
Je n'ai pas de réponse exacte pour vous, car je suis toujours coincé dans Python 2.x, mais dans mon monde, AskopenfileNames retourne un tuple, alors je doute que cela aurait tellement changé à 3.x. Peut-être essayez peut-être de casting comme liste: ou à l'aide d'une compréhension de la liste en itération sur celui-ci: p>
Ceci est en fait un bogue sur la version Windows présente depuis autour de la version 2.6 de Python. Vous pouvez trouver le problème sur leur tracker , et il y a une solution de contournement dans les commentaires (je n'ai pas personnellement essayé de cela. Solution de contournement parce que je suis sur Linux, qui retourne un tuple approprié). Je ne suis pas au courant d'une solution depuis lors, et la question n'a pas été marquée comme fermée / résolue.
La solution de contournement suggérée dans le commentaire est essentiellement pour ce faire: P>
master = Tk() files = askopenfilenames(initialdir="C:\\Users\\BVCAP\\Videos", title="Select files") files = master.tk.splitlist(files) #Possible workaround self.num_files.set(len(files))
Merci, agréable de savoir. Cette solution de contournement n'a pas réellement fonctionné, mais une fois que je savais que c'était une chaîne avec ce format, ce n'était pas un problème de la transformer en liste. Salut utilisé cela à la place: fichiers = re.findall ('\ {(. *?) \}', Fichiers)
FWIW, le bogue toujours dans Python 2.7.3 et @ Paul's Solution de la solution d'utilisation en utilisant RE code> est probablement la solution de contournement la plus simple, bien que vous souhaitiez que cela soit conditionné si
askopenfileNames () code> a retourné quelque chose d'autre qu'un
tuple code> au cas où il est jamais corrigé.
Un autre bug est apparemment, il existe une limite sur le nombre de fichiers qui peuvent être sélectionnés à la fois - que j'ai vérifié à l'aide de Python 2.7.5. Voir la question limitation de quantité pour Fenêtre de dialogue Sélection de fichiers ou de clés dans un dictionnaire? .
Cela aurait dû être résolu en 2.7.7. Voir BOGS.PLYTHON.ORG/ISSUE19020 et bugs.python.org/issue5712 .
Je soutiens la réponse d'Eldererathis comme la meilleure solution que j'ai trouvée pour les versions Python versions 2.x (principalement 2.5 et plus) sous Linux, Mac OS X et Windows. Quand un J'ai essayé le jusqu'à présent, tkfiledialog code> appelle le
askopenfilename (..., multiple = 1) code> méthodes avec argument
multiple = 1 code>, je ne pouvais pas le faire fonctionner correctement Sous Windows (Linux et Mac OS X allait bien) lorsqu'un fichier unique a été sélectionné (le fichier est traité comme un
'str' code> au lieu d'un
'tuple' code>). p>
fichiers = re.findall ('\ {(. *?) \}', fichiers code> suggéré par Paul dans les commentaires, mais cela n'a rien changé. J'ai aussi essayé. Code> Files = tuple (Fichiers) CODE> et
Files = Liste (Fichiers) CODE>, mais ce n'est pas une solution de contournement viable de ce que j'ai vu. p>
fichiers = tkroot.master.splitlist (fichiers) code> est ce qui fonctionne sous tous les environnements que j'ai testés (Win32, Win64, Linux32, Linux64, Mac OS X). P >
Je viens de trouver cette question lorsque j'attendais pourquoi j'avais des crochets bouclés au lieu d'une liste appropriée.
Voici mon travail autour de: P>
file_list=[] files = files = askopenfilenames(initialdir="C:\\Users\\BVCAP\\Videos", title="Select files") for file in files: file_list.append(file)
Lors de la mise en œuvre de cette méthode aujourd'hui, Curieusement, si le bouton Annuler est enfoncé ou si l'utilisateur sort de la fenêtre de navigation, une chaîne vide est renvoyée à la place d'une liste vide ou d'un tuple. Heureusement pour US Python reconnaît les chaînes comme objets itérables, ce qui signifie que vous pouvez toujours vérifier si askopenfilenames code> renvoie un tuple de tous les fichiers choisis, pas la chaîne étrange avec des accolades bouclées (doit avoir été corrigée). P>
len (filedialog.askopenfileNames ()) == 0 code>. P>.
Eek! Qu'est-ce que vous obtenez quand il y a une corde (
{ code> ou
} code>) dans un nom de fichier?
@Gabe: Si cela se produit, je vous étranglerai personnellement quiconque mettra une attelle bouclée dans le nom du fichier.