Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

16.6. Sélection de fichier basée sur le sélecteur FileChooser

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 Fichier Ouvrir), 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 FichierEnregistrer), 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 Annuler and Ouvrir) sont créés et connectés à leur réponse respective (réponses Annuler et Valider(OK)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 classiqueFichierEnregistrer Sous), 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 FichierOuvrir, 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.

Figure 16.12. Exemple de sélecteur de fichiers

Exemple de sélecteur de fichiers.

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()