IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

TkFileDialog.askopenfilename en mode multiple


Sujet :

Tkinter Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut TkFileDialog.askopenfilename en mode multiple
    Salut,

    Le script suivant tourne sur XP/python2.7 il met en évidence un problème (ou un manque de documentation). Windows accepte les caractères '{' et '}'... Or askopenfilename semble s'en servir pour isoler les noms de fichiers contenant un espace, ce que l'on voit bien si on lance le script et en sélectionnant tous les fichiers. Quelqu'un aurait une doc ou une explication? Car à part les expressions régulières (et encore, pas sûr...) je ne vois pas trop comment splitter le résultat pour obtenir la liste des noms de fichiers sélectionnés.

    A+

    Pfeuh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/python
    # -*- coding: latin1 -*-
     
    DEFAULT_FILETYPE = [("All files","*.*")]
    TITLE_ADD_FILES = "Add file(s) to project"
     
    import tkFileDialog
    import Tkinter
    import os
     
    def guiAddFilesToProject(parent=None, filetypes=DEFAULT_FILETYPE, multiple=True, title="", fpath='./'):
        newfiles = tkFileDialog.askopenfilename(parent=parent, filetypes=filetypes, multiple=multiple, title=title, initialdir=fpath)
        return newfiles
     
    if __name__ == "__main__":
     
        def addFile(fname, fpath='./'):
            fullname = os.path.join(fpath, fname)
            fp = open(fullname, "wb")
            fp.write('azerty')
            fp.close()
     
        root = Tkinter.Tk()
     
        addFile(u"{très mauvais nom de fichier n°1}.txt")
        addFile(u"{très mauvais nom de fichier n°2}.txt")
     
        newfiles = guiAddFilesToProject(parent=root, title=TITLE_ADD_FILES)
        Tkinter.Label(root, text=newfiles).grid()
        root.mainloop()

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour pfeuh,

    root.tk.splitlist(newfiles) ?

    @+

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut PauseKawa,

    Merci pour ta réponse, mais il n'y a que "nom_correct.txt" et "{nom correct aussi.txt" qui passent le test ci-dessous. Où as-tu eu l'info de root.tk.splitlist?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/python
    # -*- coding: latin1 -*-
     
    DEFAULT_FILETYPE = [("All files","*.*")]
    TITLE_ADD_FILES = "Add file(s) to project"
     
    import tkFileDialog
    import Tkinter
    import os
     
    def guiAddFilesToProject(parent=None, filetypes=DEFAULT_FILETYPE, multiple=True, title="", fpath='./'):
        newfiles = tkFileDialog.askopenfilename(parent=parent, filetypes=filetypes, multiple=multiple, title=title, initialdir=fpath)
        return root.tk.splitlist(newfiles)
     
    if __name__ == "__main__":
     
        def addFile(fname, fpath='./'):
            fullname = os.path.join(fpath, fname)
            fp = open(fullname, "wb")
            fp.write('azerty')
            fp.close()
     
        root = Tkinter.Tk()
     
        addFile(u"{très mauvais nom de fichier n°1}.txt")
        addFile(u"{très mauvais nom de fichier n°2}.txt")
        addFile(u"nom_correct.txt")
        addFile(u"{nom correct aussi.txt")
        addFile(u"{nom limite correct héhé....txt")
     
        newfiles = guiAddFilesToProject(parent=root, title=TITLE_ADD_FILES)
        for fname in newfiles:
            if os.path.isfile(fname):
                Tkinter.Label(root, text=fname).grid()
        root.mainloop()

  4. #4
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Aïe... Je viens de tomber là dessus...

    http://mail.python.org/pipermail/pyt...ry/009787.html

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est normal si vous envoyez votre string tel quel à os.path.isfile.
    Encodez votre fname et vous retrouverez vos petits .

    Pour ce qui est de splitlist cela viens de tk et vous y avez accès via l'instance (idem pour globalgetvar, globalsetvar, globalunsetvar, split, splitlist, getboolean, etc etc etc).

    @+

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Merci beaucoup. Ce n'était pas un encode qui manquait, mais un decode. La version qui fonctionne est ci-dessous.

    A+

    Pfeuh


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/python
    # -*- coding: latin1 -*-
     
    DEFAULT_FILETYPE = [("All files","*.*")]
    TITLE_ADD_FILES = "Add file(s) to project"
     
    import tkFileDialog
    import Tkinter
    import os
     
    def guiAddFilesToProject(parent=None, filetypes=DEFAULT_FILETYPE, multiple=True, title="", fpath='./'):
        newfiles = tkFileDialog.askopenfilename(parent=parent, filetypes=filetypes, multiple=multiple, title=title, initialdir=fpath)
        return root.tk.splitlist(newfiles)
     
    if __name__ == "__main__":
     
        def addFile(fname, fpath='./'):
            fullname = os.path.join(fpath, fname)
            fp = open(fullname, "wb")
            fp.write('azerty')
            fp.close()
     
        root = Tkinter.Tk()
     
        addFile(u"{très mauvais nom de fichier n°1}.txt")
        addFile(u"{très mauvais nom de fichier n°2}.txt")
        addFile(u"nom_correct.txt")
        addFile(u"{nom correct aussi.txt")
        addFile(u"{nom limite correct héhé....txt")
     
        newfiles = guiAddFilesToProject(parent=root, title=TITLE_ADD_FILES)
        for fname in newfiles:
            if os.path.isfile(fname.decode('utf-8')):
                Tkinter.Label(root, text=fname).grid()
        root.mainloop()

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Points : 21
    Points
    21
    Par défaut infos suplémentaire
    Bonjour,

    Désolé de remonter ce post un peu ancien, mais j'aurais besoin de quelques informations supplémentaire concernant la fonction splitlist().

    Si j'ai bien comprit c'est une fonction de Tcl/tk dont on a accès par une instance Tk pour contourné le problème de askopenfilenames() sous windows.

    J'aurais aimé avoir accès à la doc de cette fonction pour y jeter un œil avant de l'utiliser, cependant je n'arrive pas à la trouver, quelqu'un saurait il où je pourrais en apprendre un peu plus sur cette fonction ?

    Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Version 2.1.1 : Barre de croquis en mode multiple
    Par mga_geo dans le forum IGN API Géoportail
    Réponses: 1
    Dernier message: 21/11/2014, 08h55
  2. Pb avec la fonction tkFileDialog.askopenfilename
    Par bourgui78 dans le forum Tkinter
    Réponses: 6
    Dernier message: 20/08/2008, 11h31
  3. Réponses: 2
    Dernier message: 30/08/2007, 23h15
  4. Réponses: 1
    Dernier message: 08/12/2006, 16h00
  5. Eviter l'exécution multiple d'un prg en mode console
    Par camboui dans le forum Windows
    Réponses: 3
    Dernier message: 29/07/2005, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo