Tutorial de PyGTK 2.0

download Tutorial de PyGTK 2.0

of 254

Transcript of Tutorial de PyGTK 2.0

  • 8/6/2019 Tutorial de PyGTK 2.0

    1/254

    Tutorial de PyGTK 2.0

    por John Finlay y Lorenzo Gil Snchez

  • 8/6/2019 Tutorial de PyGTK 2.0

    2/254

    Tutorial de PyGTK 2.0por John Finlay y Lorenzo Gil Snchez

    Este tutorial describe el uso del mdulo de Python PyGTK.

  • 8/6/2019 Tutorial de PyGTK 2.0

    3/254

    Tabla de contenidosI. Tutorial de PyGTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1. Explorando PyGTK

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

    2. Primeros Pasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1. Hola Mundo en PyGTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2. Teora de Seales y Retrollamadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3. Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.4. Hola Mundo Paso a Paso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    3. Avanzando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.1. Ms sobre manejadores de seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.2. Un Hola Mundo Mejorado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    4. Empaquetamiento de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.1. Teora de Cajas Empaquetadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2. Detalles de Cajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    4.3. Programa de Demostracin de Empaquetamiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    214.4. Uso de Tablas para Empaquetar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.5. Ejemplo de Empaquetamiento con Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    5. Perspectiva General de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.1. Jerarqua de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.2. Controles sin Ventana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    6. El Control de Botn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346.1. Botones Normales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346.2. Botones Biestado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.3. Botones de Activacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406.4. Botones de Exclusin Mtua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    7. Ajustes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    7.1. Crear un Ajuste. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    467.2. Usar los Ajustes de la Forma Fcil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467.3. El Interior del Ajuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    8. Controles de Rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.1. Barras de Desplazamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.2. Controles de Escala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    8.2.1. Crear un Control de Escala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.2.2. Mtodos y Seales (bueno, al menos mtodos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    8.3. Mtodos Comunes de los Rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508.3.1. Establecer la Poltica de Actualizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508.3.2. Obtener y Cambiar Ajustes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    8.4. Atajos de Teclas y Ratn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518.5. Ejemplo de Control de Rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    9. Miscelanea de Controles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    589.1. Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589.2. Flechas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619.3. El Objeto Pistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639.4. Barras de Progreso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659.5. Dilogos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.6. Imgenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    9.6.1. Pixmaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739.7. Reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809.8. Barras de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849.9. Entradas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869.10. Botones Aumentar/Disminuir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    iii

  • 8/6/2019 Tutorial de PyGTK 2.0

    4/254

    Tutorial de PyGTK2.0

    9.11. Lista Desplegable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959.12. Calendario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979.13. Seleccin de Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

    9.14. Selectores de Fichero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    1089.15. Dilogo de Seleccin de Fuentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11110. Controles Contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    10.1. La Caja de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11410.2. El control Alineador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11510.3. Contenedor Fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11610.4. Contenedor de Disposicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11810.5. Marcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12110.6. Marcos Proporcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12410.7. Controles de Panel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12610.8. Puertos de Visin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12910.9. Ventanas de Desplazamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12910.10. Cajas de Botones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

    10.11. Barra de Herramientas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    13610.12. Fichas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    11. Control Men . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14811.1. Creacin de Mens Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14811.2. Ejemplo de Men Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15011.3. Usando la Factoria de Elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15311.4. Ejemplo de Factoria de Elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

    12. rea de Dibujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15612.1. Contexto Grfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15612.2. Mtodos de Dibujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

    13. Control de Vista de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16713.1. Perspectiva general de la Vista de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

    13.2. Vistas de Texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    16713.3. Buffers de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17313.3.1. Informacin de estado de un Buffer de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17413.3.2. Creacin de Iteradores de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17413.3.3. Insercin, Obtencin y Eliminacin de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . 17513.3.4. Marcas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17713.3.5. Creacin y Uso de Etiquetas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17813.3.6. Insercin de Imgenes y Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

    13.4. Iteradores de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18013.4.1. Atributos de los Iteradores de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18013.4.2. Atributos de Texto de un Iterador de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18013.4.3. Copiar un Iterador de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18113.4.4. Recuperar Texto y Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

    13.4.5. Comprobar Condiciones en un Iterador de Texto. . . . . . . . . . . . . . . . . . . . . . . .

    18213.4.6. Comprobar la localizacin de un Iterador de Texto . . . . . . . . . . . . . . . . . . . . . . . 18313.4.7. Movimiento a travs del Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18413.4.8. Moverse a una Posicin Especfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18513.4.9. Buscar en el Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

    13.5. Marcas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18513.6. Etiquetas de Texto y Tablas de Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    13.6.1. Etiquetas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18613.6.2. Tablas de Etiquetas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    13.7. Un ejemplo de Vista de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19014. Control de Vista de rbol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19315. Controles sin documentar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

    iv

  • 8/6/2019 Tutorial de PyGTK 2.0

    5/254

    Tutorial de PyGTK 2.0

    15.1. Etiqueta de Aceleracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.2. Men de Opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.3. Elementos de Men . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

    15.3.1. Elemento de Men de Activacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    19415.3.2. Elemento de Men de Exclusin Mtua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.3.3. Elemento de Men de Separacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.3.4. Elemento de Men de Cascada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

    15.4. Curvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.5. Dilogo de Mensaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.6. Curva Gamma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19415.7. Enchufes y Clavijas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

    16. Cambiar Atributos de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19516.1. Mtodos de Banderas de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19516.2. Mtodos de Visualizacin de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19616.3. Atajos de Teclador de Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19716.4. Mtodos para el Nombre de los Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

    16.5. Estilos de Controles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    19817. Temporizadores, Entrada/Salida y Funciones de Inactividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

    17.1. Temporizadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20117.2. Monitorizar la Entrada/Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20117.3. Funciones de Inactividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

    18. Procesamiento Avanzado de Eventos y Seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20318.1. Mtodos de Seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    18.1.1. Conectar y Desconectar Manejadores de Seales . . . . . . . . . . . . . . . . . . . . . . . . 20318.1.2. Bloquear y Desbloquear Manejadores de Seales . . . . . . . . . . . . . . . . . . . . . . . . 20318.1.3. Emitir y Parar Seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

    18.2. Emisin y Propagacin de Seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20419. Tratamiento de Selecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

    19.1. Perspectiva General de la Seleccin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    20519.2. Recuperar la Seleccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20519.3. Proporcionar la Seleccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

    20. Arrastrar y Soltar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21320.1. Perspectiva General de Arrastrar y Soltar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21320.2. Propiedades de Arrastrar y Soltar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21320.3. Mtodos de Arrastrar y Soltar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214

    20.3.1. Configuracin del Control Orgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21420.3.2. Seales en el Control Orgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21520.3.3. Configuracin de un Control Destino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21520.3.4. Seales en el Control Destino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

    21. Ficheros rc de GTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22021.1. Funciones para Ficheros rc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

    21.2. Formato de los Ficheros rc de GTK. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    22021.3. Ejemplo de fichero rc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

    22. Scribble, Un Ejemplo de Programa de Dibujo Simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22522.1. Perspectiva General de Scribble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22522.2. Manejo de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

    22.2.1. Scribble - Manejo de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23022.3. El Control del rea de Dibujo, y Dibujar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

    23. Trucos para Escribir Aplicaciones PyGTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23624. Contribuir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

    A. Seales GTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238A.1. GtkObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238A.2. GtkWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

    v

  • 8/6/2019 Tutorial de PyGTK 2.0

    6/254

    Tutorial de PyGTK 2.0

    A.3. GtkData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240A.4. GtkContainer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240A.5. GtkCalendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

    A.6. GtkEditable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    240A.7. GtkNotebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241A.8. GtkList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241A.9. GtkMenuShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241A.10. GtkToolbar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241A.11. GtkButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.12. GtkItem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.13. GtkWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.14. GtkHandleBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.15. GtkToggleButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.16. GtkMenuItem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.17. GtkCheckMenuItem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242A.18. GtkInputDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

    A.19. GtkColorSelection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    243A.20. GtkStatusBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243A.21. GtkCurve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243A.22. GtkAdjustment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

    B. Ejemplos de Cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244B.1. scribblesimple.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

    vi

  • 8/6/2019 Tutorial de PyGTK 2.0

    7/254

    Lista de figuras2.1. Ventana Simple PyGTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2. Programa de ejemplo Hola Mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.1. Ejemplo de Hola Mundo mejorado

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17

    4.1. Empaquetamiento: Cinco variaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2. Empaquetando con Spacing y Padding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.3. Empaquetando con pack_end() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.4. Empaquetamiento usando una Tabla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.1. Botn con Pixmap y Etiqueta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356.2. Ejemplo de Botn Biestado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386.3. Ejemplo de Botn de Activacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406.4. Ejemplo de Botones de Exclusin Mtua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438.1. Ejemplo de Controles de Rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529.1. Ejemplos de Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599.2. Ejemplos de Botones con Flechas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    9.3. Ejemplo de Pistas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    649.4. Ejemplo de Barra de Progreso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679.5. Ejemplo de Imgenes en Botones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719.6. Ejemplo de Pixmap en un Botn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759.7. Ejemplo de Ventana con Forma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769.8. Ejemplo de Reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819.9. Ejemplo de Barra de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849.10. Ejemplo de Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879.11. Ejemplo de Botn Aumentar/Disminuir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 929.12. Ejemplo de Calendario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999.13. Ejemplo de Dilogo de Seleccin de Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069.14. Ejemplo de Seleccin de Ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    9.15. Dilogo de Seleccin de Fuentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    11110.1. Ejemplo de Caja de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11410.2. Ejemplo de Fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11610.3. Ejemplo de Disposicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11910.4. Ejemplo de Marco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12210.5. Ejemplo de Marco Proporcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12410.6. Ejemplo de Panel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12610.7. Ejemplo de Ventana de Desplazamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13010.8. Ejemplo de Barra de Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14110.9. Ejemplo de Fichas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14411.1. Ejemplo de Men . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15111.2. Ejemplo de Factoria de Elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15312.1. Ejemplo de rea de Dibujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

    13.1. Ejemplo bsico de Vista de Texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    16913.2. Ejemplo de Vista de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19019.1. Ejemplo de Obtencin de la Seleccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20719.2. Ejemplo de Fijar la Seleccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21020.1. Ejemplo de Arrastrar y Soltar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21622.1. Ejemplo de Programa de Dibujo Scribble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22522.2. Ejemplo simple de Scribble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

    vii

  • 8/6/2019 Tutorial de PyGTK 2.0

    8/254

    Lista de tablas

    20.1. Seales del Control de Orgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

    20.2. Seales del Control Destino. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    216

    viii

  • 8/6/2019 Tutorial de PyGTK 2.0

    9/254

    Parte I. Tutorial de PyGTK

  • 8/6/2019 Tutorial de PyGTK 2.0

    10/254

    Captulo 1. IntroduccinPyGTK 2.0 es un conjunto de mdulos que componen una interfaz Python para GTK+ 2.0. A travs del resto de

    este documento PyGTK se refiere a la versin 2.0 de PyGTK y GTK y GTK+ se refieren a la versin 2.0 de GTK+.El principal sitio web de PyGTK es www.daa.com.au/~james/pygtk [http://www.daa.com.au/~james/pygtk]. Elprincipal autor de PyGTK es:

    James Henstridge [email protected] [mailto:[email protected]]

    Python es un lenguaje de programacin interpretado, ampliable y orientado a objectos que se distribuye con unamplio conjunto de mdulos que soportan acceso a un gran nmero de servicios del sistema operativo, serviciosde internet (como HTML, XML, FTP, etc.), grficos (incluyendo OpenGL, TK, etc.), funciones de manejo decadenas, servicios de correo (IMAP, SMTP, POP3, etc.), multimedia (audio, JPEG) y servicios de criptografa.Adems hay otros muchos mdulos disponibles por terceros que aaden otros muchos servicios. Python esdistribuido bajo trminos similares a los de la licencia GPL y est disponible para los sistemas operativos Linux,Unix, Windows y Macintosh. Ms informacion sobre Python est disponible en www.python.org. El principalautor de Python es:

    Guido van Rossum [email protected] [mailto:[email protected]]

    GTK (GIMP Toolkit) es una librera para crear interfaces de usuario grficas. Esta licenciada usando la licenciaLGPL, por lo que puedes desarrollar software abierto, software libre, o incluso software comercial no libre usandoGTK sin tener que pagar nada en licencias o derechos.

    Se llama el toolkit de GIMP porque originariamente fue escrita para desarrollar el Programa de Manipulacinde Imgenes GNU (GIMP), pero GTK se usa ahora en un amplio nmero de proyectos de software, incluyendo

    el proyecto de Entorno de Modelo de Objetos orientados a Red (GNOME). GTK est diseada encima de GDK(Kit de Dibujo de GIMP) que bsicamente es una abstraccin de las funciones de bajo nivel para acceder a lasfunciones del sistema de ventanas (Xlib en el caso del sistema de ventanas X). Los principales autores de GTKson:

    Peter Mattis [email protected] [mailto:[email protected]]

    Spencer Kimball [email protected] [mailto:[email protected]]

    Josh MacDonald [email protected] [mailto:[email protected]]

    Actualmente GTK es mantenida por:

    Owen Taylor [email protected] [mailto:[email protected]]

    Tim Janik [email protected] [mailto:[email protected]]

    2

    http://url(mailto:[email protected]%29/http://url(mailto:[email protected]%29/http://url(mailto:[email protected]%29/http://url(mailto:[email protected]%29/http://url(mailto:[email protected]%29/http://url(mailto:[email protected]%29/http://url(mailto:[email protected]%29/http://url%28http//www.daa.com.au/~james/pygtk)
  • 8/6/2019 Tutorial de PyGTK 2.0

    11/254

    Captulo 1. Introduccin

    Bsicamente GTK es 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).

    Tambin hay un tercer componente, llamado Glib, que contiene unas cuantas funciones que reemplazan algunasllamadas estandard, as como funciones adicionales para manejar listas enlazadas, etc. Las funciones de reemplazose usan para aumentar la portabilidad de GTK ya que algunas de las funciones que implementa no estn disponibleso no son estandarden otros unix tales como g_strerror(). Algunas tambin incluyen mejoras a las versiones delibc, tales como g_malloc que tiene utilidades de depuracin mejoradas.

    En la versin 2.0, GLib ha incluido el sistema de tipos que forma la base para la jerarqua de clases de GTK,el sistema de seales usado en GTK, una API de hebras que abstrae las diferentes APIs nativas de hebras de lasdiversas plataformas y una facilidad para cargar modulos.

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

    Este tutorial describe el interfaz de Python a GTK+ y esta basado en el tutorial de GTK+ 2.0 escrito por Tony Galee Ian Main. Este tutorial intenta documentar todo lo posible PyGTK, pero en ningun caso es completo.

    Este tutorial asume algn conocimiento previo de Python, y de cmo crear y ejecutar programas Python. Si no es-tas familiarizado con Python, por favor lee el Tutorial de Python [http://www.python.org/doc/current/tut/tut.html]primero. Este tutorial no asume ningun conocimiento previo de GTK; si ests aprendiendo PyGTK para aprenderGTK, por favor comenta cmo encuentras este tutorial, y con qu has tenido problemas. Este tutorial no describecmo compilar o instalar Python, GTK+ o PyGTK.

    Este tutorial est basado en:

    GTK+ 2.0.6

    Python 2.2

    PyGTK 1.99

    Los ejemplos fueron escritos y probados en una RedHat 7.2.

    Este documento est "en obras". Por favor consulta www.moeraki.com [http://www.moeraki.com/pygtktutorial]para actualizaciones.

    Me gustara mucho escuchar los problemas que ests teniendo aprendiendo PyGTK a partir de este documento,y aprecio comentarios y formas de como puede ser mejorado. Por favor mira la seccin Contribuyendo para msinformacin.

    1.1. Explorando PyGTKJohan Dahlin ha escrito un pequeo programa Python (pygtkconsole.py [examples/pygtkconsole.py]) que seejecuta en Linux y permite una exploracin interactiva de PyGTK. El progama proporciona un interfaz deintrprete interactivo al estilo de Python que se comunica con un proceso hijo que ejecuta los comandosintroducidos. Los mdulos PyGTK se cargan por defecto. Un ejemplo simple de sesin es:

    moe: 96:1095$ pygtkconsole.py

    Python 2.2.2, PyGTK 1.99.14 (Gtk+ 2.0.6)Interactive console to manipulate GTK+ widgets.>>> w=Window()>>> b=Button(Hola)

    3

    http://url%28examples/pygtkconsole.py)http://url%28http//www.moeraki.com/pygtktutorial)http://url%28http//www.python.org/doc/current/tut/tut.html)
  • 8/6/2019 Tutorial de PyGTK 2.0

    12/254

    Captulo 1. Introduccin

    >>> w.add(b)>>> def hola(b):... print "Hola Mundo!"...

    >>> b.connect(clicked, hola)5>>> w.show_all()>>> Hola Mundo!Hola Mundo!Hola Mundo!

    >>> b.set_label("Hola a todos")>>>

    Esto crea una ventana que contiene un botn que imprime un mensaje (Hola Mundo!) cuando se hace clic. Esteprograma permite probar fcilmente varios controles GTK y sus interfaces PyGTK.

    4

  • 8/6/2019 Tutorial de PyGTK 2.0

    13/254

    Captulo 2. Primeros PasosPara empezar nuestra introduccin a PyGTK, comenzaremos con el programa ms simple posible. Este programa

    (base.py [examples/base.py]) crear una ventana de 200x200 pxeles y no hay forma de salir excepto matndolodesde la consola.

    1 #!/usr/bin/env python23 # example base.py45 import gtk67 class Base:8 def __init__(self):9 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

    10 self.window.show()1112 def main(self):13 gtk.main()1415 if __name__ == "__main__":16 base = Base()17 base.main()

    Puedes ejecutar el programa anterior usando:

    python base.py

    Si base.py [examples/base.py] es hecho ejecutable y se puede encontrar en la variable PATH, puede ser ejecutadousando:

    base.py

    La lnea 1 le pedir a python que ejecute base.py [examples/base.py] en este caso. Las lneas 15-17 compruebansi la variable __name__ es "__main__", lo cual indica que el programa esta siendo ejecutado directamente porpython y no est siendo importado en un intrprete python. En este caso el programa crea una nueva instancia dela clase Base y guarda una referencia a ella en la variable base. Despus invoca la funcin main() para empezarel bucle de procesamiento de eventos de GTK.

    Una ventana similar a Figura 2.1. Ventana Simple PyGTK debera aparecer en tu pantalla.

    5

    http://url%28examples/base.py)http://url%28examples/base.py)http://url%28examples/base.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    14/254

    Captulo 2. Primeros Pasos

    Figura 2.1. Ventana Simple PyGTK

    La primera lnea permite al programa base.py [examples/base.py] ser invocado desde una consola Linux o Unixasumiendo que python se encuentre en tu PATH. Esta lnea ser la primera lnea en todos los programas de ejemplo.

    La lnea 5 importa el mdulo PyGTK e inicializa el entorno GTK+. El mdulo PyGTK define los interfacesPython para las funciones GTK+ que se usarn en el programa. Para aquellos que estn familiarizados con GTK+,la inicializacin incluye la llamada a la funcin gtk_init(). Este configura unas cuantas cosas por nosotros como

    el visual por defecto y el mapa de colores, manejadores de seales predeterminados, y comprueba los argumentosque se le pasan a tu programa desde la lnea de comandos, buscando alguno de los siguientes:

    --gtk-module

    --g-fatal-warnings

    --gtk-debug

    --gtk-no-debug

    --gdk-debug

    --gdk-no-debug

    --display

    --sync

    --name

    --class

    6

    http://url%28examples/base.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    15/254

    Captulo 2. Primeros Pasos

    Borra estos argumentos de la lista de argumentos, dejando todo lo que no reconoce para que tu programa lo proceseo ignore. Este conjunto de argumentos estandard son los que aceptan todas los programas GTK+.

    Las lneas 7-10 definen una clase de python llamada Base que define un mtodo de inicializacin de instancia__init__(). La funcin __init__() crea una ventana de nivel superior (lnea 9) y ordena a GTK+ que lamuestre (lnea 10). La GtkWindow se crea en la lnea 9 con el argumento gtk.WINDOW_TOPLEVEL que especificaque queremos una ventana sometida a las decoraciones y posicionamiento del manejador de ventanas. En vez decrear una ventana de tamao 0x0, una ventana sin hijos tiene un tamao de 200x200 por defecto para que puedasmanipularla.

    Las lneas 12-13 definen el mtodo main() que llama a la funcin PyGTK main(), la cual, invoca el bucle principalde procesamiento de eventos de GTK+ para manejar eventos de ratn y de teclado, as como eventos de ventana.

    Las lneas 15-17 permiten al programa que comience automticamente si es llamado directamente o pasado comoargumento al intrprete de python; en estos casos el nombre de programa que hay en la variable __name__ serla cadena "__main__" y el cdigo entre las lneas 16-17 ser ejecutado. Si el programa se carga en un intrprete

    de python que se est ejecutando, las lneas 16-17 no sern ejecutadas.La lnea 16 crea una instancia de la clase Base llamada base. Una GtkWindow es creada y mostrada comoresultado.

    La lnea 17 llama al mtodo main() de la clase Base, la cual comienza el bucle de procesamiento de eventos deGTK+. Cuando el control llega a este punto, GTK se dormir esperando que ocurran eventos X (como pulsacionesde teclas o botones), alarmas, o notificaciones de entrada/salida de ficheros. En nuestro ejemplo, sin embargo, loseventos son ignorados.

    2.1. Hola Mundo en PyGTKAhora haremos un programa con un control (un botn). Es la versin PyGTK del clsico programa hola mundo

    (helloworld.py [examples/helloworld.py] ).

    1 #!/usr/bin/env python23 # example helloworld.py45 import gtk67 class HelloWorld:89 # This is a callback function. The data arguments are ignored

    10 # in this example. More on callbacks below.11 def hello(self, widget, data=None):

    12 print "Hello World"1314 def delete_event(self, widget, event, data=None):15 # If you return FALSE in the "delete_event" signal handler,16 # GTK will emit the "destroy" signal. Returning TRUE means17 # you dont want the window to be destroyed.18 # This is useful for popping up are you sure you want to quit?19 # type dialogs.20 print "delete event occurred"2122 # Change TRUE to FALSE and the main window will be destroyed with23 # a "delete_event".24 return gtk.FALSE25

    7

    http://url%28examples/helloworld.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    16/254

    Captulo 2. Primeros Pasos

    26 # Another callback27 def destroy(self, widget, data=None):28 gtk.main_quit()29

    30 def __init__(self):31 # create a new window32 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)3334 # When the window is given the "delete_event" signal (this is given35 # by the window manager, usually by the "close" option, or on the36 # titlebar), we ask it to call the delete_event () function37 # as defined above. The data passed to the callback38 # function is NULL and is ignored in the callback function.39 self.window.connect("delete_event", self.delete_event)4041 # Here we connect the "destroy" event to a signal handler.42 # This event occurs when we call gtk_widget_destroy() on the window,43 # or if we return FALSE in the "delete_event" callback.44 self.window.connect("destroy", self.destroy)4546 # Sets the border width of the window.47 self.window.set_border_width(10)4849 # Creates a new button with the label "Hello World".50 self.button = gtk.Button("Hello World")5152 # When the button receives the "clicked" signal, it will call the53 # function hello() passing it None as its argument. The hello()54 # function is defined above.55 self.button.connect("clicked", self.hello, None)56

    57 # This will cause the window to be destroyed by calling58 # gtk_widget_destroy(window) when "clicked". Again, the destroy59 # signal could come from here, or the window manager.60 self.button.connect_object("clicked", gtk.Widget.destroy, self.window)6162 # This packs the button into the window (a GTK container).63 self.window.add(self.button)6465 # The final step is to display this newly created widget.66 self.button.show()6768 # and the window69 self.window.show()70

    71 def main(self):72 # All PyGTK applications must have a gtk.main(). Control ends here73 # and waits for an event to occur (like a key press or mouse event).74 gtk.main()7576 # If the program is run directly or passed as an argument to the python77 # interpreter then create a HelloWorld instance and show it78 if __name__ == "__main__":79 hello = HelloWorld()80 hello.main()

    Figura 2.2. Programa de ejemplo Hola Mundo muestra la ventana creada por helloworld.py [exam-ples/helloworld.py].

    8

    http://url%28examples/helloworld.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    17/254

    Captulo 2. Primeros Pasos

    Figura 2.2. Programa de ejemplo Hola Mundo

    Las variables y funciones que se definen en el mdulo PyGTK se llaman de la forma gtk.*. Por ejemplo, elprograma helloworld.py [examples/helloworld.py] usa:

    gtk.FALSEgtk.mainquit()gtk.Window()gtk.Button()

    del mdulo PyGTK. En futuras secciones no especificar el prefijo del mdulo gtk, pero se asumir. Por supuesto,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 entre los usuarios de PyGTK.

    Antes de que entremos en detalle en helloworld.py [examples/helloworld.py], discutiremos las seales y lasretrollamadas. GTK es una libreria orientada a eventos, lo que significa que se dormir en la funcin gtk.main()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 mismasque las seales de los sistemas Unix, y no se implementan usando estas, aunque la terminologa es casi idntica)Cuando un evento ocurre, como cuando presionamos un botn del ratn, la seal apropiada ser "emitida" por elel control que fu presionado. Asi es cmo GTK hace la mayora de su trabajo til. Hay seales que todos loscontroles heredan, como "destroy", y hay seales que son especficas a cada control, como "toggled" en un botnde activacin.

    Para hacer que un botn realice una accin, tenemos que configurar un manejador de seales que capture estas

    seales y llame a la funcin apropiada. Esto se hace usando un mtodo de GtkWidget (heredado de la claseGObject) como por ejemplo:

    handler_id = object.connect(name, func, func_data)

    donde object es la instancia de GtkWidget que estar emitiendo la seal, y el primer argumento name es unacadena que contiene el nombre de la seal que deseas capturar. El segundo argumento, func, es la funcin quequieres que sea llamada cuando es capturado, y el tercer argumento, func_data, los datos que quieres pasar aesta funcin. El mtodo devuelve un handler_id que puede usarse para desconectar o bloquear el manejador.

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

    9

    http://url%28examples/helloworld.py)http://url%28examples/helloworld.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    18/254

    Captulo 2. Primeros Pasos

    def callback_func(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() mostradoantes.

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

    def callback_meth(self, widget, callback_data):

    donde self es la instancia del objeto que invoca este mtodo. Esta es la forma usada en el programa de ejemplohelloworld.py [examples/helloworld.py].

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

    Otra llamada que se usa en el ejemplo helloworld.py [examples/helloworld.py] es:

    handler_id = object.connect_object(name, func, slot_object)

    connect_object() es lo mismo que connect() excepto que una funcin de retrollamada slo usa un argumentoy un mtodo de retrollamada, dos argumentos:

    def callback_func(object)def callback_meth(self, object)

    donde object normalmente es un control. connect_object() permite usar los mtodos de controles PyGTKqu solo admiten un argumento (self) como manejadores de seales.

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

    eventbutton_press_eventbutton_release_eventscroll_eventmotion_notify_eventdelete_eventdestroy_eventexpose_eventkey_press_eventkey_release_evententer_notify_eventleave_notify_eventconfigure_event

    10

    http://url%28examples/helloworld.py)http://url%28examples/helloworld.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    19/254

    Captulo 2. Primeros Pasos

    focus_in_eventfocus_out_eventmap_eventunmap_event

    property_notify_eventselection_clear_eventselection_request_eventselection_notify_eventproximity_in_eventproximity_out_eventvisibility_notify_eventclient_eventno_expose_eventwindow_state_event

    Para conectar una funcin de retrollamada a uno de estos eventos se usa el mtodo connect(), como se ha dicho

    anteriormente, usando uno del nombres de eventos anteriores en el parmetroname

    . La funcin (o mtodo) deretrollamada para eventos es ligeramente diferente de la usada para seales:

    def callback_func(widget, event, callback_data ):

    def callback_meth(self, widget, event, callback_data ):

    GdkEvent 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. Valores posibles para los tipos son:

    NOTHING

    DELETEDESTROYEXPOSEMOTION_NOTIFYBUTTON_PRESS

    _2BUTTON_PRESS_3BUTTON_PRESSBUTTON_RELEASEKEY_PRESSKEY_RELEASEENTER_NOTIFYLEAVE_NOTIFYFOCUS_CHANGECONFIGURE

    MAPUNMAPPROPERTY_NOTIFYSELECTION_CLEARSELECTION_REQUESTSELECTION_NOTIFYPROXIMITY_INPROXIMITY_OUTDRAG_ENTERDRAG_LEAVEDRAG_MOTIONDRAG_STATUSDROP_STARTDROP_FINISHED

    11

  • 8/6/2019 Tutorial de PyGTK 2.0

    20/254

    Captulo 2. Primeros Pasos

    CLIENT_EVENTVISIBILITY_NOTIFYNO_EXPOSESCROLL

    WINDOW_STATESETTING

    Para acceder a estos valores se le pone el prefijo gtk.gdk. al tipo evento. Por ejemplo gtk.gdk.DRAG_ENTER.

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

    button.connect("button_press_event", button_press_callback)

    Esto asume que button es un control GtkButton. Entonces, cuando el ratn este sobre el botn y un botn del

    ratn se pulse, se llamar a la funcinbutton_press_callback

    . Esta funcin puede ser definida as:

    def button_press_callback(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.TRUE indicamos que el evento ha sido procesado, y que no debe ser propagado. Devolviendogtk.FALSE se continua el procesamiento normal del evento. Consulta la seccin Procesamiento Avanzado deEventos y Seales para ms detalles sobre el sistema de propagacin.

    Las APIs de seleccin y arrastrar y soltar de GDK tambin emiten unos cuantos eventos que se reflejan en GTKpor medio de seales. Consulta Seales en el Control de Orgen y Seales en el Control de Destino para detallessobre la sintxis de las funciones de retrollamada para estas seales:

    selection_receivedselection_getdrag_begin_eventdrag_end_eventdrag_data_deletedrag_motiondrag_dropdrag_data_getdrag_data_received

    2.4. Hola Mundo Paso a PasoAhora que ya conocemos la teora que hay detrs de esto, vamos a aclarar el programa de ejemplo helloworld.py[examples/helloworld.py] paso a paso.

    Las lneas 7-74 definen la clase HelloWorld que contienen todas las retrollamadas como mtodos de objeto y elmtodo de inicializacin de objetos. Vamos a examinar los mtodos de retrollamada.

    Las lneas 11-12 definen el mtodo de retrollamada hello() que se llamar cuando el botn sea pulsado. Cuandose llama a este mtodo, se imprime "Hello World" a la consola. En este ejemplo ignoramos los parmetros de lainstancia del objeto, el control y los datos, pero la mayora de las retrollamadas los usan. El parmetro data sedefine con un valor por defecto de None porque PyGTK no pasar ningn valor para los datos si no son incluidosen la llamada a connect(); esto lanzara un error ya que la retrollamada espera tres argumentos y solo recibe dos.

    12

    http://url%28examples/helloworld.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    21/254

    Captulo 2. Primeros Pasos

    Definir un valor por defecto None permite 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 hello() siempre ser llamado con slodos parmetros (nunca se usan los datos de usuario). En el siguiente ejemplo usaremos el argumento de datos para

    saber que botn fue pulsado.

    def hello(self, widget, data=None):print "Hello World"

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

    El valor que devuelvas en esta retrollamada le permite a GTK saber qu accin realizar. Devolviendo TRUE, lehacemos saber que no queremos que se emita la seal "destroy", y asi nuestra aplicacin sigue ejecutandose.Devolviendo FALSE, pedimos 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 una mayour claridad.

    def delete_event(widget, event, data=None):print "delete event occurred"return gtk.FALSE

    El mtodo de retrollamada destroy() (lneas 27-28) hace que el programa termine mediante la lllamada agtk.main_quit() . Esta funcin le dice a GTK que debe salir de la funcin gtk.main() cuando el controlle sea transferido.

    def destroy(widget, data=None):gtk.main_quit()

    Las lneas 30-69 definen el mtodo de inicializacin de instancia __init__() del objeto HelloWorld, el cualcrea la ventana y los controles que se usan en el programa.

    La lnea 32 crea una nueva ventana, pero no se muestra directamente hasta que le decimos a GTK que lo haga, casial final del programa. La referencia a la ventana se guarda en un atributo de instancia (self.window) para poderacceder a ella despus.

    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

    Las lneas 39 y 44 ilustran dos ejemplos de cmo conectar un manejador de seal a un objeto, en este caso, awindow. Aqui se capturan el evento "delete_event" y la seal "destroy". El primero se emite cuando cerramos laventana a travs del manejador de ventanas, o cuando usamos la llamada al mtodo destroy() de GtkWidget.La segunda se emite cuando, en el manejador de "delete_event", devolvemos FALSE.

    self.window.connect("delete_event", self.delete_event)self.window.connect("destroy", self.destroy)

    La lnea 47 establece un atributo de un objeto contenedor (en este caso window) para que tenga un rea vaca de10 pxeles de ancho alrededor de l donde ningn control se situar. Hay otras funciones similares que se tratarn

    en la seccin Poniendo Atributos de Controles

    13

  • 8/6/2019 Tutorial de PyGTK 2.0

    22/254

    Captulo 2. Primeros Pasos

    self.window.set_border_width(10)

    La lnea 50 crea un nuevo botn y guarda una referencia a l en self.button. El botn tendr la etiqueta "HelloWorld" cuando se muestre.

    self.button = gtk.Button("Hello World")

    En la lnea 55 conectamos un manejador de seal al botn para que cuando emita la seal "clicked", nuestromanejador de retrollamada hello() se llame. No estamos pasandole ningn dato a hello() asi que simplementele pasamos None como dato. Obviamente la seal "clicked" se emite cuando hacemos clic en el botn con el cursordel ratn. El valor del parmetro de los datos None no es imprescindible y podra ser omitido. La retrollamada sellamar con un parmetro menos.

    self.button.connect("clicked", self.hello, None)

    Tambin vamos a usar este botn para salir de nuestro programa. La lnea 60 muestra como la seal "destroy"puede venir del manejador de ventanas, o de nuestro programa. Cuando hacemos clic en el botn, al igual queantes, se llama a la retrollamada hello() primero, y despus a la siguiente en el orden en el que son configuradas.Puedes tener todas las retrollamadas que necesistes y se ejecutarn en el orden en el que las conectaste.

    Como queremos usar el mtodo destroy() de la clase GtkWidget que acepta un argumento (el control que seva a destruir - en este caso window), utilizamos el mtodo connect_object() y le pasamos la referencia a laventana. El mtodo connect_object() organiza el primer argumento de la retrollamada para que sea windowen vez de el botn.

    Cuando se llama el mtodo destroy() de la clase GtkWidget esto provoca que se emita la seal "destroy" desdela ventana que a su vez provocar que se llame el mtodo destroy() de la clase HelloWorld para terminar elprograma.

    self.button.connect_object("clicked", gtk.Widget.destroy, self.window)

    La lnea 63 es una llamada de colocacin, que ser explicada en profundidad ms tarde en Colocando Controles. Pero es bastante fcil de entender. Simplemente le dice a GTK que el botn debe situarse en la ventana dondese mostrar. Ten en cuenta que un contenedor GTK slo puede contener un control. Hay otros controles, que sedescriben despus, que estn diseados para posicionar varios controles de diferentes maneras.

    self.window.add(self.button)

    Ahora lo tenemos todo configurado como queremos. Con todos los manejadores de seales, y el botn situadoen la ventana donde debera estar, le pedimos a GTK (lneas 65 y 69) que muestre los controles en la pantalla.El control de ventana es mostrado en ltimo lugar para que la ventana entera aparezca de una vez en vez de veraparecer la ventana, y luego el botn dentro de ella. Sin embargo, con este ejemplo tan simple, nunca apreciariasla diferencia.

    self.button.show()

    14

  • 8/6/2019 Tutorial de PyGTK 2.0

    23/254

    Captulo 2. Primeros Pasos

    self.window.show()

    Las lneas 71-74 definen el mtodo main() que llamam a la funcin gtk.main()

    def main(self):gtk.main()

    Las lneas 78-80 permiten al programa ejecutarse automticamente si es llamado directamente o como unargumento al intrprete de python. La lnea 79 crea una instancia de la clase HelloWorld y guarda una referenciaa ella en la variable hello. La lnea 80 llama al mtodo main() de la clase HelloWorld para empezar el buclede procesamiento de eventos GTK.

    if __name__ == "__main__":

    hello = HelloWorld()hello.main()

    Ahora, cuando hagamos clic con el botn del ratn en el botn GTK, el control emitir una seal "clicked". Parapoder usar esta informacin, nuestro programa configura un manejador de seal para que capture esta seal, lacual llama a la funcin que decidamos. En nuestro ejemplo, cuando el botn que hemos creado es pulsado, sellama el mtodo hello() con un argumento None, y despus se llama el siguiente manejador para esta seal. Elsiguiente manejador llama a la funcin destroy() del control con la ventana como su argumento y de esta maneracausa a la ventana que emita la seal "destroy", que es capturada, y llama a nuestro mtodo destroy() de la claseHelloWorld

    Otra funcin de los eventos es usar el manejador de ventanas para matar la ventana, lo cual causar que se emita

    "delete_event". Esto llamar nuestro manejador de "delete_event". Si devolvemos TRUE aqui, la ventana sequedar como si nada hubiera pasado. Devolviendo FALSE har que GTK emita la seal "destroy" que llama a laretrollamada "destroy" de la clase HelloWorld cerrando GTK.

    15

  • 8/6/2019 Tutorial de PyGTK 2.0

    24/254

    Captulo 3. Avanzando

    3.1. Ms sobre manejadores de sealesVeamos otra vez la llamada a connect() .

    object.connect(name, func, func_data)

    El valor de retorno de una llamada a connect() es un nmero entero que identifica tu retrollamada. Como ya seha dicho, se pueden tener tantas retrollamadas por seal como necesites, y cada una se ejecutar por turnos, en elorden en el que fueron conectadas.

    Este identificador permite eliminar la retrollamada de la lista mediante:

    object.disconnect(id)

    As, pasndole el identificador que devuelven los mtodos de conexin, se puede desconectar un manejador deseal.

    Tambin puedes deshabilitar temporalmente los manejadores de seal con los mtodos signal_handler_block()y signal_handler_unblock() .

    object.signal_handler_block(handler_id)

    object.signal_handler_unblock(handler_id)

    3.2. Un Hola Mundo Mejorado

    1 #!/usr/bin/env python23 # example helloworld2.py45 import gtk67 class HelloWorld2:8

    9 # Our new improved callback. The data passed to this method10 # is printed to stdout.11 def callback(self, widget, data):12 print "Hello again - %s was pressed" % data1314 # another callback15 def delete_event(self, widget, event, data=None):16 gtk.main_quit()17 return gtk.FALSE1819 def __init__(self):20 # Create a new window21 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)22

    16

  • 8/6/2019 Tutorial de PyGTK 2.0

    25/254

    Captulo 3. Avanzando

    23 # This is a new call, which just sets the title of our24 # new window to "Hello Buttons!"25 self.window.set_title("Hello Buttons!")26

    27 # Here we just set a handler for delete_event that immediately28 # exits GTK.29 self.window.connect("delete_event", self.delete_event)3031 # Sets the border width of the window.32 self.window.set_border_width(10)3334 # We create a box to pack widgets into. This is described in detail35 # in the "packing" section. The box is not really visible, it36 # is just used as a tool to arrange widgets.37 self.box1 = gtk.HBox(gtk.FALSE, 0)3839 # Put the box into the main window.40 self.window.add(self.box1)4142 # Creates a new button with the label "Button 1".43 self.button1 = gtk.Button("Button 1")4445 # Now when the button is clicked, we call the "callback" method46 # with a pointer to "button 1" as its argument47 self.button1.connect("clicked", self.callback, "button 1")4849 # Instead of add(), we pack this button into the invisible50 # box, which has been packed into the window.51 self.box1.pack_start(self.button1, gtk.TRUE, gtk.TRUE, 0)5253 # Always remember this step, this tells GTK that our preparation for

    54 # this button is complete, and it can now be displayed.55 self.button1.show()5657 # Do these same steps again to create a second button58 self.button2 = gtk.Button("Button 2")5960 # Call the same callback method with a different argument,61 # passing a pointer to "button 2" instead.62 self.button2.connect("clicked", self.callback, "button 2")6364 self.box1.pack_start(self.button2, gtk.TRUE, gtk.TRUE, 0)6566 # The order of showing the buttons is not really important, but I67 # recommend showing the window last, so it all pops up at once.

    68 self.button2.show()69 self.box1.show()70 self.window.show()7172 def main():73 gtk.main()7475 if __name__ == "__main__":76 hello = HelloWorld2()77 main()

    Al ejecutar helloworld2.py [examples/helloworld2.py] se genera la ventana que se ve en la Figura 3.1. Ejemplode Hola Mundo mejorado.

    17

    http://url%28examples/helloworld2.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    26/254

    Captulo 3. Avanzando

    Figura 3.1. Ejemplo de Hola Mundo mejorado

    Esta vez vers que no hay una forma fcil de salir del programa, tienes que usar tu manejador de ventanas o lalnea de comandos para matarlo. Un buen ejercicio para el lector sera insertar un tercer botn "Salir" que cerrarael programa. Puedes intentar jugar con las opciones de pack_start() mientras lees la siguiente seccin. Prueba acambiar de tamao la ventana, y observa lo que pasa.

    Slo como una nota, hay otra constante til para GtkWindow() - WINDOW_DIALOG. Esto interacciona con elmanejador de ventanas de una forma un poco diferente y debe usarse para ventanas temporales.

    A continuacin se describen en orden las pequeas diferencias en el cdigo con respecto al primer programahelloworld.

    Como ya se ha dicho no hay manejador para el evento "destroy" en la versin mejorada de helloworld.

    Las lneas 11-12 definen un mtodo de retrollamada que es similar a la retrollamada hello() en el primerhelloworld. La diferencia est en que la retrollamada imprime un mensaje incluyendo los datos que se le pasan.

    La lnea 25 le pone un ttulo en la barra de ttulo de la ventana (mira la Figura 3.1. Ejemplo de Hola Mundomejorado).

    La lnea 37 crea una caja horizontal (GtkHBox) para almacenar los dos botones que se crean en las lneas 43 y 58.La lnea 40 aade la caja horizontal al contenedor de la ventana.

    Las lneas 47 y 62 conectan el mtodo callback() a la seal "clicked" de los botones. Cada botn establece unacadena diferente para que se le pase al mtodo callback() cuando sea invocado.

    Las lneas 51 y 64 empaquetan los botones en la caja horizontal. Las lneas 55 y 68 le dicen a GTK que muestrenlos botones.

    Las lneas 69-70 le piden a GTK que muestre la caja y la ventana respectivamente.

    18

  • 8/6/2019 Tutorial de PyGTK 2.0

    27/254

    Captulo 4. Empaquetamiento de

    ControlesCuando crees un programa, querrs poner ms de un control en una ventana. Nuestro primer ejemplo holamundosolo usaba un control para que pudieramos usar simplemente el mtodo add() de la clase GtkContainer para"empaquetar" el control en la ventana. Pero cuando quieres poner ms de un control en la ventana, cmo controlasel sitio donde ese control se coloca? Aqui es donde la colocacin entra en juego.

    4.1. Teora de Cajas EmpaquetadorasLa mayora del empaquetamiento se realiza utilizando cajas. Estos contenedores invisibles de controles puedenser de dos tipos, una caja horizontal, y una caja vertical. Cuando empaquetamos controles en una caja horizontal,los objetos se insertan horizontalmente de izquierda a derecha o de derecha a izquierda dependiendo de la llamadaque se use. En una caja vertical, los controles se empaquetan de arriba a abajo o viceversa. Puedes usar unacombinacin de cajas dentro de cajas para obtener el efecto deseado.

    Para crear una nueva caja horizontal, usamos una llamada a gtk.HBox(), y para cajas verticales, gtk.VBox(). Los mtodos pack_start() y pack_end() se utilizan para colocar objetos dentro de estos contenedores. Elmtodo pack_start() empezar en la parte de arriba e ir bajando en una vbox, y de izquierda a derecha enuna hbox. El mtodo pack_end() har lo contrario, empaquetar de abajo a arriba en una vbox, y de derecha aizquierda en una hbox. Usando estos mtodos, podemos alinear a la derecha o a la izquierda nuestros controles yse pueden mezclar de la forma necesaria para obtener el efecto deseado. Usaremos pack_start() en la mayorade nuestros ejemplos. Un objeto puede ser otro contenedor o un control. De hecho, muchos controles son enrealidad contenedores por ellos mismos, incluyendo el botn, pero normalmente slo usamos una etiqueta dentrode un botn.

    Usando estas llamadas, GTK sabe donde quieres colocar tus controles y asi puede cambiar el tamao automti-camente y otras cosas interesantes. Como puedes imaginar, este mtodo nos da bastante flexibilidad al colocar ycrear controles.

    4.2. Detalles de CajasA causa de esta flexibilidad, el empaquetamiento de cajas puede ser confuso al principio. Hay muchas opciones,y no es obvio al principio cmo enacajan todas ellas. Al final, de cualquier forma, hay bsicamente cinco estilos.La Figura 4.1. Empaquetamiento: Cinco variaciones muestra el resultado de ejecutar el programa packbox.py[examples/packbox.py] con un argumento de 1:

    19

    http://url%28examples/packbox.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    28/254

    Captulo 4. Empaquetamiento deControles

    Figura 4.1. Empaquetamiento: Cinco variaciones

    Cada lnea contiene una caja horizontal (hbox) con varios botones. La llamada a pack es una copia de la llamadaa pack en cada uno de los botones de la hbox. Cada botn es empaquetado en la hbox de la misma manera (porejemplo, con los mismos argumentos al mtodo pack_start().

    Esto es un ejemplo del mtodo pack_start() .

    box.pack_start(child, expand, fill, padding)

    box es la caja donde estas empaquetando el objeto; el primer argumento, child, es el objeto que se va aempaquetar. Los objetos sern botones por ahora, por lo que estaremos empaquetando botones dentro de cajas.

    El argumento expand de pack_start() y pack_end() controla si los controles se disponen para ocupar todo elespacio extra de la caja y de esta manera la caja se expande hasta ocupar todo el rea reservada para ella (TRUE); osi la caja se encoge para ocupar el espacio justo de los controles (FALSE). Poniendo expand a FALSE te permitir

    justificar a la derecha y a la izquierda tus controles. Si no, se expandirn para llenar la caja, y el mismo efectopodra obtenerse usando slo o pack_start() o pack_end().

    El argumnto fill controla si el espacio extra se utiliza en los propios objetos (TRUE), como expacio extra en lacaja alrededor de los objetos (FALSE). Slo tiene efecto si el argumento expand tambin es TRUE.

    Python permite definir un mtodo o funcin con valores de argumento por defecto y argumentos con palabrasclave. A travs de este tutorial mostrar la definicin de las funciones y mtodos con valores por defecto ypalabras clave cuando sea aplicable. Por ejemplo, el mtodo pack_start se define as:

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

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

    20

  • 8/6/2019 Tutorial de PyGTK 2.0

    29/254

    Captulo 4. Empaquetamiento deControles

    child, expand, fill y padding son palabras clave. Los argumentos expand, fill y padding tienen losvalores por defecto mostrados arriba. El argumento child debe especificarse.

    Al crear una caja nueva, la funcin es la siguiente:

    hbox = gtk.HBox(homogeneous=gtk.FALSE, spacing=0)

    vbox = gtk.VBox(homogeneous=gtk.FALSE, spacing=0)

    El argumento homogeneous de gtk.HBox() y gtk.VBox() controla si cada objeto en la caja tiene el mismotamao (por ejemplo el mismo ancho en una hbox, or el mismo alto en una vbox). Si se usa, las rutinas deempaquetado funcionan basicamente como si el argumento expand estuviera siempre activado.

    Qu diferencia hay entre spacing (se pone cuando la caja se crea) y padding (se pone cuando los elementosse empaquetan)? El spacing se aade entre objetos, y el padding se aade a cada lado de un objeto. La

    Figura 4.2. Empaquetando con Spacing y Padding ilustra la diferencia; pasa un argumento de 2 a packbox.py[examples/packbox.py] :

    Figura 4.2. Empaquetando con Spacing y Padding

    La Figura 4.3. Empaquetando con pack_end() ilustra el uso del mtodo pack_end() (pasa un argumento de 3 a

    packbox.py [examples/packbox.py]). La etiqueta "end" se empaqueta con el mtodo pack_end(). Se mantendren el borde derecho de la ventana cuando esta sea redimensionada.

    21

    http://url%28examples/packbox.py)http://url%28examples/packbox.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    30/254

    Captulo 4. Empaquetamiento deControles

    Figura 4.3. Empaquetando con pack_end()

    4.3. Programa de Demostracin de EmpaquetamientoAqui [examples/packbox.py] est el cdigo usado para crear la imgen de arriba. Esta bastante comentado asi que

    espero que no tengas ningn problema siguiendolo. Ejectalo y juega con l.

    1 #!/usr/bin/env python23 # example packbox.py45 import gtk6 import sys, string78 # Helper function that makes a new hbox filled with button-labels. Arguments9 # for the variables were interested are passed in to this function. We do

    10 # not show the box, but do show everything inside.1112 def make_box(homogeneous, spacing, expand, fill, padding):1314 # Create a new hbox with the appropriate homogeneous15 # and spacing settings16 box = gtk.HBox(homogeneous, spacing)1718 # Create a series of buttons with the appropriate settings19 button = gtk.Button("box.pack")20 box.pack_start(button, expand, fill, padding)21 button.show()2223 button = gtk.Button("(button,")24 box.pack_start(button, expand, fill, padding)

    25 button.show()2627 # Create a button with the label depending on the value of28 # expand.29 if expand == gtk.TRUE:30 button = gtk.Button("TRUE,")31 else:32 button = gtk.Button("FALSE,")3334 box.pack_start(button, expand, fill, padding)35 button.show()3637 # This is the same as the button creation for "expand"38 # above, but uses the shorthand form.

    22

    http://url%28examples/packbox.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    31/254

    Captulo 4. Empaquetamiento deControles

    39 button = gtk.Button(("FALSE,", "TRUE,")[fill==gtk.TRUE])40 box.pack_start(button, expand, fill, padding)41 button.show()42

    43 padstr = "%d)" % padding4445 button = gtk.Button(padstr)46 box.pack_start(button, expand, fill, padding)47 button.show()48 return box4950 class PackBox1:51 def delete_event(self, widget, event, data=None):52 gtk.main_quit()53 return gtk.FALSE5455 def __init__(self, which):5657 # Create our window58 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)5960 # You should always remember to connect the delete_event signal61 # to the main window. This is very important for proper intuitive62 # behavior63 self.window.connect("delete_event", self.delete_event)64 self.window.set_border_width(10)6566 # We create a vertical box (vbox) to pack the horizontal boxes into.67 # This allows us to stack the horizontal boxes filled with buttons one68 # on top of the other in this vbox.69 box1 = gtk.VBox(gtk.FALSE, 0)

    7071 # which example to show. These correspond to the pictures above.72 if which == 1:73 # create a new label.74 label = gtk.Label("HBox(FALSE, 0)")7576 # Align the label to the left side. Well discuss this method77 # and others in the section on Widget Attributes.78 label.set_alignment(0, 0)7980 # Pack the label into the vertical box (vbox box1). Remember that81 # widgets added to a vbox will be packed one on top of the other in82 # order.83 box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)

    8485 # Show the label86 label.show()8788 # Call our make box function - homogeneous = FALSE, spacing = 0,89 # expand = FALSE, fill = FALSE, padding = 090 box2 = make_box(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE, 0)91 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)92 box2.show()9394 # Call our make box function - homogeneous = FALSE, spacing = 0,95 # expand = TRUE, fill = FALSE, padding = 096 box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.FALSE, 0)97 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)

    23

  • 8/6/2019 Tutorial de PyGTK 2.0

    32/254

    Captulo 4. Empaquetamiento deControles

    98 box2.show()99

    100 # Args are: homogeneous, spacing, expand, fill, padding101 box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.TRUE, 0)

    102 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)103 box2.show()104105 # Creates a separator, well learn more about these later,106 # but they are quite simple.107 separator = gtk.HSeparator()108109 # Pack the separator into the vbox. Remember each of these110 # widgets is being packed into a vbox, so theyll be stacked111 # vertically.112 box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)113 separator.show()114115 # Create another new label, and show it.116 label = gtk.Label("HBox(TRUE, 0)")117 label.set_alignment(0, 0)118 box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)119 label.show()120121 # Args are: homogeneous, spacing, expand, fill, padding122 box2 = make_box(gtk.TRUE, 0, gtk.TRUE, gtk.FALSE, 0)123 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)124 box2.show()125126 # Args are: homogeneous, spacing, expand, fill, padding127 box2 = make_box(gtk.TRUE, 0, gtk.TRUE, gtk.TRUE, 0)128 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)

    129 box2.show()130131 # Another new separator.132 separator = gtk.HSeparator()133 # The last 3 arguments to pack_start are:134 # expand, fill, padding.135 box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)136 separator.show()137 elif which == 2:138 # Create a new label, remember box1 is a vbox as created139 # near the beginning of __init__()140 label = gtk.Label("HBox(FALSE, 10)")141 label.set_alignment( 0, 0)142 box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)

    143 label.show()144145 # Args are: homogeneous, spacing, expand, fill, padding146 box2 = make_box(gtk.FALSE, 10, gtk.TRUE, gtk.FALSE, 0)147 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)148 box2.show()149150 # Args are: homogeneous, spacing, expand, fill, padding151 box2 = make_box(gtk.FALSE, 10, gtk.TRUE, gtk.TRUE, 0)152 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)153 box2.show()154155 separator = gtk.HSeparator()156 # The last 3 arguments to pack_start are:

    24

  • 8/6/2019 Tutorial de PyGTK 2.0

    33/254

    Captulo 4. Empaquetamiento deControles

    157 # expand, fill, padding.158 box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)159 separator.show()160

    161 label = gtk.Label("HBox(FALSE, 0)")162 label.set_alignment(0, 0)163 box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)164 label.show()165166 # Args are: homogeneous, spacing, expand, fill, padding167 box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.FALSE, 10)168 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)169 box2.show()170171 # Args are: homogeneous, spacing, expand, fill, padding172 box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.TRUE, 10)173 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)174 box2.show()175176 separator = gtk.HSeparator()177 # The last 3 arguments to pack_start are:178 # expand, fill, padding.179 box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)180 separator.show()181182 elif which == 3:183184 # This demonstrates the ability to use pack_end() to185 # right justify widgets. First, we create a new box as before.186 box2 = make_box(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE, 0)187

    188 # Create the label that will be put at the end.189 label = gtk.Label("end")190 # Pack it using pack_end(), so it is put on the right191 # side of the hbox created in the make_box() call.192 box2.pack_end(label, gtk.FALSE, gtk.FALSE, 0)193 # Show the label.194 label.show()195196 # Pack box2 into box1197 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)198 box2.show()199200 # A separator for the bottom.201 separator = gtk.HSeparator()

    202203 # This explicitly sets the separator to 400 pixels wide by 5204 # pixels high. This is so the hbox we created will also be 400205 # pixels wide, and the "end" label will be separated from the206 # other labels in the hbox. Otherwise, all the widgets in the207 # hbox would be packed as close together as possible.208 separator.set_usize(400, 5)209 # pack the separator into the vbox (box1) created near the start210 # of __init__()211 box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)212 separator.show()213214 # Create another new hbox.. remember we can use as many as we need!215 quitbox = gtk.HBox(gtk.FALSE, 0)

    25

  • 8/6/2019 Tutorial de PyGTK 2.0

    34/254

    Captulo 4. Empaquetamiento deControles

    216217 # Our quit button.218 button = gtk.Button("Quit")219

    220 # Setup the signal to terminate the program when the button is clicked221 button.connect_object("clicked", gtk.mainquit, self.window)222 # Pack the button into the quitbox.223 # The last 3 arguments to pack_start are:224 # expand, fill, padding.225 quitbox.pack_start(button, gtk.TRUE, gtk.FALSE, 0)226 # pack the quitbox into the vbox (box1)227 box1.pack_start(quitbox, gtk.FALSE, gtk.FALSE, 0)228229 # Pack the vbox (box1) which now contains all our widgets, into the230 # main window.231 self.window.add(box1)232233 # And show everything left234 button.show()235 quitbox.show()236237 box1.show()238 # Showing the window last so everything pops up at once.239 self.window.show()240241 def main():242 # And of course, our main loop.243 gtk.main()244 # Control returns here when main_quit() is called245 return 0246

    247 if __name__ =="__main__":248 if len(sys.argv) != 2:249 sys.stderr.write("usage: packbox.py num, where num is 1, 2, or 3.\n")250 sys.exit(1)251 PackBox1(string.atoi(sys.argv[1]))252 main()

    El pequeo tour por el cdigo packbox.py [examples/packbox.py] empieza por las lineas 12-48 que definen unafuncin auxiliar que crea una caja horizontal y la rellena con botones segn los parmetros especficados. Devuelveuna referencia a la caja horizontal.

    Las lineas 55-239 definen el mtodo de inicializacin __init__() de la clase PackBox1 que crea una ventanay una caja vertical dentro de ella que se rellena con una configuracin de controles dependiendo del argumento

    que se le pase. Si se le pasa un 1, las lineas 73-136 crean una ventana mostrando las cinco nicas posibilidadesque hay cuando variamos los parmetros homogeneous, expand y fill. Si se le pasa un 2, las lineas 138-180 creanuna ventana mostrando las diferentes combinaciones de fill con spacing y padding. Finalmente, si le pasamos un3, las lineas 186-212 crean una ventana mostrando el uso del mtodo pack_start() para justificar los botones ala izquierda y el mtodo pack_end() para justificar una etiqueta a la derecha. Las lineas 215-235 crean una cajahorizontal que contiene un botn que se empaqueta dentro de la caja vertical. La seal clicked del botn estconectada a la funcin PyGTK main_quit() para terminar el programa.

    Las lineas 248-250 comprueba los argumentos de la linea de comandos y terminan el programa usando la funcinsys.exit() si no hay exactamente un argumento. La linea 251 crea una instancia de PackBox1. La linea 252llama a la funcin main() para empezar el bucle de procesamiento de eventos GTK.

    26

    http://url%28examples/packbox.py)
  • 8/6/2019 Tutorial de PyGTK 2.0

    35/254

    Captulo 4. Empaquetamiento deControles

    En este programa de ejemplo, las referencias a los controles (excepto a la ventana) no se guardan en los atributosde instancia del objeto porque no se necesitan despus.

    4.4. Uso de Tablas para EmpaquetarVeamos otra manera de empaquetar - Tablas. Pueden ser extremadamente tiles en determinadas situaciones.

    Al usar tablas, creamos una rejilla donde podemos colocar los controles. Los controles puede ocupar tantosespacios como especifiquemos.

    Lo primero que hay que mirar es obviamente la funcin gtk.Table() :

    table = gtk.Table(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 decolumnas.

    El argumento homogeneous tiene que ver en el tamao de las celdas de la tabla. Si homogeneous es TRUE, lasceldas de la tabla tienen el tamao del mayor control en la tabla. Si homogeneous es FALSE, el tamao de lasceldas viene dado por el control ms alto en su misma fila, y el control ms ancho en 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 gtk.Table().Por tanto, si especificas rows (filas) = 2 y columns (columnas) = 2, la dispoisicin quedara as:

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

    | | |

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

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

    Fijate que el sistema de coordenadas empieza en la esquina superior izquierda. Para meter un control en una caja,usa el siguiente mtodo:

    table.attach(child, left_attach, right_attach, top_attach, bottom_attach,xoptions=EXPAND|FILL, yoptions=EXPAND|FILL, xpadding=0, ypadding=0)

    La instancia table es la tabla que creaste con gtk.Table(). El primer parmetro ("child") es el control que quieresmeter en la tabla.

    Los argumentos left_attach, right_attach, top_attach y bottom_attach especifican donde colocar elcontrol, y cuantas cajas usar. Si quieres un botn en la esquina inferior derecha de una tabla 2x2, y quieres queocupe SLO ese espacio, left_attach sera = 1, right_attach = 2, top_attach = 1, bottom_attach = 2.

    Ahora, si quieres que un control ocupe la fila entera de nuestra tabla 2x2, pondras left_attach = 0,right_attach = 2, top_attach = 0, bottom_attach = 1.

    Los argumentos xoptions y yoptions se usan para especificar opciones de colocacin y pueden ser unidasmediante la operacin OR permitiendo as mltiples opciones.

    Estas opciones son:

    27

  • 8/6/2019 Tutorial de PyGTK 2.0

    36/254

    Captulo 4. Empaquetamiento deControles

    FILL Si la caja es ms grande que el control, y especificas FILL, el control se expandir hastausar todo el espacio disponible.

    SHRINK Si se le asigna menos espacio a la tabla del que solicit (normalmente porque el usuario haredimensionado la ventana), entonces los controles normalmente sera empujados a la parteinferior de la ventana y desapareceran. Si especificas SHRINK, los controles se encojerancon 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 pixeles alrededor del control.

    Tambin tenemos los mtodos set_row_spacing() y set_col_spacing() . Aaden espacio e