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 → ), 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 → ), 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 y ) se crean y conectan a sus respuestas respectivas (las respuestas estándar y ).
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 → ), 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 → ), 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:
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()