Table des matières

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”:

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:

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:

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:

Pour reconstituer un chemin complet

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

Exemple:

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:

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:

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:

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
    ...