Python y GTK

Embed Size (px)

Citation preview

  • 8/21/2019 Python y GTK

    1/337

    1

    Tutorial de PyGTK 2.0 versin 2.3

    John Finlay

    Rafael Villar Burke

    Lorenzo Gil Snchez

    Iigo Serna

    Fernando San Martn Woerner

    Resumen

    Este tutorial describe el uso del mdulo de Python PyGTK.

    Tabla de contenidos

    1. Introduccin1.1. Exploracin de PyGTK

    2. Primeros Pasos2.1. Hola Mundo en PyGTK2.2. Teora de Seales y Retrollamadas2.3. Eventos2.4. Hola Mundo Paso a Paso

    3. Avanzando3.1. Ms sobre manejadores de seales3.2. Un Hola Mundo Mejorado

    4. Empaquetado de Controles4.1. Teora de Cajas Empaquetadoras4.2. Las Cajas en detalle4.3. Programa de Ejemplo de Empaquetado4.4. Uso de Tablas para el Empaquetado4.5. Ejemplo de Empaquetado con Tablas

    5. Perspectiva General de Controles5.1. Jerarqua de Controles5.2. Controles sin Ventana

    6. El Control de Botn6.1. Botones Normales6.2. Botones Biestado (Toggle Buttons)

    6.3. Botones de Activacin (Check Buttons)6.4. Botones de Exclusin Mtua (Radio Buttons)7. Ajustes

    7.1. Creacin de un Ajuste7.2. Utilizacin de Ajustes de la Forma Fcil7.3. Interioridades de un Ajuste

    8. Controles de Rango8.1. Barras de Desplazamiento8.2. Controles de Escala8.2.1. Creacin de un Control de Escala8.2.2. Mtodos y Seales (bueno, al menos mtodos)8.3. Mtodos Comunes de los Rangos

    8.3.1. Establecimiento de la Poltica de Actualizacin8.3.2. Obtencin y Cambio de Ajustes8.4. Atajos de Teclas y Ratn8.5. Ejemplo de Control de Rango

  • 8/21/2019 Python y GTK

    2/337

    2

    9. Miscelnea de Controles9.1. Etiquetas9.2. Flechas (Arrow)9.3. El Objeto Pistas (Tooltip)9.4. Barras de Progreso (ProgressBar)9.5. Dilogos9.6. Imgenes9.6.1. Pixmaps9.7. Reglas9.8. Barras de Estado9.9. Entradas de Texto (Entry)9.10. Botones Aumentar/Disminuir9.11. Lista Desplegable (Combo)9.12. Calendario9.13. Seleccin de Color9.14. Selectores de Fichero9.15. Dilogo de Seleccin de Fuentes

    10. Controles Contenedores10.1. La Caja de Eventos (EventBox)10.2. El control Alineador

    10.3. Contenedor Fijo (Fixed)10.4. Contenedor de Disposicin (Layout)10.5. Marcos (Frame)10.6. Marcos Proporcionales (AspectFrame)10.7. Controles de Panel (HPaned y VPaned)10.8. Vistas (Viewport)10.9. Ventanas de Desplazamiento (ScrolledWindow)10.10. Cajas de Botones (ButtonBoxes)10.11. Barra de Herramientas (Toolbar)10.12. Fichas (Notebook)10.13. Elementos incrustables y puntos de conexin (Plugs y Sockets)10.13.1. Elementos incrustables (Plugs)

    10.13.2. Puntos de Conexin (Sockets)11. Control Men11.1. Creacin Manual de Mens11.2. Ejemplo de Men Manual11.3. Uso de la Factoria de Elementos11.4. Ejemplo de Factoria de Elementos - ItemFactory

    12. rea de Dibujo12.1. Contexto Grfico12.2. Mtodos de Dibujo

    13. Control de Vista de Texto13.1. Perspectiva general de la Vista de Texto13.2. Vistas de Texto

    13.3. Buffers de Texto13.3.1. Informacin de estado de un Buffer de Texto13.3.2. Creacin de Iteradores de Texto13.3.3. Insercin, Obtencin y Eliminacin de Texto13.3.4. Marcas de Texto (TextMark)13.3.5. Creacin y Uso de Etiquetas de Texto13.3.6. Insercin de Imgenes y Controles13.4. Iteradores de Texto13.4.1. Atributos de los Iteradores de Texto13.4.2. Atributos de Texto de un Iterador de Texto13.4.3. Copiar un Iterador de Texto13.4.4. Recuperar Texto y Objetos13.4.5. Comprobar Condiciones en un Iterador de Texto13.4.6. Comprobar la posicin en un Texto13.4.7. Movimiento a travs del Texto

  • 8/21/2019 Python y GTK

    3/337

    3

    13.4.8. Moverse a una Posicin Determinada13.4.9. Bsqueda en el Texto13.5. Marcas de Texto13.6. Etiquetas de Texto y Tablas de Etiquetas13.6.1. Etiquetas de Texto13.6.2. Tablas de Etiquetas de Texto13.7. Un ejemplo de Vista de Texto

    14. Control de Vista de rbol (TreeView)14.1. Introduccin14.2. La Interfaz y Almacn de Datos TreeModel14.2.1. Introduccin14.2.2. Creacin de Objetos TreeStore (rbol) y ListStore (lista)14.2.3. Cmo referirse a las filas de un modelo TreeModel14.2.4. Adicin de filas14.2.5. Eliminacin de Filas14.2.6. Gestin de los datos de las filas14.2.7. Soporte del protocolo de Python14.2.8. Seales de TreeModel14.2.9. Ordenacin de filas de modelos TreeModel14.3. TreeViews (Vistas de rbol)

    14.3.1. Creacin de un TreeView (vista de rbol)14.3.2. Obtencin y establecimiento del Modelo de un TreeView14.3.3. Definicin de las propiedades de un TreeView14.4. Visualizadores de Celda (CellRenderer)14.4.1. Introduccin14.4.2. Tipos de Visualizadores CellRenderer14.4.3. Propiedade de un CellRenderer14.4.4. Atributos de un CellRenderer14.4.5. Funcin de Datos de Celda14.4.6. Etiquetas de Marcado en CellRendererText14.4.7. Celdas de Texto Editables14.4.8. Celdas Biestado Activables

    14.4.9. Programa de Ejemplo de Celda Editable and Activable14.5. TreeViewColumns (columnas de vista de rbol)14.5.1. Creacin de TreeViewColumns (columnas de vista de rbol)14.5.2. Gestin de los CellRenderers (Intrpretes de celda)14.6. Manipulacin de TreeViews14.6.1. Gestin de las Columnas14.6.2. Expansin y Contraccin de Filas Hijas14.7. Seales de TreeView14.8. Selecciones TreeSelections14.8.1. Obtencin de TreeSelection14.8.2. Modos de una seleccin TreeSelection14.8.3. Obtencin de la Seleccin

    14.8.4. Uso de una Funcin de TreeSelection14.8.5. Seleccin y Deseleccin de Filas14.9. Arrastrar y Soltar en TreeView14.9.1. Reordenacin mediante Arrastrar y Soltar14.9.2. Arrastar y Soltar Externo14.9.3. Ejemplo de Arrastrar y Soltar en TreeView14.10. TreeModelSort y TreeModelFilter14.10.1. TreeModelSort (Modelo de rbol Ordenado)14.10.2. TreeModelFilter (Modelo de rbol filtrado)14.11. El Modelo de rbol Genrico (GenericTreeModel)14.11.1. Visin general de GenericTreeMode14.11.2. La Interfaz GenericTreeModel14.11.3. Adicin y Eliminacin de Filas14.11.4. Gestin de Memoria14.11.5. Otras Interfaces

  • 8/21/2019 Python y GTK

    4/337

    4

    14.11.6. Utilizacin de GenericTreeModel14.12. El Visualizador de Celda Genrico (GenericCellRenderer)

    15. Nuevos Controles de PyGTK 2.215.1. Portapapeles (Clipboard)15.1.1. Creacin de un objeto Clipboard (Portapapeles)15.1.2. Utilizacin de Clipboards con elementos Entry, Spinbutton y TextView15.1.3. Incorporacin de datos en un portapapeles15.1.4. Obtencin de los Contenidos del Portapapeles15.1.5. Ejemplo de Portapapeles

    16. Nuevos Controles de PyGTK 2.416.1. Objetos de Accin (Action) y Grupo de Acciones (ActionGroup)16.1.1. Acciones (Actions)16.1.2. Grupos de Acciones (ActionGroups)16.2. Controles de Lista Desplegable (ComboBox) y Lista Desplegable con Entrada (ComboBoxEntry)16.2.1. Controles ComboBox16.2.2. Controles ComboBoxEntry16.3. Controles Botn de Color y de Fuente (ColorButton y FontButton)16.3.1. Control Botn de Color (ColorButton)16.3.2. Control Botn de Fuente (FontButton)16.4. Controles de Entrada con Completado (EntryCompletion)

    16.5. Controles de Expansin (Expander)16.6. Selecciones de Archivos mediante el uso de Controles basados en el Selector de Archivos FileChooser16.7. El gestor de Interfaces de Usuario UIManager16.7.1. Perspectiva general16.7.2. Creacin de un gestor UIManager16.7.3. Adicin y Eliminacin de Grupos de Acciones (ActionGroups)16.7.4. Descripciones de la Interfaz de Usuario16.7.5. Adicin y Eliminacin de Descripciones de Interfaz de Usuario16.7.6. Acceso a los Controles de la Interfaz de Usuario16.7.7. Ejemplo sencillo de Gestor de Interfaz UIManager16.7.8. Combinacin de Descripciones de Interfaz de Usuario16.7.9. Seales de UIManager

    17. Controles sin documentar17.1. Etiqueta de Aceleracin (Atajo)17.2. Men de Opciones17.3. Elementos de Men17.3.1. Elemento de Men de Activacin17.3.2. Elemento de Men de Exclusin Mtua17.3.3. Elemento de Men de Separacin17.3.4. Elemento de Men de Cascada17.4. Curvas17.5. Dilogo de Mensaje17.6. Curva Gamma

    18. Establecimiento de Atributos de Controles

    18.1. Mtodos de Banderas de los Controles18.2. Mtodos de Visualizacin de Controles18.3. Atajos de Teclado de los Controles18.4. Mtodos relacionados con el Nombre de los Controles18.5. Estilo de los Controles

    19. Temporizadores, Entrada/Salida y Funciones de Inactividad19.1. Temporizadores19.2. Monitorizar la Entrada/Salida19.3. Funciones de Inactividad

    20. Procesamiento Avanzado de Eventos y Seales20.1. Mtodos de Seales20.1.1. Conectar y Desconectar Manejadores de Seal20.1.2. Bloqueo y Desbloqueo de Manejadores de Seal20.1.3. Emisin y Parada de Seales20.2. Emisin y Propagacin de Seales

  • 8/21/2019 Python y GTK

    5/337

    5

    21. Tratamiento de Selecciones21.1. Descripcin General de la Seleccin21.2. Recuperar la Seleccin21.3. Proporcionar la Seleccin

    22. Arrastrar y Soltar22.1. Descripcin General de Arrastrar y Soltar22.2. Propiedades de Arrastrar y Soltar22.3. Mtodos de Arrastrar y Soltar22.3.1. Configuracin del Control Origen22.3.2. Seales en el Control Fuente22.3.3. Configuracin de un Control Destino22.3.4. Seales en el Control Destino

    23. Ficheros rc de GTK+23.1. Funciones para Ficheros rc23.2. Formato de los Ficheros rc de GTK+23.3. Ejemplo de fichero rc

    24. Scribble: Un Ejemplo Sencillo de Programa de Dibujo24.1. Perspectiva General de Scribble24.2. Manejo de Eventos24.2.1. Scribble - Manejo de Eventos

    24.3. El Control del rea de Dibujo, y Dibujar25. Trucos para Escribir Aplicaciones PyGTK25.1. El usario debera manejar la interfaz, no al contrario25.2. Separa el modelo de datos de la interfaz25.3. Cmo separar los Mtodos de Retrollamada de los Manejadores de Seal 25.3.1. Introduccin25.3.2. Herencia25.3.3. Herencia aplicada a PyGTK

    26. Contribuir27. Crditos

    27.1. Crditos Original de GTK+28. Copyright del Tutorial y Nota de Permisos

    A. Seales de GTKA.1. gtk.ObjectA.2. gtk.WidgetA.3. GtkDataA.4. gtk.ContainerA.5. gtk.CalendarA.6. gtk.EditableA.7. gtk.NotebookA.8. gtk.ListA.9. gtk.MenuShellA.10. gtk.ToolbarA.11. gtk.Button

    A.12. gtk.ItemA.13. gtk.WindowA.14. gtk.HandleBoxA.15. gtk.ToggleButtonA.16. gtk.MenuItemA.17. gtk.CheckMenuItemA.18. gtk.InputDialogA.19. gtk.ColorSelectionA.20. gtk.StatusBarA.21. gtk.CurveA.22. gtk.Adjustment

    B. Ejemplos de CdigoB.1. scribblesimple.py

    C. ChangeLog

  • 8/21/2019 Python y GTK

    6/337

    6

    Lista de figuras

    2.1. Ventana Simple PyGTK2.2. Programa de ejemplo: Hola Mundo3.1. Ejemplo mejorado de Hola Mundo4.1. Empaquetado: Cinco variaciones4.2. Empaquetado con Spacing y Padding4.3. Empaquetado con pack_end()

    4.4. Empaquetado haciendo uso de una Tabla6.1. Botn con Pixmap y Etiqueta6.2. Ejemplo de Botn Biestado6.3. Ejemplo de Botn de Activacin6.4. Ejemplo de Botones de Exclusin Mtua8.1. Ejemplo de Controles de Rango9.1. Ejemplos de Etiquetas9.2. Ejemplos de Botones con Flechas9.3. Ejemplo de Pistas9.4. Ejemplo de Barra de Progreso9.5. Ejemplo de Imgenes en Botones9.6. Ejemplo de Pixmap en un Botn

    9.7. Ejemplo de Ventana con Forma9.8. Ejemplo de Reglas9.9. Ejemplo de Barra de Estado9.10. Ejemplo de Entrada9.11. Ejemplo de Botn Aumentar/Disminuir9.12. Ejemplo de Calendario9.13. Ejemplo de Dilogo de Seleccin de Color9.14. Ejemplo de Seleccin de Ficheros9.15. Dilogo de Seleccin de Fuentes10.1. Ejemplo de Caja de Eventos10.2. Ejemplo de Fijo10.3. Ejemplo de Disposicin

    10.4. Ejemplo de Marco10.5. Ejemplo de Marco Proporcional10.6. Ejemplo de Panel10.7. Ejemplo de Ventana de Desplazamiento10.8. Ejemplo de Barra de Herramientas10.9. Ejemplo de Fichas11.1. Ejemplo de Men11.2. Ejemplo de Factoria de Elementos12.1. Ejemplo de rea de Dibujo13.1. Ejemplo bsico de Vista de Texto13.2. Ejemplo de Vista de Texto14.1. Programa elemental de ejemplo de TreeView14.2. TreeViewColumns con CellRenderers14.3. Funcin de Datos de Celda14.4. Ejemplo de Listado de Archivos Utilizando Funciones de Datos de Celda14.5. Etiquetas de Marcado para CellRendererText14.6. Celdas Editables y Activables14.7. Flecha de Expansin en la segunda Columna14.8. Ejemplo de Arrastrar y Soltar en TreeView14.9. Ejemplo de TreeModelSort14.10. Ejemplo de Visibilidad en TreeModelFilter14.11. Programa de Ejemplo de Modelo de rbol Genrico15.1. Programa de ejemplo de Portapapeles

    16.1. Ejemplo Simple de Accin16.2. Ejemplo Bsico de Accin16.3. Ejemplo de Acciones16.4. Ejemplo de ActionGroup

  • 8/21/2019 Python y GTK

    7/337

    7

    16.5. ComboBox Bsica16.6. ComboBox con una Disposicin Asociada16.7. ComboBoxEntry Bsica16.8. Ejemplo de Botn de Color - ColorButton16.9. Ejemplo de Botn de Fuente - FontButton16.10. Entrada con Completado (EntryCompletion)16.11. Control de Expansin16.12. Ejemplo de Seleccin de Archivos16.13. Programa sencillo de Gestor de Interfaz de Usuario UIManager16.14. Ejemplo UIMerge21.1. Ejemplo de Obtencin de la Seleccin21.2. Ejemplo de Fijar la Seleccin22.1. Ejemplo de Arrastrar y Soltar24.1. Ejemplo de Programa de Dibujo Scribble24.2. Ejemplo sencillo - Scribble

    Lista de tablas

    22.1. Seales del Control Fuente22.2. Seales del Control Destino

  • 8/21/2019 Python y GTK

    8/337

    8

    Captulo 1. Introduccin

    Tabla de contenidos

    1.1. Exploracin de PyGTK

    PyGTK 2.0 es un conjunto de mdulos que componen una interfaz Python para GTK+ 2.0. En el resto de este

    documento cuando se menciona PyGTK se trata de la versin 2.0 o posterior de PyGTK, y en el caso de GTK+, tambina su versin 2.0 y siguientes. El sitio web de referencia sobre PyGTK es www.pygtk.org. El autor principal de PyGTKes:

    James [email protected]

    que es ayudado por los desarrolladores citados en el archivo AUTHORS de la distribucin PyGTK y por la comunidadPyGTK.

    Python es un lenguaje de programacin interpretado, ampliable y orientado a objetos que se distribuye con un amplioconjunto de mdulos que permiten el acceso a un gran nmero de servicios del sistema operativo, servicios de internet(como HTML, XML, FTP, etc.), grficos (incluidos OpenGL, TK, etc.), funciones de manejo de cadenas, servicios decorreo (IMAP, SMTP, POP3, etc.), multimedia (audio, JPEG) y servicios de criptografa. Existen adems multitud demdulos proporcionados por terceros que aaden otros servicios. Python se distribuye bajo trminos similares a los de lalicencia GPL y est disponible para los sistemas operativos Linux, Unix, Windows y Macintosh. En www.python.orghay ms informacion disponible sobre Python. Su autor principal es:

    Guido van Rossum [email protected]

    GTK+ (GIMP Toolkit) es una librera que permite crear interfaces grficas de usuario. Se distribuye bajo la licenciaLGPL, por lo que posibilita el desarrollo de software abierto, software libre, e incluso software comercial no libre queuse GTK sin necesidad de pagar licencias o derechos.

    Se le conoce como el toolkit de GIMP porque originalmente se escribi para desarrollar el Programa de Manipulacin deImgenes de GNU GIMP, pero GTK+ se usa ya en numerosos proyectos de software, includo el proyecto de escritorioGNOME (Entorno de Modelo de Objetos orientados a Red). GTK+ est diseada sobre GDK (Kit de Dibujo de GIMP)que, bsicamente, es una abstraccin de las funciones de bajo nivel que acceden al sistema de ventanas (Xlib en el casodel sistema de ventanas X). Los principales autores de GTK+ son:

    Peter [email protected] Spencer Kimball [email protected] Josh [email protected]

    Actualmente GTK+ es mantenida por:

    Owen Taylor [email protected] Tim Janik [email protected]

    GTK+ es fundamentalmente un interfaz orientada a objetos para programadores de aplicaciones (API). Aunque estescrita completamente en C, est implementada usando la idea de clases y funciones de retrollamada (punteros afuncin).

    Existe un tercer componente, llamado Glib, que contiene diversas funciones que reemplazan algunas llamadas estandard,as como funciones adicionales para manejar listas enlazadas, etc. Las funciones de reemplazo se usan para aumentar la

    portabilidad de GTK+ ya que algunas de las funciones que implementa no estn disponibles o no son estndar en otrosUNIX, tales como g_strerror (). Otras incluyen mejoras a las versiones de libc, tales como g_mal l oc, que posee

    capacidades de depuracin mejoradas.

  • 8/21/2019 Python y GTK

    9/337

    9

    Desde su versin 2.0, GLib incluye el sistema de tipos que forma la base de la jerarqua de clases de GTK+, el sistemade seales usado en sta, una API de hebras que abstrae las diferentes APIs nativas para programacin multihilo en lasdiversas plataformas, y la capacidad de cargar mdulos.

    Como ltimo componente, GTK+ usa la librera Pango para la salida de texto internacionalizado.

    Este tutorial describe la interfaz de Python con GTK+ y est basado en el tutorial de GTK+ 2.0 escrito por Tony Gale eIan Main. En l se intenta documentar en la medida posible todo PyGTK, pero en ningn caso es completo.

    Este tutorial presupone algn conocimiento previo de Python, as de cmo se crean y ejecutan programas escritos enPython. Si no se est familiarizado con Python, es recomendable previamente la lectura del Tutorial de Python. Estetutorial no presupone ningn conocimiento previo sobre GTK+ y si se utiliza PyGTK para aprender GTK+ serainteresante recibir comentarios acerca de este tutorial, y qu aspectos resultan problemticos. Este tutorial no describecmo compilar o instalar Python, GTK+ o PyGTK.

    Este tutorial est basado en:

    GTK+ desde la versin 2.0 hasta la 2.4 Python 2.2 PyGTK desde la versin 2.0 hasta la 2.4

    Los ejemplos se escribieron y probaron en una RedHat 9.0.

    Este documento est "en obras". Por favor, consltese www.pygtk.orgpara localizar las actualizaciones.

    Me gustara mucho escuchar los problemas que aparezcan al aprender PyGTK a partir de este documento, y se aprecianlos comentarios sobre cmo mejorarlo. Por favor, mira la seccin Cmo Contribuir para ms informacin. Si encuentrafallos, por favor rellene un informe de fallo enbugzilla.gnome.orgen el proyecto pygtk. Para ello, la informacin que seencuentra en www.pygtk.orgsobre Bugzilla puede resultar de gran utilidad.

    El manual de referencia de PyGTK 2.0 se encuentra disponible en http://www.pygtk.org/pygtkreference. Dicho manual

    describe detalladamente las clases de PyGTK y, por ahora, slo se encuentra disponible en ingls.

    La pgina web de PyGTK (www.pygtk.org) contiene otros recursos tiles para aprender PyGTK, incluido un enlace a laextensa FAQ(Lista de Preguntas Frecuentes, tambin en ingls nicamente), y otros artculos y cursos, as como unalista de correo activa y un canal IRC (consltese www.pygtk.orgpara los detalles).

    1.1. Exploracin de PyGTK

    Johan Dahlin escribi un pequeo programa en Python (pygtkconsole.py) que se ejecuta en Linux y permite laexploracin interactiva de PyGTK. Ese progama proporciona una interfaz de intrprete interactivo al estilo de la dePython, que se comunica con un proceso hijo que ejecuta los comandos introducidos. Los mdulos PyGTK se cargan

    por defecto al arrancar el programa. Un ejemplo simple de sesin es:

    moe: 96: 1095$ pygtkconsole.pyPyt hon 2. 2. 2, PyGTK 1. 99. 14 (Gt k+ 2. 0. 6)I nt er act i ve consol e t o mani pul at e GTK+ wi dget s.>>> w=Wi ndow( )>>> b=But t on( ' Hol a' )>>> w. add( b)>>> def hol a(b) :. . . pr i nt " Hol a Mundo! ". . .>>> b. connect ( ' cl i cked' , hol a)

    5>>> w. show_al l ( )>>> Hol a Mundo! Hol a Mundo!

  • 8/21/2019 Python y GTK

    10/337

    10

    Hol a Mundo!

    >>> b. set _l abel ( "Hol a a t odos")>>>

    En este ejemplo se crea una ventana que contiene un botn que imprime un mensaje ('Hola Mundo!') cuando se haceclic en l. El programa permite probar as fcilmente los diversos controles de GTK+ y sus interfaces PyGTK.

    Tambin es til el programa desarrollado por Brian McErlean para la receta de Activestate 65109junto con algunasmodificaciones para que funcione con PyGTK 2.X. En este curso lo llamamos gpython.pyy funciona de forma parecidaal programa pygtkconsole.py.

    Nota

    Estos dos programas no funcionan en Microsoft Windows porque necesitan funciones especficas deUnix.

    Captulo 2. Primeros Pasos

    Tabla de contenidos

    2.1. Hola Mundo en PyGTK2.2. Teora de Seales y Retrollamadas2.3. Eventos2.4. Hola Mundo Paso a Paso

    Para empezar nuestra introduccin a PyGTK, comenzaremos con el programa ms simple posible. Este programa(base.py) crear una ventana de 200x200 pxeles y no es posible salir de l excepto terminando el proceso desde laconsola.

    1 #! / usr / bi n/ env python

    23 # exampl e base. py45 i mport pygt k6 pygt k. r equi r e( ' 2. 0' )7 i mport gt k89 cl ass Base:

    10 def __i ni t __( sel f ) :11 sel f . wi ndow = gt k. Wi ndow( gt k. WI NDOW_TOPLEVEL)12 sel f . wi ndow. show( )13

    14 def mai n( sel f ) :15 gt k. mai n( )1617 pr i nt __name__18 i f __name__ == "__mai n__" :19 base = Base( )20 base. mai n( )

    Se puede ejecutar el programa anterior escribiendo en la lnea de rdenes:

    pyt hon base. py

    Si base.pyes hecho ejecutable y se puede encontrar en la variable PATH, es posible ejecutarlo usando:

    base. py

  • 8/21/2019 Python y GTK

    11/337

    11

    En este caso, la lnea 1 pedir al intrprete de Python que ejecute base.py. Las lneas 5-6 ayudan a diferenciar entre lasdistintas versiones de PyGTK que puedan estar instaladas en el equipo. Estas lneas indican que se desea usar la versin2.0 de PyGTK, que comprende todas las versiones de PyGTK con 2 como nmero principal. Ello impide que el

    programa utilice versiones anteriores de PyGTK, en caso de que se encuentren instaladas en el sistema. Las lneas 18-20comprueban si la variable__name__es "__mai n__" , lo cual indica que el programa est siendo ejecutadodirectamente por python y no est siendo importado en un intrprete Python. En el primer caso el programa crea unanueva instancia de la clase Basey guarda una referencia a ella en la variable base. Despus llama la funcin mai n()

    para iniciar el bucle de procesamiento de eventos de GTK.

    Una ventana similar a Figura 2.1, Ventana Simple PyGTKdebera aparecer en tu pantalla.

    Figura 2.1. Ventana Simple PyGTK

    La primera lnea permite al programa base.pyser invocado desde una consola Linux o Unix asumiendo que pythonseencuentre en el PATH. Esta lnea aparecer como primera lnea en todos los programas de ejemplo.

    Las lneas 5-7 importan el mdulo PyGTK 2 e inicializan el entorno GTK+. El mdulo PyGTK define las interfacesPython de las funciones GTK+ que se usarn en el programa. Para quienes estn familiarizados con GTK+ hay queadvertir que la inicializacin incluye la llamada a la funcin gt k_ i ni t (). Tambin se configuran algunas cosas pornosotros, tales como el visual por defecto, el mapa de colores, manejadores de seales predeterminados. Asimismocomprueba los argumentos que se pasan al programa desde la lnea de comandos, en busca de alguno entre:

    --gtk-module --g-fatal-warnings --gtk-debug --gtk-no-debug --gdk-debug

    --gdk-no-debug --display --sync --name --class

    En este caso, los borra de la lista de argumentos y deja los no coincidentes que no reconoce para que el programa loprocese o ignore. El anterior conjunto de argumentos son los que aceptan de forma estndar todos los programas GTK+.

    Las lneas 9-15 definen una clase de Python llamada Baseque define un mtodo de inicializacin de instancia__i ni t __(). La funcin__i ni t __() crea una ventana de nivel superior (lnea 11) y ordena a GTK+ que la muestre(lnea 12). La gt k. Wi ndowse crea en la lnea 11 con el argumento gt k. WI NDOW_TOPLEVELque indica que sedesea una ventana sometida a las decoraciones y posicionamiento del manejador de ventanas. En vez de crear unaventana de tamao 0x0, una ventana sin hijos tiene un tamao predeterminado de 200x200 de forma que se puedamanipular.

  • 8/21/2019 Python y GTK

    12/337

    12

    Las lneas 14-15 definen el mtodo mai n() que llama a la funcin PyGTK mai n(), que invoca el bucle principal deprocesamiento de eventos de GTK+ para manejar eventos de ratn y de teclado, as como eventos de ventana.

    Las lneas 18-20 permiten al programa comenzar automticamente si es llamado directamente o pasado como argumentoal intrprete de Python. En estos casos, el nombre de programa que hay en la variable__name__ser la cadena"__mai n__" y el cdigo entre las lneas 18-20 se ejecutar. Si el programa se carga en un intrprete de Python enejecucin, las lneas 18-20 no sern ejecutadas.

    La lnea 19 crea una instancia de la clase Basellamada base. Crea una gt k. Wi ndowy la muestra como resultado.

    La lnea 20 llama al mtodo mai n() de la clase Base, la cual comienza el bucle de procesamiento de eventos de GTK+.Cuando el control llega a este punto, GTK+ se dormir a la espera de eventos de las X (como pulsaciones de teclas o

    botones), alarmas, o notificaciones de entrada/salida de ficheros. En el ejemplo, sin embargo, los eventos son ignorados.

    2.1. Hola Mundo en PyGTK

    Ahora seguimos con un programa con un control (un botn). Es la versin PyGTK del clsico programa hola mundo(helloworld.py).

    1 #! / usr / bi n/ env python23 # ej empl o hel l owor l d. py45 i mport pygt k6 pygt k. r equi r e( ' 2. 0' )7 i mport gt k89 cl ass Hel l oWor l d:

    1011 # Est a es una f unci n de r et r ol l amada. Se i gnoran l os argument os de12 # dat os en est e ej empl o. Ms sobre r et r ol l amadas ms abaj o.

    13 def hel l o( sel f , wi dget , dat a=None) :14 pr i nt "Hel l o Wor l d"1516 def del et e_event ( sel f , wi dget , event , dat a=None) :17 # Si se devuel ve FALSE en el gest or de l a seal "del et e_event " ,18 # GTK emi t i r l a seal "dest r oy" . La devol uci n de TRUE19 # si gni f i ca que no se desea l a dest r ucci n de l a vent ana.20 # Est o si r ve para pr esent ar di l ogos como: ' Est segur o de que21 # desea sal i r ?'22 pr i nt "del et e event occur r ed"2324 # Si se cambi a FALSE a TRUE l a ventana pr i nci pal no se

    25 # dest r ui r con "del et e_event " .26 r et ur n gt k. FALSE2728 # Ot r a r et r ol l amada29 def dest r oy(sel f , wi dget , dat a=None) :30 gt k. mai n_qui t ( )3132 def __i ni t __( sel f ) :33 # se cr ea una vent ana nueva34 sel f . wi ndow = gt k. Wi ndow( gt k. WI NDOW_TOPLEVEL)3536 # Cuando se env a a una vent ana l a seal "del ete_event " ( est o l o

    hace37 # geral ment e el gest or de vent anas, usual ment e con "cer r ar" , ocon el i cono

  • 8/21/2019 Python y GTK

    13/337

    13

    38 # de l a vent ana de t t ul o) , pedi mos que l l ame l a f unci ndel et e_event ( )

    39 # def i ni da ar r i ba. Los dat os pasados a l a r et r ol l amada son40 # NULL y se i gnoran en l a f unci n de r et r ol l amada.41 sel f . wi ndow. connect ( "del et e_event ", sel f . del et e_event )4243 # Conect amos el evento "dest r oy" a un manej ador de seal .44 # Est e event o sucede cuando l l amamos gtk_wi dget _dest r oy( ) par a

    l a vent ana,45 # o si devol vemos FALSE en l a r et r ol l amada "del ete_event " .46 sel f . wi ndow. connect ( "dest r oy", sel f . dest r oy)4748 # Est abl ece el gr osor del borde de l a vent ana.49 sel f . wi ndow. set _bor der _wi dt h( 10)5051 # Cr ea un nuevo botn con l a et i queta "Hel l o Wor l d" .52 sel f . but t on = gt k. But t on( "Hel l o Wor l d")5354 # Cuando el bot n r eci be l a seal "cl i cked" , l l amar l a55 # f unci n hel l o( ) a l a que pasa None como argument o. La f unci n

    hel l o( )56 # se def i ne ms arr i ba.57 sel f . but t on. connect( "cl i cked", sel f . hel l o, None)5859 # Est o causar l a dest r ucci n de l a vent ana al l l amar a60 # gt k_wi dget_dest r oy( wi ndow) cuando se pr oduzca "cl i cked" . De

    nuevo,61 # l a seal podr a veni r de aqu o del gest or de vent anas.62 sel f . but t on. connect _obj ect ( "cl i cked", gt k. Wi dget . dest r oy,

    sel f . wi ndow)6364 # Est o empaquet a el bot n en l a vent ana ( un cont enedor de GTK+) .65 sel f . wi ndow. add( sel f . but t on)6667 # El paso f i nal es most r ar el cont r ol r eci n cr eado.68 sel f . but t on. show( )6970 # y l a ventana71 sel f . wi ndow. show( )7273 def mai n( sel f ) :74 # Todas l as apl i caci ones de PyGTK deben t ener una l l amada a

    gt k. mai n( ) . Aqu se dej a75 # el cont r ol y se espera que suceda un evento ( como un evento de

    t ecl ado o r at n) .76 gt k. mai n( )7778 # Si el progr ama se ej ecuta di r ect ament e o se pasa como argument o al

    i nt r pr et e79 # de Python, ent onces se cr ea una i nst anci a de Hel l oWor l d y se muest r a80 i f __name__ == "__mai n__" :81 hel l o = Hel l oWor l d( )82 hel l o. mai n( )

    Figura 2.2, Programa de ejemplo: Hola Mundomuestra la ventana creada por helloworld.py.

    Figura 2.2. Programa de ejemplo: Hola Mundo

  • 8/21/2019 Python y GTK

    14/337

    14

    Las variables y funciones que se definen en el mdulo PyGTK se llaman de la forma gt k. * . Por ejemplo, el programahelloworld.pyusa:

    gt k. FALSEgt k. mai nqui t ( )gt k. Wi ndow( )gt k. But t on( )

    del mdulo PyGTK. En futuras secciones no se especificar el prefijo del mdulo gtk, pero se dar por asumido.Naturalmente, los programas de ejemplo usarn los prefijos del mdulo.

    2.2. Teora de Seales y Retrollamadas

    Nota

    En la versin 2.0 de GTK+, el sistema de seales se ha movido de GTK+ a GLib. No entraremos endetalles sobre las extensiones que GLib 2.0 tiene en relacin con el sistema de seales de GTK 1.2. Lasdiferecias no deberan notarse en el uso de PyGTK.

    Antes de entrar en detalle en helloworld.py, discutiremos las seales y las retrollamadas. GTK+ es una bibliotecaorientada a eventos, lo que significa que se dormir en la funcin gt k. mai n() hasta que un evento ocurra y el control

    pase a la funcin apropiada.

    Esta delegacin del control se realiza usando la idea de "seales". (Ntese que estas seales no son las mismas que lasseales de los sistemas Unix, y no se implementan usando stas, aunque la terminologa es casi idntica) Cuando ocurre

    un evento, como cuando presionamos un botn del ratn, la seal apropiada se "emite" por el el control que fupresionado. As es cmo GTK+ hace la mayora de su trabajo til. Hay seales que todos los controles heredan, como"destroy", y hay seales que son especficas de cada control, como "toggled" en el caso de un botn de activacin.

    Para hacer que un botn realice una accin, debemos configurar un manejador de seales que capture estas seales yllame a la funcin apropiada. Esto se hace usando un mtodo de gt k. Wi dget (heredado de la clase GObj ect ) como

    por ejemplo:

    handl er _i d = obj ect . connect ( name, func, func_data)

    donde objectes la instancia de gt k. Wi dget (un control) que estar emitiendo la seal, y el primer argumento

    namees una cadena que contiene el nombre de la seal que se desea capturar. El segundo argumento, func, es lafuncin que se quiere llamar cuando se produce el evento. El tercer argumento, func_data, son los datos que sedesean pasar a la funcin func. El mtodo devuelve un handler_id que se puede usar para desconectar o bloquear el usodel manejador.

    La funcin especificada en el tercer argumento se llama "funcin de retrollamada", y generalmente tiene la forma:

    def cal l back_f unc( widget, callback_data) :

    donde el primer argumento ser una referencia al widget(control) que emiti la seal, y el segundo(callback_data) una referencia a los datos dados como ltimo argumento en el mtodo connect () mostrado antes.

    Si la funcin de retrollamada es un mtodo de un objeto entonces tendr la forma general siguiente:

    def cal l back_met h( self, widget, callback_data) :

  • 8/21/2019 Python y GTK

    15/337

    15

    donde selfes la instancia del objeto que invoca este mtodo. Esta es la forma usada en el programa de ejemplohelloworld.py.

    Nota

    La forma anterior de declaracin de una funcin de retrollamada a seales es slo una gua general, yaque las seales especficas de los distintos controles generan diferentes parmetros de llamada.

    Otra llamada que se usa en el ejemplo helloworld.pyes:

    handl er _i d = obj ect . connect _obj ect ( name, func, slot_object)

    connect _obj ect () es idntica a connect (), exceptuando que una funcin de retrollamada slo usa un argumento, yun mtodo de retrollamada, dos argumentos:

    def cal l back_f unc( object)def cal l back_met h( self, object)

    donde objectnormalmente es un control. connect _obj ect () permite usar los mtodos de controles PyGTK qu

    solo admiten un argumento (self) como manejadores de seales.

    2.3. Eventos

    Adems del mecanismo de seales descrito anteriormente, hay un conjunto de eventos que reflejan el mecanismo deeventos de X. Las retrollamadas tambin se pueden conectar a estos eventos. Estos eventos son:

    eventbut t on_press_eventbut t on_r el ease_eventscr ol l _eventmot i on_not i f y_event

    del et e_eventdest r oy_eventexpose_eventkey_press_eventkey_r el ease_eventent er _not i f y_eventl eave_not i f y_eventconf i gur e_eventf ocus_i n_eventf ocus_out _eventmap_eventunmap_event

    pr oper t y_not i f y_eventsel ect i on_cl ear _eventsel ect i on_r equest _eventsel ect i on_not i f y_eventpr oxi mi t y_i n_eventpr oxi mi t y_out _eventvi s i bi l i t y_not i f y_eventcl i ent _eventno_expose_eventwi ndow_st ate_event

    Para conectar una funcin de retrollamada a uno de estos eventos se usa el mtodoconnect

    (), como se ha dichoanteriormente, usando uno de los nombres de eventos anteriores en el parmetro name. La funcin (o mtodo) deretrollamada para eventos es ligeramente diferente de la usada para seales:

  • 8/21/2019 Python y GTK

    16/337

    16

    def cal l back_f unc( widget, event, callback_data) :

    def cal l back_met h( self, widget, event, callback_data) :

    gdk. Event es un tipo de objetos Python cuyos atributos de tipo indicarn cul de los eventos anteriores ha ocurrido.Los otros atributos del evento dependern del tipo de evento. Los valores posibles para los tipos son:

    NOTHI NG

    DELETEDESTROYEXPOSEMOTI ON_NOTI FYBUTTON_PRESS

    _2BUTTON_PRESS_3BUTTON_PRESSBUTTON_RELEASEKEY_PRESSKEY_RELEASEENTER_NOTI FYLEAVE_NOTI FY

    FOCUS_CHANGECONFI GUREMAPUNMAPPROPERTY_NOTI FYSELECTI ON_CLEARSELECTI ON_REQUESTSELECTI ON_NOTI FYPROXI MI TY_I NPROXI MI TY_OUTDRAG_ENTERDRAG_LEAVE

    DRAG_MOTI ONDRAG_STATUSDROP_STARTDROP_FI NI SHEDCLI ENT_EVENTVI SI BI LI TY_NOTI FYNO_EXPOSESCROLLWI NDOW_STATESETTI NG

    Para acceder a estos valores se aade el prefijo gt k. gdk. al tipo de evento. Por ejemplo, gt k. gdk. DRAG_ENTER.

    Por tanto, para conectar una funcin de retrollamada a uno de estos eventos se usara algo como:

    but t on. connect ( "button_press_event", button_press_callback)

    Esto asume que buttones un control gt k. But t on. Entonces, cuando el ratn est sobre el botn y se pulse un botndel ratn, se llamar a la funcin button_press_callback. Esta funcin se puede definir as:

    def but t on_pr ess_cal l back( widget, event, data) :

    El valor que devuelve esta funcin indica si el evento debe ser propagado por el sistema de manejo de eventos GTK+.

    Devolviendo gtk. TRUEindicamos que el evento ha sido procesado, y que no debe ser propagado. Devolviendogt k. FALSEse continua el procesamiento normal del evento. Es aconsejable consultar la seccin ProcesamientoAvanzado de Eventos y Sealespara obtener ms detalles sobre el sistema de propagacin.

  • 8/21/2019 Python y GTK

    17/337

    17

    Las APIs de seleccin y arrastrar y soltar de GDK tambin emiten unos cuantos eventos que se reflejan en GTK+ pormedio de seales. Consulta Seales en el Control de Orgen y Seales en el Control de Destinopara obtener ms detallessobre la sintaxis de las funciones de retrollamada para estas seales:

    sel ect i on_r ecei vedsel ect i on_getdr ag_begi n_eventdrag_end_eventdr ag_dat a_del et edrag_mot i ondr ag_dr opdr ag_dat a_getdr ag_dat a_r ecei ved

    2.4. Hola Mundo Paso a Paso

    Ahora que ya conocemos la teora general, vamos a aclarar el programa de ejemplo helloworld.pypaso a paso.

    Las lneas 9-76 definen la clase Hel l oWor l d, que contiene todas las retrollamadas como mtodos de objeto y el

    mtodo de inicializacin de objetos. Examinemos los mtodos de retrollamada:

    Las lneas 13-14 definen el mtodo de retrollamada hel l o() que ser llamado al pulsar el botn. Cuando se llama a estemtodo, se imprime "Hello World" en la consola. En el ejemplo ignoramos los parmetros de la instancia del objeto, elcontrol y los datos, pero la mayora de las retrollamadas los usan. El parmetro datase define con un valor

    predeterminado igual a Noneporque PyGTK no pasar ningn valor para los datos si no son incluidos en la llamada aconnect (); esto producira un error ya que la retrollamada espera tres argumentos y nicamente recibe dos. Ladefinicin de un valor por defecto Nonepermite llamar a la retrollamada con dos o tres parmetros sin ningn error. Eneste caso el parmetro de datos podra haberse omitido, ya que el mtodo hel l o() siempre ser llamado con slo dos

    parmetros (nunca se usan los datos de usuario). En el siguiente ejemplo usaremos el argumento de datos para saber qubotn fue pulsado.

    def hel l o( sel f , wi dget , dat a=None) :pr i nt "Hel l o Wor l d"

    La siguiente retrollamada (lneas 16-26) es un poco especial. El evento "delete_event" se produce cuando el manejadorde ventanas manda este evento al programa. Tenemos varias posibilidades en cuanto a qu hacer con estos eventos.Podemos ignorarlos, realizar algun tipo de respuesta, o simplemente cerrar el programa.

    El valor que se devuelva en esta retrollamada le permite a GTK+ saber qu accin realizar. Si devolvemosTRUEhacemos saber que no queremos que se emita la seal "destroy", y as nuestra aplicacin sigue ejecutndose. Sidevolvemos FALSEpedimos que se emita la seal "destroy", que a su vez llamar a nuestro manejador de la seal

    "destroy". Ntese que se han quitado los comentarios para mayor claridad.def del et e_event ( wi dget , event , dat a=None) :

    pr i nt "del et e event occur r ed"r et ur n gt k. FALSE

    El mtodo de retrollamada destroy() (lneas 29-30) hace que el programa termine mediante la lllamada agt k. mai n_qui t (). Esta funcin indica a GTK que debe salir de la funcin gt k. mai n() cuando el control le seatransferido.

    def dest r oy( wi dget , dat a=None) :gt k. mai n_qui t ( )

    Las lneas 32-71 definen el mtodo de inicializacin de instancia__i ni t __() del objeto Hel l oWor l d, el cual crea laventana y los controles que se usan en el programa.

  • 8/21/2019 Python y GTK

    18/337

    18

    La lnea 34 crea una nueva ventana, pero no se muestra directamente hasta que comunicamos a GTK+ que lo haga, casial final del programa. La referencia a la ventana se guarda en un atributo de instancia (self.window) para poder acceder aella despus.

    sel f . wi ndow = gt k. Wi ndow( gt k. WI NDOW_TOPLEVEL)

    Las lneas 41 y 46 ilustran dos ejemplos de cmo conectar un manejador de seal a un objeto, en este caso a wi ndow.Aqu se captura el evento "delete_event" y la seal "destroy". El primero se emite cuando cerramos la ventana a travs

    del manejador de ventanas o cuando usamos la llamada al mtodo destroy() de gt k. Wi dget . La segunda se emitecuando, en el manejador de "delete_event", devolvemos FALSE.

    sel f . wi ndow. connect ( "del et e_event ", sel f . del et e_event )sel f . wi ndow. connect ( "dest r oy", sel f . dest r oy)

    La lnea 49 establece un atributo de un objeto contenedor (en este caso wi ndow) para que tenga un rea vaca de 10pxeles de ancho a su alrededor en donde no se site ningn control. Hay otras funciones similares que se tratarn en laseccin Establecimiento de Atributos de Controles

    sel f . wi ndow. set _bor der _wi dt h( 10)

    La lnea 52 crea un nuevo botn y guarda una referencia a l en sel f . but t on. El botn tendr la etiqueta "HelloWorld" cuando se muestre.

    sel f . but t on = gt k. But t on( "Hel l o Wor l d")

    En la lnea 57 conectamos un manejador de seal al botn, de forma que, cuando emita la seal "clicked", se llame anuestro manejador de retrollamada hel l o(). No pasamos ningn dato a hel l o() as que simplemente se entrega Nonecomo dato. Obviamente, la seal "clicked" se emite al hacer clic en el botn con el cursor del ratn. El valor del

    parmetro de los datos Noneno es imprescindible y podra omitirse. La retrollamada se llamar con un parmetromenos.

    sel f . but t on. connect( "cl i cked", sel f . hel l o, None)

    Tambin vamos a usar este botn para salir del programa. La lnea 62 muestra cmo la seal "destroy" puede venir delmanejador de ventanas, o de nuestro programa. Al hacer clic en el botn, al igual que antes, se llama primero a laretrollamada hel l o(), y despus a la siguiente en el orden en el que han sido configuradas. Se pueden tener todas lasretrollamadas que sean necesarias, y se ejecutarn en el orden en el que se hayan conectado.

    Como queremos usar el mtodo destroy() de la clase gt k. Wi dget que acepta un argumento (el control que se va adestruir - en este caso wi ndow), utilizamos el mtodo connect _obj ect () y le pasamos la referencia a la ventana. Elmtodo connect _obj ect () organiza el primer argumento de la retrollamada para que sea wi ndowen vez del botn.

    Cuando se llama el mtodo destroy() de la clase gt k. Wi dget se emite la seal "destroy" desde la ventana, lo que asu vez provocar la llamada al mtodo destroy() de la clase Hel l oWor l dque termina el programa.

    sel f . but t on. connect _obj ect ( "cl i cked", gt k. Wi dget . dest r oy, sel f . wi ndow)

    La lnea 65 es una llamada de colocacin, que se explicar en profundidad ms tarde, en Colocacin de Controles ,aunque es bastante fcil de entender. Simplemente indica a GTK+ que el botn debe situarse en la ventana en donde seva a mostrar. Ha de tenerse en cuenta que un contenedor GTK+ nicamente puede contener un control. Otros controles,descritos ms adelante, estn diseados para posicionar varios controles de otras maneras.

    sel f . wi ndow. add( sel f . but t on)

    Ahora lo tenemos todo configurado como queremos. Con todos los manejadores de seales, y el botn situado en laventana donde debera estar, pedimos a GTK (lneas 66 y 69) que muestre los controles en pantalla. El control de

  • 8/21/2019 Python y GTK

    19/337

    19

    ventana se muestra en ltimo lugar, para que la ventana entera aparezca de una vez y no primero la ventana y luego elbotn dentro de ella dibujndose. Sin embargo, con un ejemplo tan simple, sera difcil apreciar la diferencia.

    sel f . but t on. show( )

    sel f . wi ndow. show( )

    Las lneas 73-75 definen el mtodo mai n() que llama a la funcin gt k. mai n()

    def mai n( sel f ) :gt k. mai n( )

    Las lneas 80-82 permiten al programa ejecutarse automticamente si es llamado directamente o como argumento delintrprete de python. La lnea 81 crea una instancia de la clase Hel l oWor l dy guarda una referencia a ella en lavariable hel l o. La lnea 82 llama al mtodo mai n() de la clase Hel l oWor l dpara empezar el bucle de procesamientode eventos GTK.

    i f __name__ == "__mai n__ " :hel l o = Hel l oWor l d( )hel l o. mai n( )

    Ahora, cuando hagamos clic con el botn del ratn en el botn GTK, el control emitir una seal "clicked". Para poderusar esta informacin, nuestro programa configura un manejador de seal que capture esta seal, la cual llama a lafuncin que decidamos. En nuestro ejemplo, cuando se pulsa el botn que hemos creado, se llama el mtodo hel l o()con un argumento None, y despus se llama el siguiente manejador para esta seal. El siguiente manejador llama a lafuncin destroy() del control con la ventana como su argumento y de esta manera causa que la ventana emita la seal"destroy", que es capturada y llama al mtodo destroy() de la clase Hel l oWor l d

    Otra funcin de los eventos es usar el manejador de ventanas para eliminar la ventana, lo que causar que se emita"delete_event". Esto llamar a nuestro manejador de "delete_event". Si devolvemosTRUEaqu, la ventana se quedarcomo si nada hubiera pasado. Devolviendo FALSEhar que GTK+ emita la seal "destroy", que llama a la retrollamada

    "destroy" de la clase Hel l oWor l dcerrando GTK+.

    Captulo 3. Avanzando

    Tabla de contenidos

    3.1. Ms sobre manejadores de seales3.2. Un Hola Mundo Mejorado

    3.1. Ms sobre manejadores de seales

    Veamos otra vez la llamada a connect() .

    obj ect . connect ( name, f unc, f unc_dat a)

    El valor de retorno de connect () es un nmero entero que identifica la retrollamada. Como ya se ha mencionado, esposible disponer de tantas retrollamadas por seal como sea necesario, y cada una de ellas se ejecutar por turnos, en elmismo orden de conexin.

    Este identificador permite eliminar la retrollamada de la lista de retrollamadas activas mediante el mtodo:

    obj ect. di sconnect( i d)

    As, pasando el identificador devuelto por los mtodos de conexin, es posible desconectar un manejador de seal.

  • 8/21/2019 Python y GTK

    20/337

    20

    Tambin es posible deshabilitar temporalmente un manejador de seal mediante los mtodos handl er _bl ock() yhandl er _unbl ock().

    obj ect . handl er _bl ock( handl er _i d)

    obj ect . handl er _unbl ock( handl er _i d)

    3.2. Un Hola Mundo Mejorado

    1 #! / usr / bi n/ env python23 # Ej empl o hel l owor l d2. py45 i mport pygt k6 pygt k. r equi r e( ' 2. 0' )7 i mport gt k89 cl ass Hel l oWor l d2:

    1011 # La r et r ol l amada mej orada. Los dat os que se pasan a est a f unci n

    12 # se i mpr i men por l a sal i da est ndar.13 def cal l back( sel f , wi dget , dat a) :14 pr i nt "Hel l o agai n - %s was pr essed" % dat a1516 # ot r a r et r ol l amada17 def del et e_event ( sel f , wi dget , event , dat a=None) :18 gt k. mai n_qui t ( )19 r et ur n gt k. FALSE2021 def __i ni t __( sel f ) :22 # Cr eamos una vent ana23 sel f . wi ndow = gt k. Wi ndow( gt k. WI NDOW_TOPLEVEL)

    2425 # Est a l l amada est abl ece el t t ul o de l a26 # ventana como "Hel l o But t ons! "27 sel f . wi ndow. set _t i t l e( "Hel l o But t ons! ")2829 # Aqu est abl ecemos un manej ador par a del et e_event que30 # sal e i nmedi at ament e de GTK+.31 sel f . wi ndow. connect ( "del et e_event ", sel f . del et e_event )3233 # Est abl ece el gr osor del borde de l a vent ana34 sel f . wi ndow. set _bor der _wi dt h( 10)35

    36 # Cr eamos una caj a en l a que empaquet ar l os cont r ol es. Est o sedescr i be det al l adament e

    37 # en l a secci n de "empaquetado". La caj a no es vi si bl e enr eal i dad si no que si mpl ement e

    38 # f aci l i t a l a or gani zaci n de l os cont r ol es.39 sel f . box1 = gt k. HBox( gt k. FALSE, 0)4041 # I nt r oduci mos l a caj a en l a vent ana pr i nci pal42 sel f . wi ndow. add( sel f . box1)4344 # Cr ea un nuevo bot n con l a et i quet a "But t on 1".45 sel f . but t on1 = gt k. But t on( "But t on 1" )

    4647 # Ahora, cuando se pul sa el botn, l l amamos al mtodo "cal l back"48 # con un punt er o a "but t on 1" como ar gumento49 sel f . but t on1. connect( "cl i cked", sel f . cal l back, "but t on 1")

  • 8/21/2019 Python y GTK

    21/337

    21

    5051 # En vez de usar add( ) , empaquet amos est e bot n en l a caj a

    vi si bl e52 # que ha si do i nt r oduci da en l a vent ana.53 sel f . box1. pack_st ar t ( sel f . but t on1, gt k. TRUE, gt k. TRUE, 0)5455 # Hay que r ecor dar si empre est e paso, que i ndi ca a GTK+ que l a

    pr epar aci n del56 # bot n ha t ermi nado y que ya es posi bl e most r ar l o.57 sel f . but t on1. show( )5859 # Segui mos l os mi smos pasos par a cr ear el segundo bot n60 sel f . but t on2 = gt k. But t on( "But t on 2" )6162 # Ll amamos l a mi sma r et r ol l amada pero con un ar gumento

    di f er ent e,63 # haci endo r ef er enci a a "but t on 2" est a vez.64 sel f . but t on2. connect( "cl i cked", sel f . cal l back, "but t on 2")6566 sel f . box1. pack_st ar t ( sel f . but t on2, gt k. TRUE, gt k. TRUE, 0)6768 # El or den en que most r amos l os bot ones no es muy i mpor t ant e,

    per o es r ecomendabl e69 # most r ar l a vent ana en l t i mo l ugar , puest o que as aparece

    t odo de una vez.70 sel f . but t on2. show( )71 sel f . box1. show( )72 sel f . wi ndow. show( )7374 def mai n( ) :75 gt k. mai n( )7677 i f __name__ == "__mai n__" :78 hel l o = Hel l oWor l d2( )79 mai n( )

    Al ejecutar helloworld2.pyse genera la ventana de la Figura 3.1, Ejemplo mejorado de Hola Mundo.

    Figura 3.1. Ejemplo mejorado de Hola Mundo

    Esta vez se puede ver que no hay forma fcil de salir del programa, y resulta necesario usar el gestor de ventanas o lalnea de comandos para eliminarlo. Un buen ejercicio para el lector sera insertar un tercer botn "Salir" que cerrara el

    programa. Sera interesante jugar con las opciones de pack_start() al tiempo que se lee la siguiente seccin, as comoprobar a cambiar de tamao la ventana y observar qu sucede.

    Como nota, hay que mencionar otra constante til para gt k. Wi ndow() - WI NDOW_DI ALOG. Este tipo de ventanainteracta de forma distinta con el gestor de ventanas y debe usarse en ventanas de uso transitorio.

    A continuacin se describen en orden las pequeas diferencias del cdigo respecto a la versin inicial del programa

    "Hola Mundo":

    Como ya se ha dicho, no existe manejador del evento "destroy" en esta versin mejorada de "Hola Mundo".

  • 8/21/2019 Python y GTK

    22/337

    22

    Las lneas 13-14 definen un mtodo de retrollamada similar a la retrollamada hel l o() del ejemplo inicial. La diferenciareside en que ahora la retrollamada imprime un mensaje que incluye los datos que se le suministran.

    La lnea 27 pone ttulo a la barra de ttulo de la ventana (vase la Figura 3.1, Ejemplo mejorado de Hola Mundo).

    La lnea 39 crea una caja horizontal (gtk. HBox) que almacena los dos botones que se crean en las lneas 45 y 60. Lalnea 42 aade la caja horizontal al contenedor de la ventana.

    Las lneas 49 y 64 conectan el mtodo cal l back() a la seal "clicked" de los botones. Y cada botn establece unacadena diferente que se pasa al mtodo cal l back() al ser invocado.

    Las lneas 53 y 66 empaquetan los botones en la caja horizontal. Y, finalmente, las lneas 57 y 70 indican a GTK+ quemuestre los botones.

    Las lneas 71-72 piden finalmente a GTK+ que muestre la caja y la ventana.

    Captulo 4. Empaquetado de Controles

    Tabla de contenidos

    4.1. Teora de Cajas Empaquetadoras4.2. Las Cajas en detalle4.3. Programa de Ejemplo de Empaquetado4.4. Uso de Tablas para el Empaquetado4.5. Ejemplo de Empaquetado con Tablas

    Normalmente, cuando se crea un programa, se desea poner ms de un control en la ventana. Nuestro primer ejemplo"Hola Mundo" usaba un nico control para poder llamar simplemente al mtodo add() de la clase gt k. Cont ai ner

    para "empaquetar" el control en la ventana. Sin embargo, en cuanto se quiera poner ms de un control en una ventana,cmo se determina la posicin en la que se sita el control?. Aqu es donde el "empaquetado" de controles entra en

    juego.

    4.1. Teora de Cajas Empaquetadoras

    La mayora del empaquetado se realiza utilizando cajas. stas son contenedores invisibles de controles y son de dostipos: cajas horizontales y cajas verticales. En el primer tipo los los objetos se insertan horizontalmente, de izquierda aderecha o de derecha a izquierda, en funcin de la llamada que se use; mientras que en el segundo tipo, las cajasverticales, los controles se empaquetan de arriba a abajo o viceversa. Es posible utilizar combinaciones de cajasinsertadas en otras cajas y obtener cualquier efecto que se desee.

    Para crear una nueva caja horizontal se usa la llamada gtk. HBox(), y con cajas verticales gt k. VBox() . Los mtodospack_start () y pack_end() se utilizan para colocar los objetos dentro de estos contenedores. El primer mtodo,

    pack_start (), inserta los objetos yendo de arriba hacia abajo en una caja vertical, y de izquierda a derecha en unacaja horizontal. El mtodo pack_end() muestra el comportamiento opuesto, empaqueta de abajo hacia arriba en unacaja vertical, y de derecha a izquierda en una caja horizontal. Con estos mtodos se pueden alinear a la derecha o a laizquierda los controles, de tal forma que se consiga el efecto buscado. A lo largo de los ejemplos de este tutorial se usarfundamentalmente el mtodo pack_start (). Un objeto puede ser adems bien otro contenedor o bien un control. Dehecho, muchos controles son en realidad tambin contenedores, como ocurre con los botones, aunque normalmente seuse slo una etiqueta en su interior.

    Con las llamadas anteriores se indica a GTK+ cmo ha de situar los controles y as es capaz de cambiar su tamao yotras propiedades interesantes de forma automtica. Y, como es de esperar, dicho mtodo proporciona adems granflexibilidad a la hora de situar y crear controles.

    4.2. Las Cajas en detalle

  • 8/21/2019 Python y GTK

    23/337

    23

    A causa de esta flexibilidad, el empaquetado de cajas puede resultar confuso al principio, dado que admite muchasopciones cuyo funcionamiento conjunto no resulta obvio. Sin embargo, existen bsicamente cinco estilos. La Figura 4.1,Empaquetado: Cinco variacionesmuestra el resultado de la ejecucin del programa packbox.pycon un argumento de1:

    Figura 4.1. Empaquetado: Cinco variaciones

    Cada lnea contiene una caja horizontal (hbox) con varios botones. La llamada a pack es una copia de la llamada a packen cada uno de los botones de la Hbox. Cada botn se empaqueta en la hbox de la misma manera (con los mismosargumentos al mtodo pack_start () ).

    Este es un ejemplo del mtodo pack_start():

    box. pack_st ar t ( chi l d, expand, f i l l , paddi ng)

    boxes la caja donde se empaqueta el objeto. El primer argumento, child, es el objeto que se va a empaquetar. Porahora los objetos sern botones, con lo que estaramos empaquetando botones dentro de cajas.

    El argumento expandde pack_start () y pack_end() controla si los controles se disponen de forma que ocupentodo el espacio extra de la caja y, de esta manera, sta se expande hasta ocupar todo el rea reservada para ella (TRUE);o si se encoge para ocupar el espacio justo de los controles (FALSE). Poner expand a FALSEpermite justificar a laderecha y a la izquierda los controles. Si no, se expandirn para llenar la caja, y el mismo efecto podra obtenerse usandoslo o pack_start () o pack_end().

    El argumento fillcontrola si el espacio extra se utiliza en los propios objetos (TRUE) o como espacio extra en la caja

    alrededor de los objetos (FALSE). Slo tiene efecto si el argumento expand tambin esTRUE.

    Python permite definir un mtodo o funcin con valores de argumento predeterminados y argumentos con nombre. A lolargo de este tutorial se ver la definicin de las funciones y mtodos con valores predeterminados y argumentos connombre cuando sean de aplicacin. Por ejemplo, el mtodo pack_start se define as:

    box. pack_st ar t ( child, expand=gtk. TRUE, fill=gtk. TRUE, padding=0)

    box. pack_end(child, expand=gtk. TRUE, fill=gtk. TRUE, padding=0)

    child, expand, fillypaddingson palabras clave (argumentos con nombre). Los argumentos expand, filly

    paddingtienen los valores predeterminados (o "por defecto") mostrados arriba. El argumento childdebeespecificarse obligatoriamente al no tener un valor predeterminado.

    Las funciones que nos permiten crear una caja nueva son:

  • 8/21/2019 Python y GTK

    24/337

    24

    hbox = gt k. HBox( homogeneous=gt k. FALSE, spacing=0)

    vbox = gt k. VBox( homogeneous=gt k. FALSE, spacing=0)

    El argumento homogeneousde gtk. HBox() y gt k. VBox() controla si cada objeto de la caja tiene el mismo tamao(por ejemplo, el mismo ancho en una hbox, o la misma altura en una vbox). Si se usa, las rutinas de empaquetadofuncionan basicamente como si el argumento expand estuviera siempre activado.

    Qu diferencia existe entre spacing(se fija al crear la caja) ypadding(se determina al empaquetar los elementos)?El spacingse aade entre objetos, y elpaddingse aade a cada lado de un objeto. La Figura 4.2, Empaquetadocon Spacing y Paddingilustra la diferencia, pasando un argumento de 2 a packbox.py:

    Figura 4.2. Empaquetado con Spacing y Padding

    La Figura 4.3, Empaquetado con pack_end()ilustra el uso del mtodo pack_end() (pasa un argumento de 3 apackbox.py). La etiqueta "end" se empaqueta con el mtodo pack_end(). Se mantendr en el borde derecho de laventana cuando sta se redimensione.

    Figura 4.3. Empaquetado con pack_end()

    4.3. Programa de Ejemplo de Empaquetado

    Aquest el cdigo usado para crear la imagen anterior. Est profusamente comentado, as que no resultar complicadoseguirlo. Es recomendable su ejecucin y jugar posteriormente con l.

    1 #! / usr / bi n/ env python

    23 # ej empl o packbox. py45 i mport pygt k

  • 8/21/2019 Python y GTK

    25/337

    25

    6 pygt k. r equi r e( ' 2. 0' )7 i mport gt k8 i mpor t sys, st r i ng9

    10 # Funci n auxi l i ar que cr ea una nueva HBox l l ena de botones con et i queta.Los ar gumentos

    11 # de l as var i abl es en l as que t enemos i nt ers se pasan a est a f unci n. Nomost r amos l a

    12 # caj a per o s t odo l o que cont i ene.1314 def make_box(homogeneous, spaci ng, expand, f i l l , paddi ng) :1516 # Cr eamos una nueva HBox con l os par met r os homogeneous17 # y spaci ng adecuados.18 box = gtk. HBox( homogeneous, spaci ng)1920 # Cr eamos una ser i e de bot ones con l os par met r os adecuados21 but t on = gt k. But t on( "box. pack")22 box. pack_st ar t ( but t on, expand, f i l l , paddi ng)23 but t on. show( )2425 but t on = gt k. But t on( "( but t on, ")26 box. pack_st ar t ( but t on, expand, f i l l , paddi ng)27 but t on. show( )2829 # Cr eamos un botn con una et i quet a que depende del val or de30 # expand.31 i f expand == gtk. TRUE:32 but t on = gt k. But t on( "TRUE, " )33 el se:34 but t on = gt k. But t on( "FALSE, " )3536 box. pack_st ar t ( but t on, expand, f i l l , paddi ng)37 but t on. show( )3839 # Aqu hacemos l o mi smo que en l a cr eaci n del bot n de "expand"40 # ant er i or , per o usa l a f orma abr evi ada.41 but t on = gt k. But t on( ( "FALSE, ", "TRUE, ") [ f i l l ==gt k. TRUE] )42 box. pack_st ar t ( but t on, expand, f i l l , paddi ng)43 but t on. show( )4445 padst r = "%d)" % paddi ng4647 but t on = gt k. But t on( padst r )48 box. pack_st ar t ( but t on, expand, f i l l , paddi ng)49 but t on. show( )50 r etur n box5152 cl ass PackBox1:53 def del et e_event ( sel f , wi dget , event , dat a=None) :54 gt k. mai n_qui t ( )55 r et ur n gt k. FALSE5657 def __i ni t __( sel f , whi ch) :5859 # Cr eamos nuest r a vent ana

    60 sel f . wi ndow = gt k. Wi ndow( gt k. WI NDOW_TOPLEVEL)6162 # Si empre debemos r ecordar l a conexi n de l a seal del ete_event

  • 8/21/2019 Python y GTK

    26/337

    26

    63 # a l a vent ana pr i nci pal . Est o es muy i mport ant e de cara a uncomport ami ento

    64 # i nt ui t i vo adecuado65 sel f . wi ndow. connect ( "del et e_event ", sel f . del et e_event )66 sel f . wi ndow. set_bor der _wi dt h( 10)6768 # Cr eamos una caj a ver t i cal ( vbox) en l a que empaquetar l as caj as

    hor i zont al es.69 # Est o nos per mi t e api l ar l as caj as hor i zont al es l l enas de

    bot ones70 # una enci ma de ot r a en est a vbox.71 box1 = gt k. VBox( gt k. FALSE, 0)7273 # qu ej empl o most r amos. st os se cor r esponden a l as i mgenes

    ant er i or es.74 i f whi ch == 1:75 # cr eamos una et i quet a nueva.76 l abel = gt k. Label ( "HBox(FALSE, 0) " )7778 # Al i neamos l a et i queta al l ado i zqui erdo. Coment aremos est e

    y otros79 # mt odos en l a secci n sobr e At r i but os de l os Cont r ol es.80 l abel . set _al i gnment ( 0, 0)8182 # Empaquetamos l a et i queta en l a caj a ver t i cal ( vbox box1) .

    Recurdese que83 # l os cont r ol es que se aaden a una caj a ver t i cal se api l an

    uno enci ma del ot r o84 # en or den.85 box1. pack_st ar t ( l abel , gt k. FALSE, gt k. FALSE, 0)8687 # Most r amos l a et i quet a88 l abel . show( )8990 # Ll amamos a nuest r a f unci n de cr ear caj a - homogeneous =

    FALSE, spaci ng = 0,91 # expand = FALSE, f i l l = FALSE, paddi ng = 092 box2 = make_box( gt k. FALSE, 0, gt k. FALSE, gt k. FALSE, 0)93 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)94 box2. show( )9596 # Ll amamos a nuest r a f unci n de cr ear caj a - homogeneous =

    FALSE, spaci ng = 0,97 # expand = TRUE, f i l l = FALSE, paddi ng = 098 box2 = make_box( gt k. FALSE, 0, gt k. TRUE, gt k. FALSE, 0)99 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)

    100 box2. show( )101102 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng103 box2 = make_box( gtk. FALSE, 0, gtk. TRUE, gtk. TRUE, 0)104 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)105 box2. show( )106107 # Cr ea un separ ador , que ver emos qu hacen ms adel ante,108 # aunque son muy si mpl es.

    109 separ at or = gt k. HSepar at or( )110111 # Empaquetamos el separ ador en l a vbox. Recurdese que

    empaquet amos t odos est os

  • 8/21/2019 Python y GTK

    27/337

    27

    112 # cont r ol es en una vbox, por l o que se api l arn113 # ver t i cal ment e.114 box1. pack_st ar t ( separ at or , gt k. FALSE, gt k. TRUE, 5)115 separ at or . show( )116117 # Cr eamos ot r a et i quet a y l a most r amos.118 l abel = gt k. Label ( "HBox( TRUE, 0) " )119 l abel . set _al i gnment ( 0, 0)120 box1. pack_st ar t ( l abel , gt k. FALSE, gt k. FALSE, 0)121 l abel . show( )122123 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng124 box2 = make_box( gtk. TRUE, 0, gtk. TRUE, gtk. FALSE, 0)125 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)126 box2. show( )127128 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng129 box2 = make_box( gtk. TRUE, 0, gtk. TRUE, gtk. TRUE, 0)130 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)131 box2. show( )132133 # Ot r o separ ador .134 separ at or = gt k. HSepar at or( )135 # Los l t i mos 3 argument os de pack_st ar t son:136 # expand, f i l l , paddi ng.137 box1. pack_st ar t ( separ at or , gt k. FALSE, gt k. TRUE, 5)138 separ at or . show( )139 el i f whi ch == 2:140 # Cr eamos una et i quet a nueva, r ecor dando que box1 es una vbox

    cr eada141 # cer ca del comi enzo de __ i ni t __( )142 l abel = gt k. Label ( "HBox( FALSE, 10) " )143 l abel . set _al i gnment ( 0, 0)144 box1. pack_st ar t ( l abel , gt k. FALSE, gt k. FALSE, 0)145 l abel . show( )146147 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng148 box2 = make_box( gtk. FALSE, 10, gtk. TRUE, gtk. FALSE, 0)149 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)150 box2. show( )151152 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng153 box2 = make_box( gtk. FALSE, 10, gtk. TRUE, gtk. TRUE, 0)154 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)155 box2. show( )156157 separ at or = gt k. HSepar at or( )158 # Los l t i mos 3 argument os de pack_st ar t son:159 # expand, f i l l , paddi ng.160 box1. pack_st ar t ( separ at or , gt k. FALSE, gt k. TRUE, 5)161 separ at or . show( )162

    163 l abel = gt k. Label ( "HBox( FALSE, 0) " )164 l abel . set _al i gnment ( 0, 0)165 box1. pack_st ar t ( l abel , gt k. FALSE, gt k. FALSE, 0)166 l abel . show( )

  • 8/21/2019 Python y GTK

    28/337

    28

    167168 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng169 box2 = make_box( gtk. FALSE, 0, gtk. TRUE, gtk. FALSE, 10)170 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)171 box2. show( )172173 # Los argument os son: homogeneous, spaci ng, expand, f i l l ,

    paddi ng174 box2 = make_box( gtk. FALSE, 0, gtk. TRUE, gtk. TRUE, 10)175 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)176 box2. show( )177178 separ at or = gt k. HSepar at or( )179 # Los l t i mos 3 argument os de pack_st ar t son:180 # expand, f i l l , paddi ng.181 box1. pack_st ar t ( separ at or , gt k. FALSE, gt k. TRUE, 5)182 separ at or . show( )183184 el i f whi ch == 3:185186 # Est o i l ust r a l a posi bi l i dad de usar pack_end( ) par a187 # al i near l os cont r ol es a l a der echa. Pr i mer o cr eamos una

    caj a nueva, como ant es.188 box2 = make_box( gt k. FALSE, 0, gt k. FALSE, gt k. FALSE, 0)189190 # Cr eamos l a et i queta que pondr emos al f i nal .191 l abel = gt k. Label ( "end")192 # La empaquetamos con pack_end( ) , por l o que se pone en el

    ext r emo der echo193 # de l a hbox cr eada en l a l l amada a make_box( ) .194 box2. pack_end( l abel , gt k. FALSE, gt k. FALSE, 0)195 # Most r amos l a et i queta.196 l abel . show( )197198 # Empaquet amos l a box2 en box1199 box1. pack_st ar t ( box2, gt k. FALSE, gt k. FALSE, 0)200 box2. show( )201202 # Un separ ador par a l a par t e de abaj o.203 separ at or = gt k. HSepar at or( )204205 # Est o est abl ece expl ci t ament e el ancho del separador a 400

    p xel es y 5206 # p xel es de al t o. As l a hbox que cr eamos t ambi n t endr a

    400207 # p xel es de ancho, y l a et i queta "end" est ar separada de

    l as ot r as208 # de l a hbox. En ot r o caso, t odos l os cont r ol es de l a209 # hbox est ar an empaquet ados l o ms j unt os posi bl e.210 separ at or . set _si ze_r equest ( 400, 5)211 # empaquet amos el separador en l a vbox ( box1) cr eada cer ca

    del pr i nci pi o212 # de __i ni t __( )213 box1. pack_st ar t ( separ at or , gt k. FALSE, gt k. TRUE, 5)214 separ at or . show( )

    215216 # Cr eamos ot r a hbox nueva. Recor demos que podr amos usar cuantasqueramos!

    217 qui t box = gt k. HBox( gt k. FALSE, 0)

  • 8/21/2019 Python y GTK

    29/337

    29

    218219 # Nuest r o bot n de sal i da.220 but t on = gt k. But t on( "Qui t " )221222 # Conf i gur amos l a seal que f i nal i ce el pr ogr ama al pul sar el

    bot n223 but t on. connect ( "cl i cked", l ambda w: gt k. mai n_qui t ( ) )224 # Empaquet amos el bot n en l a qui t box.225 # Los 3 l t i mos argument os de pack_st ar t son:226 # expand, f i l l , paddi ng.227 qui t box. pack_st ar t ( but t on, gt k. TRUE, gt k. FALSE, 0)228 # empaquetamos l a qui t box en l a vbox ( box1)229 box1. pack_st ar t ( qui t box, gt k. FALSE, gt k. FALSE, 0)230231 # Empaquet amos l a vbox ( box1) , que ahor a cont i ene t odos l os

    cont r ol es,232 # en l a vent ana pr i nci pal .233 sel f . wi ndow. add( box1)234235 # Y most r amos t odo l o que queda236 but t on. show( )237 qui t box. show( )238239 box1. show( )240 # Most r ando l a ventana al f i nal de f orma que t odo aparezca de una

    vez.241 sel f . wi ndow. show( )242243 def mai n( ) :244 # y, nat ur al ment e, el bucl e de event os pr i nci pal .245 gt k. mai n( )246 # El cont r ol se devuel ve a est e punt o cuando se l l ama a mai n_qui t ( ) .247 r etur n 0248249 i f __name__ =="__mai n__" :250 i f l en( sys. ar gv) ! = 2:251 sys. st der r . wr i t e( "usage: packbox. py num, wher e num i s 1, 2, or

    3 . \n" )252 sys. exi t ( 1)253 PackBox1( st r i ng. at oi ( sys. ar gv[ 1] ) )254 mai n( )

    El pequeo tour por el cdigo packbox.pyempieza por las lineas 14-50 que definen una funcin auxiliar make_boxque crea una caja horizontal y la rellena con botones segn los parmetros especficados. Devuelve una referencia a la

    caja horizontal.

    Las lineas 52-241 definen el mtodo de inicializacin__i ni t __() de la clase PackBox1que crea una ventana y unacaja vertical en ella que se rellena con una configuracin de controles que depende del argumento que recibe. Si se le

    pasa un 1, las lineas 75-138 crean una ventana que muestra las cinco nicas posibilidades que resultan de variar losparmetros homogeneous, expand y fill. Si se le pasa un 2, las lineas 140-182 crean una ventana que muesstra lasdiferentes combinaciones de fill con spacing y padding. Finalmente, si se le pasa un 3, las lineas 188-214 crean unaventana que muestra el uso del mtodo pack_start () para justificar los botones a la izquierda y el mtodopack_end() para justificar una etiqueta a la derecha. Las lineas 215-235 crean una caja horizontal que contiene un

    botn que se empaqueta dentro de la caja vertical. La seal 'clicked' del botn est conectada a la funcin PyGTKgt k. mai n_qui t () para terminar el programa.

    Las lineas 250-252 comprueban los argumentos de la lnea de comandos y terminan el programa usando la funcinsys. exi t () si no hay exactamente un argumento. La lnea 251 crea una instancia de PackBox1. La lnea 253 llama ala funcin gt k. mai n() para empezar el bucle de procesamiento de eventos GTK+.

  • 8/21/2019 Python y GTK

    30/337

    30

    En este programa de ejemplo, las referencias a los controles (excepto a la ventana) no se guardan en los atributos deinstancia del objeto porque no se necesitan ms tarde.

    4.4. Uso de Tablas para el Empaquetado

    Veamos otra manera de empaquetado. Mediante tablas. Pueden ser extremadamente tiles en determinadas situaciones.

    Al usar tablas, creamos una rejilla en donde podemos colocar los controles, que pueden ocupar tantos espacios como

    especifiquemos.

    Lo primero que debemos mirar es, obviamente, la funcin gt k. Tabl e() :

    t abl e = gt k. Tabl e( rows=1, columns=1, homogeneous=FALSE)

    El primer argumento es el nmero de filas de la tabla, mientras que el segundo, obviamente, es el nmero de columnas.

    El argumento homogeneoustiene que ver con el tamao de las celdas de la tabla. Si homogeneousesTRUE, lasceldas de la tabla tienen el tamao del mayor control en ella. Si homogeneouses FALSE, el tamao de las celdasviene dado por el control ms alto de su misma fila, y el control ms ancho de su columna.

    Las filas y las columnas se disponen de 0 a n, donde n es el nmero que se especific en la llamada a gt k. Tabl e().Por tanto, si se especifica rows (filas) = 2 y columns (columnas) = 2, la dispoisicin quedara as:

    0 1 20+- - - - - - - - - - +- - - - - - - - - - +| | |

    1+- - - - - - - - - - +- - - - - - - - - - +| | |

    2+- - - - - - - - - - +- - - - - - - - - - +

    Obsrvese que el sistema de coordenadas tiene su orgien en la esquina superior izquierda. Para introducir un control en

    una caja, se usa el siguiente mtodo:

    t abl e. at t ach( child, left_attach, right_attach, top_attach, bottom_attach,xoptions=EXPAND| FI LL, yoptions=EXPAND| FI LL, xpadding=0,

    ypadding=0)

    La instancia table es la tabla que se cre con gt k. Tabl e(). El primer parmetro ("child") es el control que se deseaintroducir en la tabla.

    Los argumentos left_attach, right_attach, top_attachy bottom_attachespecifican dnde situar elcontrol, y cuntas cajas usar. Si se quiere poner un botn en la esquina inferior derecha de una tabla 2x2, y se quiere que

    ocupe SLO ese espacio, left_attachsera = 1, right_attach= 2, top_attach= 1, bottom_attach= 2.

    Ahora, si se desea que un control ocupe la fila entera de la tabla 2x2, se pondra left_attach= 0, right_attach= 2, top_attach= 0, bottom_attach= 1.

    Los argumentos xoptionse yoptionsse usan para especificar opciones de colocacin y pueden unirse mediante laoperacin OR, permitiendo as mltiples opciones.

    Estas opciones son:

    FI LLSi la caja es ms grande que el control, y se especifica FI LL, el control se expandir hasta usar todo el espaciodisponible.

    SHRI NK Si se le asigna menos espacio a la tabla del que solicit (normalmente porque el usuario ha redimensionado laventana entonces los controles normalmente sera em u ados a la arte inferior de la ventana

  • 8/21/2019 Python y GTK

    31/337

    31

    desapareceran. Si se especifica SHRI NK, los controles se encojern con la tabla.

    EXPAND Esto har que la tabla se expanda para usar el espacio sobrante en la ventana.

    El Padding es igual que en las cajas, ya que crea un espacio vaco especificado en pxeles alrededor del control.

    Tambin tenemos los mtodos set _r ow_spaci ng() y set _col _spaci ng(), que aaden espacio entre las filas enla columna o fila especificada.

    t abl e. set _r ow_spaci ng( row, spacing)

    y

    t abl e. set _col _spaci ng( column, spacing)

    Obsrvese que, para las columnas, el espacio va a la derecha de la columna, y, para las filas, el espacio va debajo de lafila.

    Tambin se puede poner un espacio igual en todas las filas y/o columnas con:

    t abl e. set _r ow_spaci ngs( spacing)

    y,

    t abl e. set _col _spaci ngs( spacing)

    Obsrvese que con stas funciones, la ltima fila y la ltima columna no obtienen ningn espacio.

    4.5. Ejemplo de Empaquetado con Tablas

    El programa de ejemplo table.pycrea una ventana con tres botones en una tabla 2x2. Los primeros dos botones secolocarn en la fila superior. Un tercer botn, para salir, se coloca en la fila inferior, y ocupa las dos columnas. LaFigura 4.4, Empaquetado haciendo uso de una Tablailustra la ventana resultante:

    Figura 4.4. Empaquetado haciendo uso de una Tabla

    Aqu sigue el cdigo fuente:

    1 #! / usr / bi n/ env python23 # ej empl o t abl e. py45 i mport pygt k6 pygt k. r equi r e( ' 2. 0' )7 i mport gt k

    89 cl ass Tabl e:10 # Nuest r a r et r ol l amada.

  • 8/21/2019 Python y GTK

    32/337

    32

    11 # Los dat os que se pasan a est e mt odo se i mpr i men por l a sal i daest ndar .

    12 def cal l back( sel f , wi dget , dat a=None) :13 pr i nt "Hel l o agai n - %s was pr essed" % dat a1415 # Est a r et r ol l amada sal e del pr ogr ama.16 def del et e_event ( sel f , wi dget , event , dat a=None) :17 gt k. mai n_qui t ( )18 r et ur n gt k. FALSE1920 def __i ni t __( sel f ) :21 # Cr eamos una vent ana nueva22 sel f . wi ndow = gt k. Wi ndow( gtk. WI NDOW_TOPLEVEL)2324 # Est abl ecemos el t t ul o de l a vent ana25 sel f . wi ndow. set _t i t l e( "Tabl e")2627 # Fi j amos un manej ador par a del et e_event que sal e de GTK+28 # i nmedi at amente.29 sel f . wi ndow. connect ( "del et e_event ", sel f . del et e_event )3031 # Fi j amos el gr osor de l os bordes.32 sel f . wi ndow. set_bor der _wi dt h( 20)3334 # Cr eamos una t abl a 2x2.35 t abl e = gt k. Tabl e( 2, 2, gt k. TRUE)3637 # Ponemos l a t abl a en l a vent ana pr i nci pal38 sel f . wi ndow. add( t abl e)3940 # Cr eamos el pr i mer botn41 but t on = gt k. But t on( "but t on 1" )4243 # Cuando se pul sa el bot n l l amamos al mtodo "cal l back"44 # con una i ndi caci n a "but t on 1" como argument o.45 but t on. connect ( "cl i cked", sel f . cal l back, "but t on 1")464748 # I nser t amos el botn 1 en el cuadr ant e super i or i zqui er do de l a

    t abl a.49 t abl e. at t ach( but t on, 0, 1, 0, 1)5051 but t on. show( )5253 # Cr eamos el segundo botn.5455 but t on = gt k. But t on( "but t on 2" )5657 # Cuando se pul sa el bot n l l amamos al mtodo "cal l back"58 # con una i ndi caci n a "but t on 2" como argument o.59 but t on. connect ( "cl i cked", sel f . cal l back, "but t on 2")60 # I nser t amos el botn 2 en el cuadr ant e super i or derecho de l a

    t abl a.61 t abl e. at t ach( but t on, 1, 2, 0, 1)6263 but t on. show( )

    6465 # Cr eamos el bot n de sal i da "Qui t "66 but t on = gt k. But t on( "Qui t " )67

  • 8/21/2019 Python y GTK

    33/337

    33

    68 # Cuando se pul sa el bot n l l amamos a l a f unci n mai n_qui t y69 # el programa se t er mi na70 but t on. connect ( "cl i cked", l ambda w: gt k. mai n_qui t ( ) )7172 # I nser t amos el botn de sal i da en l os dos cuadr ant es i nf er i ores

    de l a t abl a73 t abl e. at t ach( but t on, 0, 2, 1, 2)7475 but t on. show( )7677 t abl e. show( )78 sel f . wi ndow. show( )7980 def mai n( ) :81 gt k. mai n( )82 r etur n 08384 i f _ _name__ == "__mai n__" :85 Tabl e( )86 mai n( )

    La claseTabl ese define en las lneas 9-78. Las lneas 12-13 definen el mtodo cal l back() que se llama al hacer"click" en dos de los botones. La retrollamada slo imprime un mensaje en la consola indicando qu botn se pulsusando los datos que se le pasan.

    Las lineas 16-18 definen el mtodo del ete_event () que se llama cuando el manejador de ventanas le pide a laventana que se elimine.

    Las lneas 20-78 definen el constructor de la claseTabl e__i ni t __(). Crea una ventana (lnea 22), le pone el ttulo(lnea 25), conecta la retrollamada del ete_event () a la seal "delete_event" (lnea 29), y le pone el ancho al borde(lnea 32). Se crea una gt k. Tabl een la lnea 35 y se aade a la ventana en la lnea 38.

    Los dos botones superiores se crean en las lneas 41 y 55, sus seales "clicked" se conectan al mtodo cal l back() enlas lneas 45 y 59; y se aaden a la tabla en la primera fila en las lneas 49 y 61. Las lneas 66-72 crean el botn "Quit",conectan su seal "clicked" a la funcin mai nqui t () y lo aaden a la tabla ocupando la fila inferior completa.

    Captulo 5. Perspectiva General de Controles

    Tabla de contenidos

    5.1. Jerarqua de Controles5.2. Controles sin Ventana

    Los pasos generales para usar un control (widget) en PyGTK son:

    Se llama a gtk.* (una de las mltiples funciones para crear un nuevo control, y que se detallan en esta seccin. Se conectan todas la seales y eventos que queramos usar a los manejadores apropiados. Se establecen los atributos del control. Se empaqueta el control dentro de un contenedor usando una llamada como gtk.Container.add() o

    gtk.Box.pack_start(). Se llama a gtk.Widget.show() en el control.

    show() le permite saber a GTK que hemos terminado de configurar los atributos del control, y est listo para sermostrado. Tambin se puede usar gt k. Wi dget . hi de() para que desaparezca otra vez. El orden en el que se muestran

    los controles no es importante, pero es conveniente que se muestre la ventana al final de modo que la toda la ventanaaparezca de una vez y no se vea como van apareciendo los controles individuales en la ventana a medida que se vanformando. Los hijos de un control (una ventana tambin es un control) no se mostrarn hasta que la propia ventana semuestre usando el mtodo show() .

  • 8/21/2019 Python y GTK

    34/337

    34

    5.1. Jerarqua de Controles

    Como referencia, aqu aparece el rbol de la jerarqua utilizada para implementar los controles. (Se han omitido loscontroles obsoletos y las clases auxiliares).

    gobj ect . GObj ect|+gt k. Obj ect ( Obj et o)

    | +gt k. Wi dget ( Cont r ol )| | +gt k. Mi sc ( Mi scl aneo)| | | +gt k. Label ( Et i quet a)| | | | `gt k. Accel Label ( Et i quet aAcel er ador a)| | | +gt k. Ar r ow ( Fl echa)| | | `gtk. I mage ( I magen)| | +gt k. Cont ai ner ( Cont enedor )| | | +gt k. Bi n ( Bi nar i o)| | | | +gt k. Al i gnment ( Al i neador )| | | | +gt k. Frame ( Mar co)| | | | | `gt k. Aspect Frame ( Mar co Pr opor ci onal )| | | | +gt k. But t on ( Bot n)

    | | | | | +gt k. Toggl eBut t on ( Bot n Bi est ado)| | | | | | `gt k. CheckBut t on ( Bot n Act i vaci n)| | | | | | `gt k. Radi oBut t on ( Bot n Excl usi n Mt ua)| | | | | +gt k. Col or But t on ( Bot n de sel ecci n de Col or )| | | | | +gt k. Font But t on ( Bot n de sel ecci n de Fuent e)| | | | | `gtk. Opt i onMenu ( Men Opci ones)| | | | +gt k. I t em ( El ement o)| | | | | +gt k. MenuI t em ( El ement o de Men)| | | | | +gt k. CheckMenuI t em ( El ement o Act i vabl e de Men)| | | | | | `gtk. Radi oMenuI t em ( El ement o de Excl usi n Mt ua de Men)| | | | | +gtk. I mageMenuI t em ( El ement o de I magen de Men)| | | | | +gt k. Separ at orMenuI t em ( El ement o de Separ aci n de Men)

    | | | | | `gt k. Tear of f MenuI t em ( Men Despr endi bl e)| | | | +gt k. Wi ndow ( Vent ana)| | | | | +gt k. Di al og ( Di l ogo)| | | | | | +gt k. Col or Sel ect i onDi al og ( Di l ogo de Sel ecci n de Col or es)| | | | | | +gt k. Fi l eChooser Di al og ( Di l ogo de Sel ecci n de Fi cher os)| | | | | | +gt k. Fi l eSel ecti on ( Sel ector de Fi cher os)| | | | | | +gt k. Font Sel ect i onDi al og ( Di l ogo de Sel ecci n de Ti pos de Let r a)| | | | | | +gt k. I nput Di al og ( Di l ogo de Ent r ada de Dat os)| | | | | | `gt k. MessageDi al og ( Di l ogo de Mensaj e)| | | | | `gt k. Pl ug ( Conectabl e)| | | | +gt k. ComboBox ( Caj a con Li st a Despl egabl e)| | | | | `gtk. ComboBoxEnt r y ( Ent r ada de Caj a de Li st a Despl egabl e)

    | | | | +gt k. Event Box (Caj a de Event os)| | | | +gt k. Expander ( Expansi n)| | | | +gt k. Handl eBox ( Manej ador de Caj a)| | | | +gt k. Tool I t em ( El ement o de Bar r a de Her r ami ent as)| | | | | +gt k. Tool But t on ( Bot n de Bar r a de Her r ami ent as)| | | | | | +gt k. Toggl eTool But t on ( Bot n Bi est ado de Bar r a de Her r ami ent as)| | | | | | | `gt k. Radi oTool But t on ( Bot n de Excl usi n Mt ua de Bar r a deHerr ami ent as)| | | | | `gtk. Separ at or TooI t em ( Separ ador de El ement os de Bar r a deHerr ami ent as)| | | | +gt k. Scr ol l edWi ndow ( Vent ana de Despl azami ent o)| | | | `gt k. Vi ewport ( Vi sta)

    | | | +gt k. Box ( Caj a)| | | | +gt k. But t onBox (Caj a de Bot ones)| | | | | +gt k. HBut t onBox ( Caj a de Bot ones Hor i zont al )| | | | | `gt k. VBut t onBox (Caj a de Bot ones Ver t i cal )

  • 8/21/2019 Python y GTK

    35/337

    35

    | | | | +gt k. VBox ( Caj a Ver t i cal )| | | | | +gt k. Col or Sel ecti on ( Sel ector de Col or es)| | | | | +gt k. Font Sel ect i on ( Sel ect or de Ti pos de Let r a)| | | | | `gtk. GammaCurve ( Curva Gamma)| | | | `gt k. HBox ( Caj a Hor i zont al )| | | | +gt k. Combo ( Li st a Despl egabl e)| | | | `gt k. St at usbar ( Bar r a de Est ado)| | | +gt k. Fi xed ( Fi j o)| | | +gt k. Paned ( Panel )| | | | +gt k. HPaned ( Panel Hor i zont al )| | | | `gt k. VPaned ( Panel Ver t i cal )| | | +gt k. Layout ( Di sposi ci n)| | | +gt k. MenuShel l ( Consol a de Men)| | | | +gt k. MenuBar ( Barr a de Men)| | | | `gt k. Menu ( Men)| | | +gt k. Notebook ( Cuader no de Fi chas)| | | +gt k. Socket ( Socket )| | | +gt k. Tabl e ( Tabl a)| | | +gt k. Text Vi ew ( Vi st a de Text o)| | | +gt k. Tool bar ( Bar r a de Her r ami ent as)| | | `gt k. Tr eeVi ew ( Vi st a de r bol )| | +gt k. Cal endar ( Cal endar i o)| | +gt k. Dr awi ngAr ea ( r ea de Di buj o)| | | `gt k. Cur ve ( Cur va)| | +gt k. Ent r y ( Ent r ada de Texto)| | | `gt k. Spi nBut t on (Bot n Aument ar / Di smi nui r )| | +gt k. Rul er ( Regl a)| | | +gt k. HRul er ( Regl a Hor i zont al )| | | `gt k. VRul er ( Regl a Ver t i cal )| | +gt k. Range ( Rango)| | | +gt k. Scal e ( Escal a)| | | | +gt k. HScal e ( Escal a Hor i zont al )| | | | `gt k. VScal e ( Escal a Ver t i cal )| | | `gt k. Scr ol l bar ( Bar r a de Despl azami ent o)| | | +gt k. HScr ol l bar ( Bar r a de Despl azami ent o Hor i zont al )| | | `gt k. VScrol l bar (Bar r a de Despl azami ent o Ver t i cal )| | +gt k. Separ at or ( Separ ador )| | | +gt k. HSepar at or ( Separ ador Hor i zont al )| | | `gt k. VSepar at or ( Separ ador Ver t i cal )| | +gt k. I nvi s i bl e ( I nvi s i bl e)| | +gt k. Progr ess ( El ement o de Progr eso)| | | `gt k. Pr ogr essBar ( Bar r a de Pr ogr eso)| +gt k. Adj ust ment ( Aj ust e)| +gt k. Cel l Render er ( Vi sual i zador de Cel da)| | +gt k. Cel l Render er Pi xbuf ( Vi sual i zador de I mgen de Cel da)| | +gt k. Cel l Render er Text ( Vi sual i zador de Texto de Cel da)| | +gt k. Cel l Render er Toggl e (Vi sual i zador de Act i vaci n de Cel da)| +gt k. Fi l eFi l t er ( Fi l t r o de Sel ecci n de Ar chi vos)| +gt k. I t emFact or y ( Fact or a de El ement os)| +gt k. Tool t i ps ( Pi stas)| `gt k. TreeVi ewCol umn (Col umna de Vi st a de r bol )+gt k. Act i on (Acci n)| +gt k. Toggl eAct i on ( Acci n Bi est ado)| | `gt k. Radi oAct i on (Acci n de Excl usi n Mt ua)+gt k. Act i onGr oup (Gr upo de Acci ones)+gtk. Ent r yCompl et i on ( Compl etado de Ent r ada)

    +gt k. I conFact or y ( Fact or a de I conos)+gtk. I conTheme ( Tema de I conos)+gtk. I MCont ext ( Cont ext o de Mtodo de Ent r ada)| +gt k. I MCont ext Si mpl e ( Cont ext o Si mpl e de Mtodo de Ent r ada)

  • 8/21/2019 Python y GTK

    36/337

    36

    | `gtk. I MMul t i cont ext ( Cont exto Ml t i pl e de Mt odo de Ent r ada)+gt k. Li st St or e ( Al macn en Li st a)+gt k. RcSt yl e (Recur so de Est i l os)+gt k. Set t i ngs ( Opci ones)+gtk. Si zeGr oup ( Gr upo de Tamao)+gt k. St yl e ( Esti l o)+gt k. Text Buf f er ( Buf f er de t ext o)+gt k. TextChi l dAnchor ( Ancl aj e Hi j o de Texto)+gtk. Text Mark ( Marca en Text o)+gt k. TextTag ( Et i quet a de Texto)+gt k. TextTagTabl e ( Tabl a de Et i quet as de Texto)+gt k. Tr eeModel Fi l t er ( Model o en r bol Fi l t r ado)+gtk. TreeModel Sor t ( Model o en r bol Or denado)+gt k. Tr eeSel ect i on (Sel ecci n de r bol )+gt k. TreeSt ore ( Al macn en r bol )+gt k. UI Manager ( Gest or de I nt er f aces de Usuar i o)+gt k. Wi ndowGr oup ( Gr upo de Ventanas)+gt k. gdk. Dr agCont ext ( Cont exto de Ar r ast r e)+gt k. gdk. Scr een ( Pant al l a)+gt k. gdk. Pi xbuf ( Buf f er de p xel es)+gt k. gdk. Dr awabl e ( Di buj abl e)| +gt k. gdk. Pi xmap ( Mapa de Bi t s)+gtk. gdk. I mage ( I magen)+gt k. gdk. Pi xbuf Ani mat i on ( Ani maci n)+gt k. gdk. Devi ce ( Di sposi t i vo de Ent r ada)

    gobj ect . GObj ect|+gt k. Cel l Layout ( Di sposi ci n de Cel das)+gt k. Edi t abl e ( Edi t abl e)+gt k. Cel l Edi t abl e ( Edi t or de Cel da)+gt k. Fi l eChooser ( Sel ecci n de Fi cher os)+gt k. TreeModel ( Model o en r bol )+gt k. TreeDr agSour ce ( Fuent e de Ar r ast r e en r bol )+gt k. TreeDr agDest ( Dest i no de Ar r ast r e en r bol )+gt k. Tr eeSor t abl e ( r bol Or denabl e)

    5.2. Controles sin Ventana

    Los siguientes controles no tienen una ventana asociada. Si quieres caputar eventos, tendrs que usar Event Box. Mirala seccin del control Event Box.

    gt k. Al i gnment ( Al i neador )

    gt k. Ar r ow ( Fl echa)gt k. Bi n ( Bi nar i o)gt k. Box (Caj a)gt k. But t on ( Bot n)gt k. CheckBut t on ( Botn de Act i vaci n)gt k. Fi xed ( Fi j o)gtk. I mage ( I magen)gt k. Label ( Et i quet a)gtk. MenuI t em ( El ement o de Men)gt k. Notebook ( Cuaderno de Fi chas)gt k. Paned ( Panel )gt k. Radi oBut t on ( Botn de Excl usi n Mt ua)

    gtk. Range ( Rango)gt k. Scr ol l edWi ndow ( Vent ana de Despl azami ent o)gt k. Separ at or ( Separ ador )gt k. Tabl e ( Tabl a)

  • 8/21/2019 Python y GTK

    37/337

    37

    gt k. Tool bar ( Bar r a de Her r ami ent as)gtk. Aspect Fr ame ( Marco de Aspect o)gt k. Fr ame ( Marco)gt k. VBox ( Caj a Ver t i cal )gt k. HBox ( Caj a Hor i zont al )gt k. VSepar at or ( Separ ador Ver t i cal )gt k. HSepar at or ( Separ ador Hor i zont al )

    Seguiremos nuestra exploracin de PyGTK examinando cada control, creando programas de ejemplo simples que losmuestren.

    Captulo 6. El Control de Botn

    Tabla de contenidos

    6.1. Botones Normales6.2. Botones Biestado (Toggle Buttons)6.3. Botones de Activacin (Check Buttons)6.4. Botones de Exclusin Mtua (Radio Buttons)

    6.1. Botones Normales

    Ya hemos visto casi todo lo que hay que ver sobre el control de botn. Es bastante sencillo. Se puede usar la funcingt k. But t on() para crear un botn con una etiqueta pasndole un parmetro de cadena, o uno en blanco si no seespecifica dicha cadena. Despus depende uno el empaquetar objetos tales como una etiqueta o un pixmap en este nuevo

    botn. Para ello, se crea una nueva caja, y despus se colocan los objetos en ella usando el tpico pack_start() .Finalmente se usa add() para colocar la caja dentro del botn.

    La funcin para crear un botn es:

    but t on = gt k. But t on( label=None, stock=None)

    si se especifica una etiqueta sta se usa como texto del botn.Si se especifica stock ste se usa para elegir un icono deserie y una etiqueta para el botn. Los elementos de serie son:

    STOCK_DI ALOG_I NFOSTOCK_DI ALOG_WARNI NGSTOCK_DI ALOG_ERRORSTOCK_DI ALOG_QUESTI ONSTOCK_DNDSTOCK_DND_MULTI PLESTOCK_ADDSTOCK_APPLY

    STOCK_BOLDSTOCK_CANCELSTOCK_CDROM

    STOCK_CLEARSTOCK_CLOSESTOCK_CONVERTSTOCK_COPYSTOCK_CUTSTOCK_DELETESTOCK_EXECUTESTOCK_FI NDSTOCK_FI ND_AND_REPLACESTOCK_FLOPPYSTOCK_GOTO_BOTTOM

    STOCK_GOTO_FI RSTSTOCK_GOTO_LAST

  • 8/21/2019 Python y GTK

    38/337

    38

    STOCK_GOTO_TOPSTOCK_GO_BACKSTOCK_GO_DOWNSTOCK_GO_FORWARDSTOCK_GO_UPSTOCK_HELPSTOCK_HOMESTOCK_I NDEXSTOCK_I TALI CSTOCK_J UMP_TOSTOCK_J USTI FY_CENTERSTOCK_J USTI FY_FI LLSTOCK_J USTI FY_LEFTSTOCK_J USTI FY_RI GHTSTOCK_MI SSI NG_I MAGESTOCK_NEW

    STOCK_NOSTOCK_OKSTOCK_OPENSTOCK_PASTESTOCK_PREFERENCESSTOCK_PRI NTSTOCK_PRI NT_PREVI EW

    STOCK_PROPERTI ESSTOCK_QUI TSTOCK_REDOSTOCK_REFRESHSTOCK_REMOVESTOCK_REVERT_TO_SAVEDSTOCK_SAVESTOCK_SAVE_ASSTOCK_SELECT_COLORSTOCK_SELECT_FONTSTOCK_SORT_ASCENDI NGSTOCK_SORT_DESCENDI NGSTOCK_SPELL_CHECKSTOCK_STOPSTOCK_STRI KETHROUGHSTOCK_UNDELETESTOCK_UNDERLI NESTOCK_UNDOSTOCK_YESSTOCK_ZOOM_100STOCK_ZOOM_FI TSTOCK_ZOOM_I NSTOCK_ZOOM_OUT

    El programa d