La nouvelle manière de choisir un fichier dans PyGTK 2.4 consiste à
utiliser les variantes du widget FileChooser
. Les deux
objets qui implémentent cette nouvelle interface dans PyGTK 2.4 sont
FileChooserWidget
et FileChooserDialog
.
Ce dernier est un dialogue complet avec la fenêtre et des boutons facilement définis.
Le premier est un widget utile pour l'inscrire dans un autre widget.
Le FileChooserWidget
comme le FileChooserDialog
possèdent les capacités de naviguer dans l'arborescence du système de fichiers et
de sélectionner des fichiers. L'apparence du widget dépend de l'action utilisée pour
ouvrir le widget.
Pour créer une nouvelle fenêtre de sélection de fichiers pour choisir un fichier existant (comme dans le classique
→ ), il faut utiliser :chooser = gtk.FileChooserDialog(title
=None,action
=gtk.FILE_CHOOSER_ACTION_OPEN,buttons
=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
Pour créer une nouvelle fenêtre de sélection de fichiers pour choisir un nouveau nom de fichier (comme dans le classique
→ ), il faut utiliser :chooser = gtk.FileChooserDialog(title
=None,action
=gtk.FILE_CHOOSER_ACTION_SAVE,buttons
=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
Dans les exemples précédents, les deux boutons (éléments de stock
and ) sont créés et connectés à leur réponse respective (réponses et s).Pour définir le dossier qui sera affiché dans le sélecteur de fichiers, on utilise la méthode :
chooser.set_current_folder(pathname
)
Pour définir le nom de fichier suggéré comme s'il était tapé par l'utilisateur (le classique
→ ), on utilise la méthode :
chooser.set_current_name(name
)
La méthode ci-dessus n'exige pas que le nom du fichier existe déjà. Si on préfére préselectionner un fichier existant particulier (comme dans
→ , on utilise la méthode :
chooser.set_filename(filename
)
Pour récupérer le nom du fichier que l'utilisateur a tapé ou sur lequel il a cliqué, on utilise la méthode :
filename = chooser.get_filename()
Il est possible d'autoriser de multiples sélections (uniquement pour
l'action gtk.FILE_CHOOSER_ACTION_OPEN
) en utilisant
la méthode :
chooser.set_select_multiple(select_multiple
)
... où le paramètre select_mutiple
doit valoir
TRUE
pour autoriser les sélections multiples. Dans
ce cas, il faudra utiliser la méthode suivante pour récupérer la liste
des fichiers sélectionnés :
filenames = chooser.get_filenames()
Une caractéristique importante de tous les sélecteurs de fichiers est leur capacité à ajouter des filtres de sélection de fichiers. Le filtre peut être ajouté par cette méthode :
chooser.add_filter(filter
)
Dans l'exemple ci-dessus, filter
doit être une
instance de la classe FileFilter
.
Le panneau de gauche du sélecteur de fichier contient quelques signets (raccourcis vers les dossiers) tels Dossier personnel, Système de fichiers, CDrom, etc. Il est possible d'ajouter un dossier à la liste de ces signets, ou de l'enlever, avec ces méthodes :
chooser.add_shortcut_folder(folder
) chooser.remove_shortcut_folder(folder
)
... où folder
est le chemin du dossier. Le
programme d'exemple
filechooser.py illustre
l'utilisation du sélecteur de fichier. La Figure 16.12, « Exemple de sélecteur de fichiers »
montre le programme en cours d'exécution.
Voici le code source du programme filechooser.py :
1 #!/usr/bin/env python 2 # coding: utf8 3 # exemple filechooser.py 4 5 import pygtk 6 pygtk.require('2.0') 7 8 import gtk 9 10 # Vérification du nouveau PyGtk : c'est une nouvelle classe de PyGtk 2.4 11 if gtk.pygtk_version < (2,3,90): 12 print "Cet exemple nécessite PyGtk 2.3.90 ou ultérieur" 13 raise SystemExit 14 15 dialogue = gtk.FileChooserDialog("Ouvrir..", 16 None, 17 gtk.FILE_CHOOSER_ACTION_OPEN, 18 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 19 gtk.STOCK_OPEN, gtk.RESPONSE_OK)) 20 dialogue.set_default_response(gtk.RESPONSE_OK) 21 22 filtre = gtk.FileFilter() 23 filtre.set_name("All files") 24 filtre.add_pattern("*") 25 dialogue.add_filter(filtre) 26 27 filtre = gtk.FileFilter() 28 filtre.set_name("Images") 29 filtre.add_mime_type("image/png") 30 filtre.add_mime_type("image/jpeg") 31 filtre.add_mime_type("image/gif") 32 filtre.add_pattern("*.png") 33 filtre.add_pattern("*.jpg") 34 filtre.add_pattern("*.gif") 35 filtre.add_pattern("*.tif") 36 filtre.add_pattern("*.xpm") 37 dialogue.add_filter(filtre) 38 39 reponse = dialogue.run() 40 if reponse == gtk.RESPONSE_OK: 41 print dialogue.get_filename(), 'choisi' 42 elif reponse == gtk.RESPONSE_CANCEL: 43 print 'On ferme, pas de fichier sélectionné' 44 dialogue.destroy()