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 :

récupérer le "tkFileDialog.askdirectory"


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut récupérer le "tkFileDialog.askdirectory"
    Bonjour,
    question de débutant :

    Pourquoi est-ce que ce code ne récupère pas dans "tkFileDialog.askopenfilename" (initialdir) la chaine retournée par "sel_dir" ?
    Le message d' erreur indique:
    ...sel_fichier ...
    Name error: global name 'seldir' is not defined


    def lance_fileman_dir() :
    sel_dir = tkFileDialog.askdirectory(title="selection du dir")
    print sel_dir

    def lance_fileman() :
    sel_fichier = tkFileDialog.askopenfilename(initialdir=sel_dir)
    le_fichier = open(sel_fichier,'r')


    Merci bien !!

    Autre question:
    y a t-il un moyen pour que le "initialdir" prenne la dernière sélection de l' utilisateur -dans la dernière session de l' application donc- autrement dit il faut stocker cette chaine mais òu , et comment ?

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    Je ne fait que débuter en python mais cela ne coute rien d'essayer d'aider...

    Premièrement dans le message d'erreur, tu marque 'seldir' sans underscore, c'est une erreur de ta part ou c'est que quelque part dans ton programme tu a oublié l'underscore car le vrai nom de ta variable est 'sel_dir' et non pas 'seldir'.

    Pour l'histoire de stocker le nom du précédent dossier, tu crée un fichier .ini dans le dossier de ton application, tu écris dedans l'adresse du dossier en question que tu récupère à l'ouverture suivante.

    En espérant que je ne dise pas de bêtise, oui je ne fais que débuter .

    Bon courage

  3. #3
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    bonjour, c'est normal que tu n'est pas acces a sel_dir dans ta fonction lance_fileman() car sel_dir n'est définie qu'a l'interieur de ta fonction lance_fileman_dir() et donc sa portée n'est limitée qu'a cette derniére.
    si tu veux accéder a sel_dir, il faut que tu passe sel_dir en variable globale comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sel_dir=""
    def lance_fileman_dir() :
         global sel_dir
         sel_dir = tkFileDialog.askdirectory(title="selection du dir")
         print sel_dir
     
    def lance_fileman() :
         global sel_dir
         sel_fichier = tkFileDialog.askopenfilename(initialdir=sel_dir)
         le_fichier = open(sel_fichier,'r')
    ++

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    @ Airod :
    Excellent, Merci !! - Erreur de débutant ... ;-) -

    @ atalon1
    Merci aussi !!
    c' était bien "sel_dir" que m' indiquait le message d' erreur ...
    Pour la méthode d' écrire et de relire dans un fichier, je pense que je peux m' en servir pour résoudre la question supplémentaire "y a t-il un moyen pour que le "initialdir" prenne la dernière sélection ..." voir mon message d' origine.
    A moins qu' il y ait une option telle "initialdir" pour récupérer la dernière sélection utilisateur ...

    Bye

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    L'instruction global sert uniquement à accéder en écriture à une variable déclarée au niveau principal.
    Comme toutes les variables du niveau principal sont déjà accessibles en lecture partout, il est inutile de remettre l'instruction global dans la fonction lance_fileman, vu qu'on ne fait que lire sel_dir.

    Citation Envoyé par santaflam
    y a t-il un moyen pour que le "initialdir" prenne la dernière sélection de l' utilisateur -dans la dernière session de l' application donc- autrement dit il faut stocker cette chaine mais òu , et comment
    Je ne comprends pas, c'est déjà le cas avec la variable sel_dir non ?
    Elle enregistre le chemin du répertoire sélectionné avec ta fonction lance_fileman_dir.
    En fait je ne vois pas l'intérêt de ce système à deux fonctions... si tu veux ouvrir un fichier, pourquoi vouloir récupérer le chemin du répertoire avant ?

    En plus, askopenfilename mémorise automatiquement le dernier répertoire utilisé, si tu l'appelles une seconde fois, le répertoire par défaut sera celui ou se trouve le fichier ouvert lors du premier appel.

    Et pour terminer, si tu souhaites vraiment récupérer à la main le chemin du répertoire du dernier fichier ouvert, tu peux procéder comme ça (chemin_fichier étant la chaîne renvoyée par askopenfilename) :
    Code "Python : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin_rep = chemin_fichier[:chemin_fichier.rfind("/")]
    Tu peux ensuite utiliser chemin_rep comme paramètre pour initialdir.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    OK merci !! Il faut que je précise ...

    Citation Envoyé par Haze. Voir le message
    Je ne comprends pas, c'est déjà le cas avec la variable sel_dir non ?
    Elle enregistre le chemin du répertoire sélectionné avec ta fonction lance_fileman_dir.
    En fait je ne vois pas l'intérêt de ce système à deux fonctions... si tu veux ouvrir un fichier, pourquoi vouloir récupérer le chemin du répertoire avant ?

    En plus, askopenfilename mémorise automatiquement le dernier répertoire utilisé, si tu l'appelles une seconde fois, le répertoire par défaut sera celui ou se trouve le fichier ouvert lors du premier appel.
    Alors voilà, je veux que la sélection du direcory soit mémorisée, qu' elle soit rappelée lorsque j' ouvre l' application, comme issue d' un fichier de "préférences" ou "settings", d' un fichier .ini en somme.
    Par conséquent en effet, la fction "askopendirectory" ne me sert que si j' écris la valeur dans un fichier .ini, que je relis à chaque ouverture de session.
    ...
    A moins qu' il y ait un automatisme pour stocker cette valeur une fois l' appli. fermée (?) ...

    Pour "askopenfile", elle ne mémorise pas le chemin de la dernière sélection du fichier comme tu le mentionnes, soit elle prend la valeur initdir, soit elle prend le directory par défaut (je crois celui d' install python).
    ... A moins qu' on ait des versions différentes de python/Tkinter (J'' ai l' exe Python Release 2.5.1, 18th April, 2007)

    Merci & bye

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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