16.6. Selecciones de Archivos mediante el uso de Controles basados en el Selector de Archivos FileChooser

El nuevo modo de seleccionar archivos en PyGTK 2.4 es el uso de variantes del control FileChooser. Los dos objetos que implementan esta nueva interfaz en PyGTK 2.4 son el control de Selección de Archivo FileChooserWidget y el diálogo de Selección de Archivo FileChooserDialog. Este último es el diálogo completo con la ventana y botones fácilmente definidos. El primero es un control útil para embeber en otro control.

Tanto el FileChooserWidget como el FileChooserDialog poseen los medios necesarios para navegar por el árbol del sistema de archivos y seleccionar ficheros. El aspecto de los controles depende de la acción utilizada para abrir el control.

Para crear un nuevo diálogo de selección de archivos y seleccionar un archivo existente (como en la opción de una aplicación típica ArchivoAbrir ), se usa:

  chooser = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,
                                  buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))

Para crear un nuevo diálogo de selección de archivos para seleccionar un nuevo nombre de archivo (como en la opción de una aplicación típica ArchivoGuardar ), se usa:

  chooser = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_SAVE,
                                  buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))

En los ejemplos anteriores, los dos botones (los elementos de serie Cancelar y Abrir) se crean y conectan a sus respuestas respectivas (las respuestas estándar Cancelar y OK).

Para fijar la carpeta que se mostrará en el selector de archivos se usa el método:

  chooser.set_current_folder(pathname)

Para establecer el nombre de archivo sugerido, tal como lo introduciría un usuario (la típica situación ArchivoGuardar como ), se usa el método:

  chooser.set_current_name(name)

El método anterior no necesita que exista el nombre de archivo. Si se quiere seleccionar un archivo existente concreto (tal como en la situación ArchivoAbrir ), se debe usar el método:

  chooser.set_filename(filename)

Para obtener el nombre que ha seleccionado la usuaria o sobre la que ha hecho clic se usa el método:

  filename = chooser.get_filename()

Es posible permitir selecciones múltiples (únicamente para la acción gtk.FILE_CHOOSER_ACTION_OPEN) utilizando el método:

  chooser.set_select_multiple(select_multiple)

donde select_mutiple debe ser TRUE para permitir selecciones múltiples. En este caso, se necesitará utilizar el método siguiente para obtener una lista de los nombres de archivo seleccionados:

  filenames = chooser.get_filenames()

Una característica importante de todos los selectores de archivos es la capacidad de añadir filtros de selección de archivos. El filtro se añade con el método:

  chooser.add_filter(filter)

En el ejemplo anterior, filter debe ser una instancia de la clase FileFilter.

El panel izquierdo del selector de archivos da una lista de atajos a algunas carpetas tales como Inicio, Filesystem, CDROM, etc. Es posible añadir una carpeta a la lista de estos atajos y eliminarla de ella con los siguientes métodos:

  chooser.add_shortcut_folder(folder)
  chooser.remove_shortcut_folder(folder)

donde folder es la ruta de la carpeta. El programa de ejemplo filechooser.py ilustra el uso del control de selección de archivos. Figura 16.12, “Ejemplo de Selección de Archivos” muestra el resultado de la ejecución:

Figura 16.12. Ejemplo de Selección de Archivos

Ejemplo de Selección de Archivos

El código fuente del programa de ejemplo filechooser.py es:

    1   #!/usr/bin/env python
    2
    3   # ejemplo filechooser.py
    4
    5   import pygtk
    6   pygtk.require('2.0')
    7
    8   import gtk
    9
   10   # Comprobamos la presencia del nuevo pygtk: esta es una clase nueva de PyGtk 2.4
   11   if gtk.pygtk_version < (2,3,90):
   12      print "PyGtk 2.3.90 or later required for this example"
   13      raise SystemExit
   14
   15   dialog = gtk.FileChooserDialog("Open..",
   16                                  None,
   17                                  gtk.FILE_CHOOSER_ACTION_OPEN,
   18                                  (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
   19                                   gtk.STOCK_OPEN, gtk.RESPONSE_OK))
   20   dialog.set_default_response(gtk.RESPONSE_OK)
   21
   22   filter = gtk.FileFilter()
   23   filter.set_name("All files")
   24   filter.add_pattern("*")
   25   dialog.add_filter(filter)
   26
   27   filter = gtk.FileFilter()
   28   filter.set_name("Images")
   29   filter.add_mime_type("image/png")
   30   filter.add_mime_type("image/jpeg")
   31   filter.add_mime_type("image/gif")
   32   filter.add_pattern("*.png")
   33   filter.add_pattern("*.jpg")
   34   filter.add_pattern("*.gif")
   35   filter.add_pattern("*.tif")
   36   filter.add_pattern("*.xpm")
   37   dialog.add_filter(filter)
   38
   39   response = dialog.run()
   40   if response == gtk.RESPONSE_OK:
   41       print dialog.get_filename(), 'selected'
   42   elif response == gtk.RESPONSE_CANCEL:
   43       print 'Closed, no files selected'
   44   dialog.destroy()