Outils pour utilisateurs

Outils du site


dialogue_tkfiledialog

Ceci est une ancienne révision du document !


Fenêtres de dialogue pour sélection de fichiers et de répertoires avec tkFileDialog

Il s'agit ici de faire ce qu'on a l'habitude de faire avec une application graphique et un menu “Fichier”:

  • sélectionner un ou plusieurs fichiers à l'ouverture
  • sélectionner un emplacement et un nom pour enregistrer un fichier
  • sélectionner un répertoire (pour définir un répertoire de travail par exemple)

Pour tester ces différentes fonctions, vous pouvez utiliser la fenêtre avec le menu de base de la page qui décrit les menus (barre_de_menu)

Le module utilisé s'appelle tkFileDialog, et il faut commencer par l'importer en plus de Tkinter.

Les différentes fonctions que nous utiliserons sont les suivantes:

  • askopenfilename(…options…)
  • asksaveasfilename (…options…)
  • askdirectory(…options…)

Il existe aussi askopenfile() et asksaveasfile() que je n'utiliserai pas dans un 1er temps.

La doc concernant ces fonctions est difficile à trouver… Mais il y a une astuce pour trouver les options permises: sous un outil de développement comme idle, vous essayez avec une option fausse (comme zwxqrtpvfr=“nimportequoi”) et le message d'erreur vous rappellera toutes les options autorisées :-D .

Quelques fonctions utilitaires pour la manipulation des noms de fichiers et de répertoires

Connaitre le répertoire courant:

repcour = os.getcwd()

Exemples:

  • Windows: “C:\\Python25\\Pydev\\test” NB: le '\' a une signification particulière en Python: pour écrire un vrai '\', il en faut 2 comme '\\'.
  • Linux: “/home/tyrtamos”

Pour connaitre le répertoire du programme Python en cours d'exécution:

rep=os.path.dirname(sys.argv[0])

Savoir décomposer un chemin complet “repfic” dans ses 2 parties: répertoire et fichier:

rep=os.path.dirname(repfic)
fic=os.path.basename(repfic)

exemple:

  • Windows:
    • repfic = “C:\\Python25\\Pydev\\test\\toto.py”
    • rep = “C:\\Python25\\Pydev\\test”
    • fic = “toto.py”
  • Linux:
    • repfic = “/home/jeanpaul/toto.py”
    • rep = “/home/jeanpaul”
    • fic = “toto.py”

Pour reconstituer un chemin complet

Utilisez os.sep comme séparateur: il sera correctement traduit en fonction de l'OS:

Exemple:

  • Windows: rep+os.sep+fic => “C:\\Python25\\Pydev\\test\\toto.py”
  • Linux: rep+os.sep+fic => “/home/jeanpaul/toto.py”

Vous pouvez utiliser aussi pour faire la même chose:

os.path.join(rep,fic)

Pour compléter le nom d'un fichier avec son chemin complet:

os.path.abspath("toto.py")

Pour changer le répertoire courant:

os.chdir(rep)

Sélection d'un chemin et d'un nom de fichier pour ouverture

On utilise la fonction askopenfilename(…options…)

Ses options sont:

  • title= affiche un titre à la fenêtre (ex: title=“Ouverture d'un fichier”)
  • initialdir= permet à le fenêtre de se positionner à l'ouverture dans un répertoire donné (ex: initialdir=“c:\\”)
  • initialfile= permet de prédéfinir la sélection d'un fichier donné (ex: initialfile=“toto.txt”)
  • filetypes= permet de définir le type d'extension cherché. Seuls les fichiers ayant l'extension donnée seront affichés. C'est le 1er choix qui est présenté par défaut. (ex: filetypes=[(“All”, “*”),(“Python”,“*.py;*.pyw”)])
  • defaultextension= permet de définir l'extension par défaut (ex: defaultextension=“.py”)
  • multiple=True ou False permet d'accepter ou non une sélection multiple (ex: multiple=True)
  • parent= permet de préciser le parent de la fenêtre de sélection (ex: parent=fen)

Code proposé (la méthode est appelée par l'item “Ouvrir” du menu et se trouve dans la classe de l'application):

import Tkinter
import tkFileDialog
import os, os.path
...
    ...
    self.rep=os.getcwd()
    self.fic=""
    ...
    def ouvrir(self):
        self.repfic = tkFileDialog.askopenfilename(title="Ouvrir le fichier:", initialdir=self.rep, \
                        initialfile=self.fic, filetypes = [("All", "*"),("Fichiers Python","*.py;*.pyw")]) 
        if len(self.repfic) > 0:
            self.rep=os.path.dirname(self.repfic)
            self.fic=os.path.basename(self.repfic)
    ...
    ...

Sélection d'un répertoire

On utilise la fonction askdirectory(…options…) avec les options possibles suivantes:

  • title= affiche un titre à la fenêtre (ex: title=“Ouverture d'un fichier”)
  • initialdir= permet à le fenêtre de se positionner à l'ouverture dans un répertoire donné (ex: initialdir=“c:\\”)
  • parent= permet de préciser le parent de la fenêtre de sélection (ex: parent=fen)
  • mustexist= True ou False: le répertoire fourni doit exister si True.

Code proposé (la méthode est appelée par l'item “Répertoire de travail” du menu et se trouve dans la classe de l'application):

import Tkinter
import tkFileDialog
import os
...
    ...
    self.rep=os.getcwd()
    ...
    def repertoiredetravail(self):
        rep = tkFileDialog.askdirectory(title="Répertoire de travail", initialdir=self.rep) 
        if len(rep) > 0:
            self.rep = rep
            os.chdir(self.rep)
    ...
    ...

Sélection d'un chemin et d'un nom de fichier à enregistrer

On utilise la fonction asksaveasfilename(…options…)

Ses options sont:

  • title= affiche un titre à la fenêtre (ex: title=“Ouverture d'un fichier”)
  • initialdir= permet à le fenêtre de se positionner à l'ouverture dans un répertoire donné (ex: initialdir=“c:\\”)
  • initialfile= permet de prédéfinir la sélection d'un fichier donné (ex: initialfile=“toto.txt”)
  • filetypes= permet de définir le type d'extension cherché. Seuls les fichiers ayant l'extension donnée seront affichés. C'est le 1er choix qui est présenté par défaut. (ex: filetypes=[(“All”, “*”),(“Python”,“*.py;*.pyw”)])
  • defaultextension= permet de définir l'extension par défaut (ex: defaultextension=“.py”)
  • parent= permet de préciser le parent de la fenêtre de sélection (ex: parent=fen)

Code proposé (la méthode est appelée par l'item “Enregistrer sous” du menu et se trouve dans la classe de l'application):

import Tkinter
import tkFileDialog
import os
...
    ...
    self.rep=os.getcwd()
    self.fic=""
    ...
    def enregistrersous(self):
        repfic = tkFileDialog.asksaveasfilename(title="Enregistrer sous", initialdir=self.rep, initialfile=self.fic, filetypes = [("All", "*"),("Fichiers Python","*.py;*.pyw")]) 
        if len(repfic) > 0:
            self.repfic = repfic
            # ici le code pour enregistrer l'objet interne dans le fichier sélectionné self.repfic
    ...
dialogue_tkfiledialog.1208725047.txt.gz · Dernière modification: 2008/04/20 22:57 de tyrtamos

Outils de la page