Está en la página 1de 303

Captulo 1. Introduccin Tabla de contenidos 1.1. Exploracin de PyGTK PyGTK 2.

0 es un conjunto de mdulos que componen una interfaz Pyt on para GTK! 2.0. En el resto de este documento cuando se menciona PyGTK se trata de la "ersin 2.0 o posterior de PyGTK# y en el caso de GTK!# tam$i%n a su "ersin 2.0 y si&uientes. El sitio 'e$ de referencia so$re PyGTK es '''.py&t(.or&. El autor principal de PyGTK es) *ames +enstrid&e james,daa.com.au que es ayudado por los desarrolladores citados en el arc i"o -.T+/01 de la distri$ucin PyGTK y por la comunidad PyGTK. Pyt on es un len&uaje de pro&ramacin interpretado# amplia$le y orientado a o$jetos que se distri$uye con un amplio conjunto de mdulos que permiten el acceso a un &ran n2mero de ser"icios del sistema operati"o# ser"icios de internet 3como +T45# 645# 7TP# etc.8# &r9ficos 3incluidos /penG5# TK# etc.8# funciones de manejo de cadenas# ser"icios de correo 3:4-P# 14TP# P/P;# etc.8# multimedia 3audio# *PEG8 y ser"icios de cripto&raf<a. Existen adem9s multitud de mdulos proporcionados por terceros que a=aden otros ser"icios. Pyt on se distri$uye $ajo t%rminos similares a los de la licencia GP5 y est9 disponi$le para los sistemas operati"os 5inux# .nix# >indo's y 4acintos . En '''.pyt on.or& ay m9s informacion disponi$le so$re Pyt on. 1u autor principal es) Guido "an 0ossum &uido,pyt on.or& GTK! 3G:4P Tool(it8 es una li$rer<a que permite crear interfaces &r9ficas de usuario. 1e distri$uye $ajo la licencia 5GP5# por lo que posi$ilita el desarrollo de soft'are a$ierto# soft'are li$re# e incluso soft'are comercial no li$re que use GTK sin necesidad de pa&ar licencias o derec os. 1e le conoce como el tool(it de G:4P porque ori&inalmente se escri$i para desarrollar el Pro&rama de 4anipulacin de :m9&enes de G?. G:4P# pero GTK! se usa ya en numerosos proyectos de soft'are# inclu<do el proyecto de escritorio G?/4E 3Entorno de 4odelo de /$jetos orientados a 0ed8. GTK! est9 dise=ada so$re G@K 3Kit de @i$ujo de G:4P8 que# $9sicamente# es una a$straccin de las funciones de $ajo ni"el que acceden al sistema de "entanas 36li$ en el caso del sistema de "entanas 68. 5os principales autores de GTK! son) Peter 4attis petm,xcf.$er(eley.edu 1pencer Kim$all spencer,xcf.$er(eley.edu *os 4ac@onald jmacd,xcf.$er(eley.edu -ctualmente GTK! es mantenida por) /'en Taylor otaylor,red at.com Tim *ani( timj,&t(.or& GTK! es fundamentalmente un interfaz orientada a o$jetos para pro&ramadores de aplicaciones 3-P:8. -unque est9 escrita completamente en A# est9 implementada usando la idea de clases y funciones de retrollamada 3punteros a funcin8. Existe un tercer componente# llamado Gli$# que contiene di"ersas funciones que

reemplazan al&unas llamadas estandard# as< como funciones adicionales para manejar listas enlazadas# etc. 5as funciones de reemplazo se usan para aumentar la porta$ilidad de GTK! ya que al&unas de las funciones que implementa no est9n disponi$les o no son est9ndar en otros .?:6# tales como &Bstrerror38. /tras incluyen mejoras a las "ersiones de li$c# tales como &Bmalloc# que posee capacidades de depuracin mejoradas. @esde su "ersin 2.0# G5i$ incluye el sistema de tipos que forma la $ase de la jerarqu<a de clases de GTK!# el sistema de se=ales usado en %sta# una -P: de e$ras que a$strae las diferentes -P:s nati"as para pro&ramacin multi ilo en las di"ersas plataformas# y la capacidad de car&ar mdulos. Aomo 2ltimo componente# GTK! usa la li$rer<a Pan&o para la salida de texto internacionalizado. Este tutorial descri$e la interfaz de Pyt on con GTK! y est9 $asado en el tutorial de GTK! 2.0 escrito por Tony Gale e :an 4ain. En %l se intenta documentar en la medida posi$le todo PyGTK# pero en nin&2n caso es completo. Este tutorial presupone al&2n conocimiento pre"io de Pyt on# as< de cmo se crean y ejecutan pro&ramas escritos en Pyt on. 1i no se est9 familiarizado con Pyt on# es recomenda$le pre"iamente la lectura del Tutorial de Pyt on. Este tutorial no presupone nin&2n conocimiento pre"io so$re GTK! y si se utiliza PyGTK para aprender GTK! ser<a interesante reci$ir comentarios acerca de este tutorial# y qu% aspectos resultan pro$lem9ticos. Este tutorial no descri$e cmo compilar o instalar Pyt on# GTK! o PyGTK. Este tutorial est9 $asado en) GTK! desde la "ersin 2.0 asta la 2.C Pyt on 2.2 PyGTK desde la "ersin 2.0 asta la 2.C 5os ejemplos se escri$ieron y pro$aron en una 0ed+at D.0. Este documento est9 Een o$rasE. Por fa"or# cons2ltese '''.py&t(.or& para localizar las actualizaciones. 4e &ustar<a muc o escuc ar los pro$lemas que aparezcan al aprender PyGTK a partir de este documento# y se aprecian los comentarios so$re cmo mejorarlo. Por fa"or# mira la seccin Amo Aontri$uir para m9s informacin. 1i encuentra fallos# por fa"or rellene un informe de fallo en $u&zilla.&nome.or& en el proyecto py&t(. Para ello# la informacin que se encuentra en '''.py&t(.or& so$re Fu&zilla puede resultar de &ran utilidad. El manual de referencia de PyGTK 2.0 se encuentra disponi$le en ttp)GG'''.py&t(.or&Gpy&t(reference. @ic o manual descri$e detalladamente las clases de PyGTK y# por a ora# slo se encuentra disponi$le en in&l%s. 5a p9&ina 'e$ de PyGTK 3'''.py&t(.or&8 contiene otros recursos 2tiles para aprender PyGTK# incluido un enlace a la extensa 7-H 35ista de Pre&untas 7recuentes# tam$i%n en in&l%s 2nicamente8# y otros art<culos y cursos# as< como una lista de correo acti"a y un canal :0A 3cons2ltese '''.py&t(.or& para los detalles8. 1.1. Exploracin de PyGTK *o an @a lin escri$i un peque=o pro&rama en Pyt on 3 pygtkconsole.py8 que se ejecuta

en 5inux y permite la exploracin interacti"a de PyGTK. Ese pro&ama proporciona una interfaz de int%rprete interacti"o al estilo de la de Pyt on# que se comunica con un proceso ijo que ejecuta los comandos introducidos. 5os mdulos PyGTK se car&an por defecto al arrancar el pro&rama. .n ejemplo simple de sesin es) moe) DI)10DJK pygtkconsole.py Pyt on 2.2.2# PyGTK 1.DD.1C 3Gt(! 2.0.I8 :nteracti"e console to manipulate GTK! 'id&ets. LLL 'M>indo'38 LLL $MFutton3N+olaN8 LLL '.add3$8 LLL def ola3$8) ... print EO+ola 4undoPE ... LLL $.connect3Nclic(edN# ola8 J LLL '.s o'Ball38 LLL O+ola 4undoP O+ola 4undoP O+ola 4undoP LLL $.setBla$el3E+ola a todosE8 LLL En este ejemplo se crea una "entana que contiene un $otn que imprime un mensaje 3NO+ola 4undoPN8 cuando se ace clic en %l. El pro&rama permite pro$ar as< f9cilmente los di"ersos controles de GTK! y sus interfaces PyGTK. Tam$i%n es 2til el pro&rama desarrollado por Frian 4cErlean para la receta de -cti"estate IJ10D junto con al&unas modificaciones para que funcione con PyGTK 2.6. En este curso lo llamamos gpython.py y funciona de forma parecida al pro&rama pygtkconsole.py. ota Estos dos pro&ramas no funcionan en 4icrosoft >indo's porque necesitan funciones espec<ficas de .nix. Captulo !. Pri"eros Pasos Tabla de contenidos 2.1. +ola 4undo en PyGTK 2.2. Teor<a de 1e=ales y 0etrollamadas 2.;. E"entos 2.C. +ola 4undo Paso a Paso Para empezar nuestra introduccin a PyGTK# comenzaremos con el pro&rama m9s simple posi$le. Este pro&rama 3base.py8 crear9 una "entana de 200x200 p<xeles y no es posi$le salir de %l excepto terminando el proceso desde la consola.

1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20

QPGusrG$inGen" pyt on Q example $ase.py import py&t( py&t(.require3N2.0N8 import &t( class Fase) def BBinitBB3self8) self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 self.'indo'.s o'38 def main3self8) &t(.main38 print BBnameBB if BBnameBB MM EBBmainBBE) $ase M Fase38 $ase.main38

1e puede ejecutar el pro&rama anterior escri$iendo en la l<nea de rdenes) pyt on $ase.py 1i base.py es ec o ejecuta$le y se puede encontrar en la "aria$le P-T+# es posi$le ejecutarlo usando) $ase.py En este caso# la l<nea 1 pedir9 al int%rprete de Pyt on que ejecute base.py. 5as l<neas JUI ayudan a diferenciar entre las distintas "ersiones de PyGTK que puedan estar instaladas en el equipo. Estas l<neas indican que se desea usar la "ersin 2.0 de PyGTK# que comprende todas las "ersiones de PyGTK con 2 como n2mero principal. Ello impide que el pro&rama utilice "ersiones anteriores de PyGTK# en caso de que se encuentren instaladas en el sistema. 5as l<neas 1SU20 comprue$an si la "aria$le BBnameBB es EBBmainBBE# lo cual indica que el pro&rama est9 siendo ejecutado directamente por pyt on y no est9 siendo importado en un int%rprete Pyt on. En el primer caso el pro&rama crea una nue"a instancia de la clase Fase y &uarda una referencia a ella en la "aria$le $ase. @espu%s llama la funcin main38 para iniciar el $ucle de procesamiento de e"entos de GTK. .na "entana similar a 7i&ura 2.1# VTentana 1imple PyGTKW de$er<a aparecer en tu pantalla. #igura !.1. $entana %i"ple PyGTK

5a primera l<nea permite al pro&rama base.py ser in"ocado desde una consola 5inux o .nix asumiendo que python se encuentre en el P-T+. Esta l<nea aparecer9 como primera l<nea en todos los pro&ramas de ejemplo.

5as l<neas JUR importan el mdulo PyGTK 2 e inicializan el entorno GTK!. El mdulo PyGTK define las interfaces Pyt on de las funciones GTK! que se usar9n en el pro&rama. Para quienes est%n familiarizados con GTK! ay que ad"ertir que la inicializacin incluye la llamada a la funcin &t(Binit38. Tam$i%n se confi&uran al&unas cosas por nosotros# tales como el "isual por defecto# el mapa de colores# manejadores de se=ales predeterminados. -simismo comprue$a los ar&umentos que se pasan al pro&rama desde la l<nea de comandos# en $usca de al&uno entre) UU&t(Umodule UU&UfatalU'arnin&s UU&t(Ude$u& UU&t(UnoUde$u& UU&d(Ude$u& UU&d(UnoUde$u& UUdisplay UUsync UUname UUclass

En este caso# los $orra de la lista de ar&umentos y deja los no coincidentes que no reconoce para que el pro&rama lo procese o i&nore. El anterior conjunto de ar&umentos son los que aceptan de forma est9ndar todos los pro&ramas GTK!. 5as l<neas DU1J definen una clase de Pyt on llamada Fase que define un m%todo de inicializacin de instancia BBinitBB38. 5a funcin BBinitBB38 crea una "entana de ni"el superior 3l<nea 118 y ordena a GTK! que la muestre 3l<nea 128. 5a &t(.>indo' se crea en la l<nea 11 con el ar&umento &t(.>:?@/>BT/P5ETE5 que indica que se desea una "entana sometida a las decoraciones y posicionamiento del manejador de "entanas. En "ez de crear una "entana de tama=o 0x0# una "entana sin ijos tiene un tama=o predeterminado de 200x200 de forma que se pueda manipular. 5as l<neas 1CU1J definen el m%todo main38 que llama a la funcin PyGTK main38# que in"oca el $ucle principal de procesamiento de e"entos de GTK! para manejar e"entos de ratn y de teclado# as< como e"entos de "entana. 5as l<neas 1SU20 permiten al pro&rama comenzar autom9ticamente si es llamado directamente o pasado como ar&umento al int%rprete de Pyt on. En estos casos# el nom$re de pro&rama que ay en la "aria$le BBnameBB ser9 la cadena EBBmainBBE y el cdi&o entre las l<neas 1SU20 se ejecutar9. 1i el pro&rama se car&a en un int%rprete de Pyt on en ejecucin# las l<neas 1SU20 no ser9n ejecutadas. 5a l<nea 1D crea una instancia de la clase Fase llamada base. Area una &t(.>indo' y la muestra como resultado. 5a l<nea 20 llama al m%todo main38 de la clase Fase# la cual comienza el $ucle de procesamiento de e"entos de GTK!. Auando el control lle&a a este punto# GTK! se dormir9 a la espera de e"entos de las 6 3como pulsaciones de teclas o $otones8# alarmas# o notificaciones de entradaGsalida de fic eros. En el ejemplo# sin em$ar&o# los e"entos son i&norados.

!.1. &ola 'undo en PyGTK - ora se&uimos con un pro&rama con un control 3un $otn8. Es la "ersin PyGTK del cl9sico pro&rama ola mundo 3hello(orld.py 8. 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC QPGusrG$inGen" pyt on Q ejemplo ello'orld.py import py&t( py&t(.require3N2.0N8 import &t( class +ello>orld) Q Esta es una funcin de retrollamada. 1e i&noran los ar&umentos de datos Q en este ejemplo. 49s so$re retrollamadas m9s a$ajo. def ello3self# 'id&et# dataM?one8) print E+ello >orldE def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) Q 1i se de"uel"e 7-51E en el &estor de la se=al EdeleteBe"entE# Q GTK emitir9 la se=al EdestroyE. 5a de"olucin de T0.E si&nifica Q que no se desea la destruccin de la "entana. Q Esto sir"e para presentar di9lo&os como) NXEst9 se&uro de que desea salirYN Q print Edelete e"ent occurredE Q 1i se cam$ia 7-51E a T0.E la "entana principal no se Q destruir9 con EdeleteBe"entE. return &t(.7-51E Q /tra retrollamada def destroy3self# 'id&et# dataM?one8) &t(.mainBquit38 def BBinitBB3self8) Q se crea una "entana nue"a self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 Q Auando se en"<a a una "entana la se=al EdeleteBe"entE 3esto lo ace Q &eneralmente el &estor de "entanas# usualmente con EcerrarE# o con el icono Q de la "entana de t<tulo8# pedimos que llame la funcin deleteBe"ent 38 Q definida arri$a. 5os datos pasados a la retrollamada son Q ?.55 y se i&noran en la funcin de retrollamada. self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 Q Aonectamos el e"ento EdestroyE a un manejador de se=al. Q Este e"ento sucede cuando llamamos &t(B'id&etBdestroy38 para la "entana#

CJ Q o si de"ol"emos 7-51E en la retrollamada EdeleteBe"entE. CI self.'indo'.connect3EdestroyE# self.destroy8 CR CS Q Esta$lece el &rosor del $orde de la "entana. CD self.'indo'.setB$orderB'idt 3108 J0 J1 Q Area un nue"o $otn con la etiqueta E+ello >orldE. J2 self.$utton M &t(.Futton3E+ello >orldE8 J; JC Q Auando el $otn reci$e la se=al Eclic(edE# llamar9 la JJ Q funcin ello38 a la que pasa ?one como ar&umento. 5a funcin ello38 JI Q se define m9s arri$a. JR self.$utton.connect3Eclic(edE# self. ello# ?one8 JS JD Q Esto causar9 la destruccin de la "entana al llamar a I0 Q &t(B'id&etBdestroy3'indo'8 cuando se produzca Eclic(edE. @e nue"o# I1 Q la se=al podr<a "enir de aqu< o del &estor de "entanas. I2 self.$utton.connectBo$ject3Eclic(edE# &t(.>id&et.destroy# self.'indo'8 I; IC Q Esto empaqueta el $otn en la "entana 3un contenedor de GTK!8. IJ self.'indo'.add3self.$utton8 II IR Q El paso final es mostrar el control reci%n creado. IS self.$utton.s o'38 ID R0 Q y la "entana R1 self.'indo'.s o'38 R2 R; def main3self8) RC Q Todas las aplicaciones de PyGTK de$en tener una llamada a &t(.main38. -qu< se deja RJ Q el control y se espera que suceda un e"ento 3como un e"ento de teclado o ratn8. RI &t(.main38 RR RS Q 1i el pro&rama se ejecuta directamente o se pasa como ar&umento al int%rprete RD Q de Pyt on# entonces se crea una instancia de +ello>orld y se muestra S0 if BBnameBB MM EBBmainBBE) S1 ello M +ello>orld38 S2 ello.main38 7i&ura 2.2# VPro&rama de ejemplo) +ola 4undoW muestra la "entana creada por hello(orld.py. #igura !.!. Progra"a de e)e"plo* &ola 'undo

5as "aria$les y funciones que se definen en el mdulo PyGTK se llaman de la forma &t(.Z.

Por ejemplo# el pro&rama hello(orld.py usa) &t(.7-51E &t(.mainquit38 &t(.>indo'38 &t(.Futton38 del mdulo PyGTK. En futuras secciones no se especificar9 el prefijo del mdulo &t(# pero se dar9 por asumido. ?aturalmente# los pro&ramas de ejemplo usar9n los prefijos del mdulo.

!.!. Teora de %e+ales y ,etrolla"adas ota En la "ersin 2.0 de GTK!# el sistema de se=ales se a mo"ido de GTK! a G5i$. ?o entraremos en detalles so$re las extensiones que G5i$ 2.0 tiene en relacin con el sistema de se=ales de GTK 1.2. 5as diferecias no de$er<an notarse en el uso de PyGTK. -ntes de entrar en detalle en hello(orld.py# discutiremos las se=ales y las retrollamadas. GTK! es una $i$lioteca orientada a e"entos# lo que si&nifica que se dormir9 en la funcin &t(.main38 asta que un e"ento ocurra y el control pase a la funcin apropiada. Esta dele&acin del control se realiza usando la idea de Ese=alesE. 3?tese que estas se=ales no son las mismas que las se=ales de los sistemas .nix# y no se implementan usando %stas# aunque la terminolo&<a es casi id%ntica8 Auando ocurre un e"ento# como cuando presionamos un $otn del ratn# la se=al apropiada se EemiteE por el el control que fu% presionado. -s< es cmo GTK! ace la mayor<a de su tra$ajo 2til. +ay se=ales que todos los controles eredan# como EdestroyE# y ay se=ales que son espec<ficas de cada control# como Eto&&ledE en el caso de un $otn de acti"acin. Para acer que un $otn realice una accin# de$emos confi&urar un manejador de se=ales que capture estas se=ales y llame a la funcin apropiada. Esto se ace usando un m%todo de &t(.>id&et 3 eredado de la clase G/$ject8 como por ejemplo) andlerBid M o$ject.connect3na"e# -unc# -unc.data8 donde object es la instancia de &t(.>id&et 3un control8 que estar9 emitiendo la se=al# y el primer ar&umento name es una cadena que contiene el nom$re de la se=al que se desea capturar. El se&undo ar&umento# func# es la funcin que se quiere llamar cuando se produce el e"ento. El tercer ar&umento# func_data# son los datos que se desean pasar a la funcin func. El m%todo de"uel"e un andlerBid que se puede usar para desconectar o $loquear el uso del manejador. 5a funcin especificada en el tercer ar&umento se llama Efuncin de retrollamadaE# y &eneralmente tiene la forma) def call$ac(Bfunc3(idget# callback.data8)

donde el primer ar&umento ser9 una referencia al widget 3control8 que emiti la se=al# y el se&undo 3callback_data8 una referencia a los datos dados como 2ltimo ar&umento en el m%todo connect38 mostrado antes. 1i la funcin de retrollamada es un m%todo de un o$jeto entonces tendr9 la forma &eneral si&uiente) def call$ac(Bmet 3sel-# (idget# callback.data8) donde self es la instancia del o$jeto que in"oca este m%todo. Esta es la forma usada en el pro&rama de ejemplo hello(orld.py. ota 5a forma anterior de declaracin de una funcin de retrollamada a se=ales es slo una &u<a &eneral# ya que las se=ales espec<ficas de los distintos controles &eneran diferentes par9metros de llamada. /tra llamada que se usa en el ejemplo hello(orld.py es) andlerBid M o$ject.connectBo$ject3na"e# -unc# slot.ob)ect8 connectBo$ject38 es id%ntica a connect38# exceptuando que una funcin de retrollamada slo usa un ar&umento# y un m%todo de retrollamada# dos ar&umentos) def call$ac(Bfunc3ob)ect8 def call$ac(Bmet 3sel-# ob)ect8 donde object normalmente es un control. connectBo$ject38 permite usar los m%todos de controles PyGTK qu% solo admiten un ar&umento 3self8 como manejadores de se=ales. !./. E0entos -dem9s del mecanismo de se=ales descrito anteriormente# ay un conjunto de e"entos que reflejan el mecanismo de e"entos de 6. 5as retrollamadas tam$i%n se pueden conectar a estos e"entos. Estos e"entos son) e"ent $uttonBpressBe"ent $uttonBreleaseBe"ent scrollBe"ent motionBnotifyBe"ent deleteBe"ent destroyBe"ent exposeBe"ent (eyBpressBe"ent (eyBreleaseBe"ent enterBnotifyBe"ent lea"eBnotifyBe"ent confi&ureBe"ent focusBinBe"ent

focusBoutBe"ent mapBe"ent unmapBe"ent propertyBnotifyBe"ent selectionBclearBe"ent selectionBrequestBe"ent selectionBnotifyBe"ent proximityBinBe"ent proximityBoutBe"ent "isi$ilityBnotifyBe"ent clientBe"ent noBexposeBe"ent 'indo'BstateBe"ent Para conectar una funcin de retrollamada a uno de estos e"entos se usa el m%todo connect38# como se a dic o anteriormente# usando uno de los nom$res de e"entos anteriores en el par9metro name. 5a funcin 3o m%todo8 de retrollamada para e"entos es li&eramente diferente de la usada para se=ales) def call$ac(Bfunc3(idget# e0ent# callback.data8) def call$ac(Bmet 3sel-# (idget# e0ent# callback.data8) &d(.E"ent es un tipo de o$jetos Pyt on cuyos atri$utos de tipo indicar9n cu9l de los e"entos anteriores a ocurrido. 5os otros atri$utos del e"ento depender9n del tipo de e"ento. 5os "alores posi$les para los tipos son) ?/T+:?G @E5ETE @E1T0/[ E6P/1E 4/T:/?B?/T:7[ F.TT/?BP0E11 B2F.TT/?BP0E11 B;F.TT/?BP0E11 F.TT/?B0E5E-1E KE[BP0E11 KE[B0E5E-1E E?TE0B?/T:7[ 5E-TEB?/T:7[ 7/A.1BA+-?GE A/?7:G.0E 4-P .?4-P P0/PE0T[B?/T:7[ 1E5EAT:/?BA5E-0 1E5EAT:/?B0EH.E1T 1E5EAT:/?B?/T:7[

P0/6:4:T[B:? P0/6:4:T[B/.T @0-GBE?TE0 @0-GB5E-TE @0-GB4/T:/? @0-GB1T-T.1 @0/PB1T-0T @0/PB7:?:1+E@ A5:E?TBETE?T T:1:F:5:T[B?/T:7[ ?/BE6P/1E 1A0/55 >:?@/>B1T-TE 1ETT:?G Para acceder a estos "alores se a=ade el prefijo &t(.&d(. al tipo de e"ento. Por ejemplo# &t(.&d(.@0-GBE?TE0. Por tanto# para conectar una funcin de retrollamada a uno de estos e"entos se usar<a al&o como) $utton.connect31button.press.e0ent1# button.press.callback8 Esto asume que button es un control &t(.Futton. Entonces# cuando el ratn est% so$re el $otn y se pulse un $otn del ratn# se llamar9 a la funcin button_press_callback. Esta funcin se puede definir as<) def $uttonBpressBcall$ac(3(idget# e0ent# data8) El "alor que de"uel"e esta funcin indica si el e"ento de$e ser propa&ado por el sistema de manejo de e"entos GTK!. @e"ol"iendo &t(.T0.E indicamos que el e"ento a sido procesado# y que no de$e ser propa&ado. @e"ol"iendo &t(.7-51E se continua el procesamiento normal del e"ento. Es aconseja$le consultar la seccin Procesamiento -"anzado de E"entos y 1e=ales para o$tener m9s detalles so$re el sistema de propa&acin. 5as -P:s de seleccin y arrastrar y soltar de G@K tam$i%n emiten unos cuantos e"entos que se reflejan en GTK! por medio de se=ales. Aonsulta 1e=ales en el Aontrol de /r<&en y 1e=ales en el Aontrol de @estino para o$tener m9s detalles so$re la sintaxis de las funciones de retrollamada para estas se=ales) selectionBrecei"ed selectionB&et dra&B$e&inBe"ent dra&BendBe"ent dra&BdataBdelete dra&Bmotion dra&Bdrop dra&BdataB&et

dra&BdataBrecei"ed !.2. &ola 'undo Paso a Paso - ora que ya conocemos la teor<a &eneral# "amos a aclarar el pro&rama de ejemplo hello(orld.py paso a paso. 5as l<neas DURI definen la clase +ello>orld# que contiene todas las retrollamadas como m%todos de o$jeto y el m%todo de inicializacin de o$jetos. Examinemos los m%todos de retrollamada) 5as l<neas 1;U1C definen el m%todo de retrollamada ello38 que ser9 llamado al pulsar el $otn. Auando se llama a este m%todo# se imprime E+ello >orldE en la consola. En el ejemplo i&noramos los par9metros de la instancia del o$jeto# el control y los datos# pero la mayor<a de las retrollamadas los usan. El par9metro data se define con un "alor predeterminado i&ual a ?one porque PyGTK no pasar9 nin&2n "alor para los datos si no son incluidos en la llamada a connect38\ esto producir<a un error ya que la retrollamada espera tres ar&umentos y 2nicamente reci$e dos. 5a definicin de un "alor por defecto ?one permite llamar a la retrollamada con dos o tres par9metros sin nin&2n error. En este caso el par9metro de datos podr<a a$erse omitido# ya que el m%todo ello38 siempre ser9 llamado con slo dos par9metros 3nunca se usan los datos de usuario8. En el si&uiente ejemplo usaremos el ar&umento de datos para sa$er qu% $otn fue pulsado. def ello3self# 'id&et# dataM?one8) print E+ello >orldE 5a si&uiente retrollamada 3l<neas 1IU2I8 es un poco especial. El e"ento EdeleteBe"entE se produce cuando el manejador de "entanas manda este e"ento al pro&rama. Tenemos "arias posi$ilidades en cuanto a qu% acer con estos e"entos. Podemos i&norarlos# realizar al&un tipo de respuesta# o simplemente cerrar el pro&rama. El "alor que se de"uel"a en esta retrollamada le permite a GTK! sa$er qu% accin realizar. 1i de"ol"emos T0.E acemos sa$er que no queremos que se emita la se=al EdestroyE# y as< nuestra aplicacin si&ue ejecut9ndose. 1i de"ol"emos 7-51E pedimos que se emita la se=al EdestroyE# que a su "ez llamar9 a nuestro manejador de la se=al EdestroyE. ?tese que se an quitado los comentarios para mayor claridad. def deleteBe"ent3'id&et# e"ent# dataM?one8) print Edelete e"ent occurredE return &t(.7-51E El m%todo de retrollamada destroy38 3l<neas 2DU;08 ace que el pro&rama termine mediante la lllamada a &t(.mainBquit38. Esta funcin indica a GTK que de$e salir de la funcin &t(.main38 cuando el control le sea transferido. def destroy3'id&et# dataM?one8) &t(.mainBquit38 5as l<neas ;2UR1 definen el m%todo de inicializacin de instancia BBinitBB38 del o$jeto +ello>orld# el cual crea la "entana y los controles que se usan en el pro&rama.

5a l<nea ;C crea una nue"a "entana# pero no se muestra directamente asta que comunicamos a GTK! que lo a&a# casi al final del pro&rama. 5a referencia a la "entana se &uarda en un atri$uto de instancia 3self.'indo'8 para poder acceder a ella despu%s. self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 5as l<neas C1 y CI ilustran dos ejemplos de cmo conectar un manejador de se=al a un o$jeto# en este caso a 'indo'. -qu< se captura el e"ento EdeleteBe"entE y la se=al EdestroyE. El primero se emite cuando cerramos la "entana a tra"%s del manejador de "entanas o cuando usamos la llamada al m%todo destroy38 de &t(.>id&et. 5a se&unda se emite cuando# en el manejador de EdeleteBe"entE# de"ol"emos 7-51E. self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 self.'indo'.connect3EdestroyE# self.destroy8 5a l<nea CD esta$lece un atri$uto de un o$jeto contenedor 3en este caso 'indo'8 para que ten&a un 9rea "ac<a de 10 p<xeles de anc o a su alrededor en donde no se sit2e nin&2n control. +ay otras funciones similares que se tratar9n en la seccin Esta$lecimiento de -tri$utos de Aontroles self.'indo'.setB$orderB'idt 3108 5a l<nea J2 crea un nue"o $otn y &uarda una referencia a %l en self.$utton. El $otn tendr9 la etiqueta E+ello >orldE cuando se muestre. self.$utton M &t(.Futton3E+ello >orldE8 En la l<nea JR conectamos un manejador de se=al al $otn# de forma que# cuando emita la se=al Eclic(edE# se llame a nuestro manejador de retrollamada ello38. ?o pasamos nin&2n dato a ello38 as< que simplemente se entre&a ?one como dato. /$"iamente# la se=al Eclic(edE se emite al acer clic en el $otn con el cursor del ratn. El "alor del par9metro de los datos ?one no es imprescindi$le y podr<a omitirse. 5a retrollamada se llamar9 con un par9metro menos. self.$utton.connect3Eclic(edE# self. ello# ?one8 Tam$i%n "amos a usar este $otn para salir del pro&rama. 5a l<nea I2 muestra cmo la se=al EdestroyE puede "enir del manejador de "entanas# o de nuestro pro&rama. -l acer clic en el $otn# al i&ual que antes# se llama primero a la retrollamada ello38# y despu%s a la si&uiente en el orden en el que an sido confi&uradas. 1e pueden tener todas las retrollamadas que sean necesarias# y se ejecutar9n en el orden en el que se ayan conectado. Aomo queremos usar el m%todo destroy38 de la clase &t(.>id&et que acepta un ar&umento 3el control que se "a a destruir U en este caso 'indo'8# utilizamos el m%todo connectBo$ject38 y le pasamos la referencia a la "entana. El m%todo connectBo$ject38 or&aniza el primer ar&umento de la retrollamada para que sea 'indo' en "ez del $otn. Auando se llama el m%todo destroy38 de la clase &t(.>id&et se emite la se=al EdestroyE desde la "entana# lo que a su "ez pro"ocar9 la llamada al m%todo destroy38 de la clase +ello>orld que termina el pro&rama.

self.$utton.connectBo$ject3Eclic(edE# &t(.>id&et.destroy# self.'indo'8 5a l<nea IJ es una llamada de colocacin# que se explicar9 en profundidad m9s tarde# en Aolocacin de Aontroles # aunque es $astante f9cil de entender. 1implemente indica a GTK! que el $otn de$e situarse en la "entana en donde se "a a mostrar. +a de tenerse en cuenta que un contenedor GTK! 2nicamente puede contener un control. /tros controles# descritos m9s adelante# est9n dise=ados para posicionar "arios controles de otras maneras. self.'indo'.add3self.$utton8 - ora lo tenemos todo confi&urado como queremos. Aon todos los manejadores de se=ales# y el $otn situado en la "entana donde de$er<a estar# pedimos a GTK 3l<neas II y ID8 que muestre los controles en pantalla. El control de "entana se muestra en 2ltimo lu&ar# para que la "entana entera aparezca de una "ez y no primero la "entana y lue&o el $otn dentro de ella di$uj9ndose. 1in em$ar&o# con un ejemplo tan simple# ser<a dif<cil apreciar la diferencia. self.$utton.s o'38 self.'indo'.s o'38 5as l<neas R;URJ definen el m%todo main38 que llama a la funcin &t(.main38 def main3self8) &t(.main38 5as l<neas S0US2 permiten al pro&rama ejecutarse autom9ticamente si es llamado directamente o como ar&umento del int%rprete de pyt on. 5a l<nea S1 crea una instancia de la clase +ello>orld y &uarda una referencia a ella en la "aria$le ello. 5a l<nea S2 llama al m%todo main38 de la clase +ello>orld para empezar el $ucle de procesamiento de e"entos GTK. if BBnameBB MM EBBmainBBE) ello M +ello>orld38 ello.main38 - ora# cuando a&amos clic con el $otn del ratn en el $otn GTK# el control emitir9 una se=al Eclic(edE. Para poder usar esta informacin# nuestro pro&rama confi&ura un manejador de se=al que capture esta se=al# la cual llama a la funcin que decidamos. En nuestro ejemplo# cuando se pulsa el $otn que emos creado# se llama el m%todo ello38 con un ar&umento ?one# y despu%s se llama el si&uiente manejador para esta se=al. El si&uiente manejador llama a la funcin destroy38 del control con la "entana como su ar&umento y de esta manera causa que la "entana emita la se=al EdestroyE# que es capturada y llama al m%todo destroy38 de la clase +ello>orld /tra funcin de los e"entos es usar el manejador de "entanas para eliminar la "entana# lo que causar9 que se emita EdeleteBe"entE. Esto llamar9 a nuestro manejador de EdeleteBe"entE. 1i de"ol"emos T0.E aqu<# la "entana se quedar9 como si nada u$iera pasado. @e"ol"iendo 7-51E ar9 que GTK! emita la se=al EdestroyE# que llama a la

retrollamada EdestroyE de la clase +ello>orld cerrando GTK!.

Captulo /. 30an4ando Tabla de contenidos ;.1. 49s so$re manejadores de se=ales ;.2. .n +ola 4undo 4ejorado /.1. '5s sobre "ane)adores de se+ales Teamos otra "ez la llamada a connect38 . o$ject.connect3name# func# funcBdata8 El "alor de retorno de connect38 es un n2mero entero que identifica la retrollamada. Aomo ya se a mencionado# es posi$le disponer de tantas retrollamadas por se=al como sea necesario# y cada una de ellas se ejecutar9 por turnos# en el mismo orden de conexin. Este identificador permite eliminar la retrollamada de la lista de retrollamadas acti"as mediante el m%todo) o$ject.disconnect3id8 -s<# pasando el identificador de"uelto por los m%todos de conexin# es posi$le desconectar un manejador de se=al. Tam$i%n es posi$le des a$ilitar temporalmente un manejador de se=al mediante los m%todos si&nalB andlerB$loc(38 y si&nalB andlerBun$loc(38. o$ject.si&nalB andlerB$loc(3 andlerBid8 o$ject.si&nalB andlerBun$loc(3 andlerBid8 Captulo /. 30an4ando Tabla de contenidos ;.1. 49s so$re manejadores de se=ales ;.2. .n +ola 4undo 4ejorado /.1. '5s sobre "ane)adores de se+ales Teamos otra "ez la llamada a connect38 . o$ject.connect3name# func# funcBdata8 El "alor de retorno de connect38 es un n2mero entero que identifica la retrollamada. Aomo ya se a mencionado# es posi$le disponer de tantas retrollamadas por se=al como sea

necesario# y cada una de ellas se ejecutar9 por turnos# en el mismo orden de conexin. Este identificador permite eliminar la retrollamada de la lista de retrollamadas acti"as mediante el m%todo) o$ject.disconnect3id8 -s<# pasando el identificador de"uelto por los m%todos de conexin# es posi$le desconectar un manejador de se=al. Tam$i%n es posi$le des a$ilitar temporalmente un manejador de se=al mediante los m%todos si&nalB andlerB$loc(38 y si&nalB andlerBun$loc(38. o$ject.si&nalB andlerB$loc(3 andlerBid8 o$ject.si&nalB andlerBun$loc(3 andlerBid8 Captulo 2. E"pa6uetado de Controles Tabla de contenidos C.1. Teor<a de Aajas Empaquetadoras C.2. 5as Aajas en detalle C.;. Pro&rama de Ejemplo de Empaquetado C.C. .so de Ta$las para el Empaquetado C.J. Ejemplo de Empaquetado con Ta$las ?ormalmente# cuando se crea un pro&rama# se desea poner m9s de un control en la "entana. ?uestro primer ejemplo E+ola 4undoE usa$a un 2nico control para poder llamar simplemente al m%todo add38 de la clase &t(.Aontainer para EempaquetarE el control en la "entana. 1in em$ar&o# en cuanto se quiera poner m9s de un control en una "entana# Xcmo se determina la posicin en la que se sit2a el controlY. -qu< es donde el EempaquetadoE de controles entra en jue&o. 2.1. Teora de Ca)as E"pa6uetadoras 5a mayor<a del empaquetado se realiza utilizando cajas. ]stas son contenedores in"isi$les de controles y son de dos tipos) cajas orizontales y cajas "erticales. En el primer tipo los los o$jetos se insertan orizontalmente# de izquierda a derec a o de derec a a izquierda# en funcin de la llamada que se use\ mientras que en el se&undo tipo# las cajas "erticales# los controles se empaquetan de arri$a a a$ajo o "ice"ersa. Es posi$le utilizar com$inaciones de cajas insertadas en otras cajas y o$tener cualquier efecto que se desee. Para crear una nue"a caja orizontal se usa la llamada &t(.+Fox38# y con cajas "erticales &t(.TFox38 . 5os m%todos pac(Bstart38 y pac(Bend38 se utilizan para colocar los o$jetos dentro de estos contenedores. El primer m%todo# pac(Bstart38# inserta los o$jetos yendo de arri$a acia a$ajo en una caja "ertical# y de izquierda a derec a en una caja orizontal. El m%todo pac(Bend38 muestra el comportamiento opuesto# empaqueta de a$ajo acia arri$a en una caja "ertical# y de derec a a izquierda en una caja orizontal. Aon estos m%todos se pueden alinear a la derec a o a la izquierda los controles# de tal forma que se consi&a el efecto $uscado. - lo lar&o de los ejemplos de este tutorial se usar9 fundamentalmente el

m%todo pac(Bstart38. .n o$jeto puede ser adem9s $ien otro contenedor o $ien un control. @e ec o# muc os controles son en realidad tam$i%n contenedores# como ocurre con los $otones# aunque normalmente se use slo una etiqueta en su interior. Aon las llamadas anteriores se indica a GTK! cmo a de situar los controles y as< es capaz de cam$iar su tama=o y otras propiedades interesantes de forma autom9tica. [# como es de esperar# dic o m%todo proporciona adem9s &ran flexi$ilidad a la ora de situar y crear controles. 2.!. 7as Ca)as en detalle - causa de esta flexi$ilidad# el empaquetado de cajas puede resultar confuso al principio# dado que admite muc as opciones cuyo funcionamiento conjunto no resulta o$"io. 1in em$ar&o# existen $9sicamente cinco estilos. 5a 7i&ura C.1# VEmpaquetado) Ainco "ariacionesW muestra el resultado de la ejecucin del pro&rama packbox.py con un ar&umento de 1) #igura 2.1. E"pa6uetado* Cinco 0ariaciones

Aada l<nea contiene una caja orizontal 3 $ox8 con "arios $otones. 5a llamada a pac( es una copia de la llamada a pac( en cada uno de los $otones de la +$ox. Aada $otn se empaqueta en la $ox de la misma manera 3con los mismos ar&umentos al m%todo pac(Bstart38 8. Este es un ejemplo del m%todo pac(Bstart38) $ox.pac(Bstart3c ild# expand# fill# paddin&8 box es la caja donde se empaqueta el o$jeto. El primer ar&umento# child# es el o$jeto que se "a a empaquetar. Por a ora los o$jetos ser9n $otones# con lo que estar<amos empaquetando $otones dentro de cajas. El ar&umento expand de pac(Bstart38 y pac(Bend38 controla si los controles se disponen de forma que ocupen todo el espacio extra de la caja y# de esta manera# %sta se expande asta ocupar todo el 9rea reser"ada para ella 3T0.E8\ o si se enco&e para ocupar el espacio justo de los controles 37-51E8. Poner expand a 7-51E permite justificar a la derec a y a la izquierda los controles. 1i no# se expandir9n para llenar la caja# y el mismo efecto podr<a o$tenerse usando slo o pac(Bstart38 o pac(Bend38. El ar&umento fill controla si el espacio extra se utiliza en los propios o$jetos 3T0.E8 o como espacio extra en la caja alrededor de los o$jetos 37-51E8. 1lo tiene efecto si el ar&umento expand tam$i%n es T0.E. Pyt on permite definir un m%todo o funcin con "alores de ar&umento predeterminados y ar&umentos con nom$re. - lo lar&o de este tutorial se "er9 la definicin de las funciones y m%todos con "alores predeterminados y ar&umentos con nom$re cuando sean de aplicacin. Por ejemplo# el m%todo pac(Bstart se define as<) $ox.pac(Bstart3child# expandM&t(.T0.E# -illM&t(.T0.E# paddingM08

$ox.pac(Bend3child# expandM&t(.T0.E# -illM&t(.T0.E# paddingM08 child# expand# fill y padding son pala$ras cla"e 3ar&umentos con nom$re8. 5os ar&umentos expand# fill y padding tienen los "alores predeterminados 3o Epor defectoE8 mostrados arri$a. El ar&umento child de$e especificarse o$li&atoriamente al no tener un "alor predeterminado. 5as funciones que nos permiten crear una caja nue"a son) $ox M &t(.+Fox3ho"ogeneousM&t(.7-51E# spacingM08 "$ox M &t(.TFox3ho"ogeneousM&t(.7-51E# spacingM08 El ar&umento homogeneous de &t(.+Fox38 y &t(.TFox38 controla si cada o$jeto de la caja tiene el mismo tama=o 3por ejemplo# el mismo anc o en una $ox# o la misma altura en una "$ox8. 1i se usa# las rutinas de empaquetado funcionan $asicamente como si el ar&umento expand estu"iera siempre acti"ado. XHu% diferencia existe entre spacing 3se fija al crear la caja8 y padding 3se determina al empaquetar los elementos8Y El spacing se a=ade entre o$jetos# y el padding se a=ade a cada lado de un o$jeto. 5a 7i&ura C.2# VEmpaquetado con 1pacin& y Paddin&W ilustra la diferencia# pasando un ar&umento de 2 a packbox.py ) #igura 2.!. E"pa6uetado con %pacing y Padding

5a 7i&ura C.;# VEmpaquetado con pac(Bend38W ilustra el uso del m%todo pac(Bend38 3pasa un ar&umento de ; a packbox.py8. 5a etiqueta EendE se empaqueta con el m%todo pac(Bend38. 1e mantendr9 en el $orde derec o de la "entana cuando %sta se redimensione. #igura 2./. E"pa6uetado con pack.end89

2./. Progra"a de E)e"plo de E"pa6uetado -qu< est9 el cdi&o usado para crear la ima&en anterior. Est9 profusamente comentado# as< que no resultar9 complicado se&uirlo. Es recomenda$le su ejecucin y ju&ar posteriormente con %l. 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; QPGusrG$inGen" pyt on Q ejemplo pac($ox.py import py&t( py&t(.require3N2.0N8 import &t( import sys# strin& Q 7uncin auxiliar que crea una nue"a +Fox llena de $otones con etiqueta. 5os ar&umentos Q de las "aria$les en las que tenemos inter%s se pasan a esta funcin. ?o mostramos la Q caja pero s< todo lo que contiene. def ma(eB$ox3 omo&eneous# spacin&# expand# fill# paddin&8) Q Areamos una nue"a +Fox con los par9metros omo&eneous Q y spacin& adecuados. $ox M &t(.+Fox3 omo&eneous# spacin&8 Q Areamos una serie de $otones con los par9metros adecuados $utton M &t(.Futton3E$ox.pac(E8 $ox.pac(Bstart3$utton# expand# fill# paddin&8 $utton.s o'38 $utton M &t(.Futton3E3$utton#E8 $ox.pac(Bstart3$utton# expand# fill# paddin&8 $utton.s o'38 Q Areamos un $otn con una etiqueta que depende del "alor de Q expand. if expand MM &t(.T0.E) $utton M &t(.Futton3ET0.E#E8 else) $utton M &t(.Futton3E7-51E#E8 $ox.pac(Bstart3$utton# expand# fill# paddin&8 $utton.s o'38 Q -qu< acemos lo mismo que en la creacin del $otn de EexpandE Q anterior# pero usa la forma a$re"iada. $utton M &t(.Futton33E7-51E#E# ET0.E#E8^fillMM&t(.T0.E_8 $ox.pac(Bstart3$utton# expand# fill# paddin&8 $utton.s o'38

CC CJ padstr M E`d8E ` paddin& CI CR $utton M &t(.Futton3padstr8 CS $ox.pac(Bstart3$utton# expand# fill# paddin&8 CD $utton.s o'38 J0 return $ox J1 J2 class Pac(Fox1) J; def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) JC &t(.mainBquit38 JJ return &t(.7-51E JI JR def BBinitBB3self# ' ic 8) JS JD Q Areamos nuestra "entana I0 self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 I1 I2 Q 1iempre de$emos recordar la conexin de la se=al deleteBe"ent I; Q a la "entana principal. Esto es muy importante de cara a un comportamiento IC Q intuiti"o adecuado IJ self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 II self.'indo'.setB$orderB'idt 3108 IR IS Q Areamos una caja "ertical 3"$ox8 en la que empaquetar las cajas orizontales. ID Q Esto nos permite apilar las cajas orizontales llenas de $otones R0 Q una encima de otra en esta "$ox. R1 $ox1 M &t(.TFox3&t(.7-51E# 08 R2 R; Q qu% ejemplo mostramos. ]stos se corresponden a las im9&enes anteriores. RC if ' ic MM 1) RJ Q creamos una etiqueta nue"a. RI la$el M &t(.5a$el3E+Fox37-51E# 08E8 RR RS Q -lineamos la etiqueta al lado izquierdo. Aomentaremos este y otros RD Q m%todos en la seccin so$re -tri$utos de los Aontroles. S0 la$el.setBali&nment30# 08 S1 S2 Q Empaquetamos la etiqueta en la caja "ertical 3"$ox $ox18. 0ecu%rdese que S; Q los controles que se a=aden a una caja "ertical se apilan uno encima del otro SC Q en orden. SJ $ox1.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 SI SR Q 4ostramos la etiqueta SS la$el.s o'38 SD D0 Q 5lamamos a nuestra funcin de crear caja U omo&eneous M 7-51E# spacin& M 0# D1 Q expand M 7-51E# fill M 7-51E# paddin& M 0

D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122 12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D

$ox2 M ma(eB$ox3&t(.7-51E# 0# &t(.7-51E# &t(.7-51E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q 5lamamos a nuestra funcin de crear caja U omo&eneous M 7-51E# spacin& M 0# Q expand M T0.E# fill M 7-51E# paddin& M 0 $ox2 M ma(eB$ox3&t(.7-51E# 0# &t(.T0.E# &t(.7-51E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.7-51E# 0# &t(.T0.E# &t(.T0.E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q Area un separador# que "eremos qu% acen m9s adelante# Q aunque son muy simples. separator M &t(.+1eparator38 Q Empaquetamos el separador en la "$ox. 0ecu%rdese que empaquetamos todos estos Q controles en una "$ox# por lo que se apilar9n Q "erticalmente. $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# J8 separator.s o'38 Q Areamos otra etiqueta y la mostramos. la$el M &t(.5a$el3E+Fox3T0.E# 08E8 la$el.setBali&nment30# 08 $ox1.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.T0.E# 0# &t(.T0.E# &t(.7-51E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.T0.E# 0# &t(.T0.E# &t(.T0.E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q /tro separador. separator M &t(.+1eparator38 Q 5os 2ltimos ; ar&umentos de pac(Bstart son) Q expand# fill# paddin&. $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# J8 separator.s o'38 elif ' ic MM 2)

1C0 1C1 1C2 1C; 1CC 1CJ 1CI 1CR 1CS 1CD 1J0 1J1 1J2 1J; 1JC 1JJ 1JI 1JR 1JS 1JD 1I0 1I1 1I2 1I; 1IC 1IJ 1II 1IR 1IS 1ID 1R0 1R1 1R2 1R; 1RC 1RJ 1RI 1RR 1RS 1RD 1S0 1S1 1S2 1S; 1SC 1SJ 1SI 1SR

Q Areamos una etiqueta nue"a# recordando que $ox1 es una "$ox creada Q cerca del comienzo de BBinitBB38 la$el M &t(.5a$el3E+Fox37-51E# 108E8 la$el.setBali&nment3 0# 08 $ox1.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.7-51E# 10# &t(.T0.E# &t(.7-51E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.7-51E# 10# &t(.T0.E# &t(.T0.E# 08 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 separator M &t(.+1eparator38 Q 5os 2ltimos ; ar&umentos de pac(Bstart son) Q expand# fill# paddin&. $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# J8 separator.s o'38 la$el M &t(.5a$el3E+Fox37-51E# 08E8 la$el.setBali&nment30# 08 $ox1.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.7-51E# 0# &t(.T0.E# &t(.7-51E# 108 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q 5os ar&umentos son) omo&eneous# spacin&# expand# fill# paddin& $ox2 M ma(eB$ox3&t(.7-51E# 0# &t(.T0.E# &t(.T0.E# 108 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 separator M &t(.+1eparator38 Q 5os 2ltimos ; ar&umentos de pac(Bstart son) Q expand# fill# paddin&. $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# J8 separator.s o'38 elif ' ic MM ;) Q Esto ilustra la posi$ilidad de usar pac(Bend38 para Q alinear los controles a la derec a. Primero creamos una caja nue"a# como antes.

1SS 1SD 1D0 1D1 1D2 1D; 1DC 1DJ 1DI 1DR 1DS 1DD 200 201 202 20; 20C 20J 20I 20R 20S 20D 210 211 212 21; 21C 21J 21I 21R 21S 21D 220 221 222 22; 22C 22J 22I 22R 22S 22D 2;0 2;1 2;2 2;; 2;C 2;J

$ox2 M ma(eB$ox3&t(.7-51E# 0# &t(.7-51E# &t(.7-51E# 08 Q Areamos la etiqueta que pondremos al final. la$el M &t(.5a$el3EendE8 Q 5a empaquetamos con pac(Bend38# por lo que se pone en el extremo derec o Q de la $ox creada en la llamada a ma(eB$ox38. $ox2.pac(Bend3la$el# &t(.7-51E# &t(.7-51E# 08 Q 4ostramos la etiqueta. la$el.s o'38 Q Empaquetamos la $ox2 en $ox1 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.7-51E# 08 $ox2.s o'38 Q .n separador para la parte de a$ajo. separator M &t(.+1eparator38 Q Esto esta$lece expl<citamente el anc o del separador a C00 p<xeles y J Q p<xeles de alto. -s< la $ox que creamos tam$i%n tendr<a C00 Q p<xeles de anc o# y la etiqueta EendE estar9 separada de las otras Q de la $ox. En otro caso# todos los controles de la Q $ox estar<an empaquetados lo m9s juntos posi$le. separator.setBsizeBrequest3C00# J8 Q empaquetamos el separador en la "$ox 3$ox18 creada cerca del principio Q de BBinitBB38 $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# J8 separator.s o'38 Q Areamos otra $ox nue"a. O0ecordemos que podr<amos usar cuantas queramosP quit$ox M &t(.+Fox3&t(.7-51E# 08 Q ?uestro $otn de salida. $utton M &t(.Futton3EHuitE8 Q Aonfi&uramos la se=al que finalice el pro&rama al pulsar el $otn $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 Q Empaquetamos el $otn en la quit$ox. Q 5os ; 2ltimos ar&umentos de pac(Bstart son) Q expand# fill# paddin&. quit$ox.pac(Bstart3$utton# &t(.T0.E# &t(.7-51E# 08 Q empaquetamos la quit$ox en la "$ox 3$ox18 $ox1.pac(Bstart3quit$ox# &t(.7-51E# &t(.7-51E# 08 Q Empaquetamos la "$ox 3$ox18# que a ora contiene todos los controles# Q en la "entana principal. self.'indo'.add3$ox18 Q [ mostramos todo lo que queda

2;I $utton.s o'38 2;R quit$ox.s o'38 2;S 2;D $ox1.s o'38 2C0 Q 4ostrando la "entana al final de forma que todo aparezca de una "ez. 2C1 self.'indo'.s o'38 2C2 2C; def main38) 2CC Q y# naturalmente# el $ucle de e"entos principal. 2CJ &t(.main38 2CI Q El control se de"uel"e a este punto cuando se llama a mainBquit38. 2CR return 0 2CS 2CD if BBnameBB MMEBBmainBBE) 2J0 if len3sys.ar&"8 PM 2) 2J1 sys.stderr.'rite3Eusa&e) pac($ox.py num# ' ere num is 1# 2# or ;.anE8 2J2 sys.exit318 2J; Pac(Fox13strin&.atoi3sys.ar&"^1_88 2JC main38 El peque=o tour por el cdi&o packbox.py empieza por las lineas 1CUJ0 que definen una funcin auxiliar ma(eB$ox que crea una caja orizontal y la rellena con $otones se&2n los par9metros espec<ficados. @e"uel"e una referencia a la caja orizontal. 5as lineas J2U2C1 definen el m%todo de inicializacin BBinitBB38 de la clase Pac(Fox1 que crea una "entana y una caja "ertical en ella que se rellena con una confi&uracin de controles que depende del ar&umento que reci$e. 1i se le pasa un 1# las lineas RJU1;S crean una "entana que muestra las cinco 2nicas posi$ilidades que resultan de "ariar los par9metros omo&eneous# expand y fill. 1i se le pasa un 2# las lineas 1C0U1S2 crean una "entana que muesstra las diferentes com$inaciones de fill con spacin& y paddin&. 7inalmente# si se le pasa un ;# las lineas 1SSU21C crean una "entana que muestra el uso del m%todo pac(Bstart38 para justificar los $otones a la izquierda y el m%todo pac(Bend38 para justificar una etiqueta a la derec a. 5as lineas 21JU2;J crean una caja orizontal que contiene un $otn que se empaqueta dentro de la caja "ertical. 5a se=al Nclic(edN del $otn est9 conectada a la funcin PyGTK &t(.mainBquit38 para terminar el pro&rama. 5as lineas 2J0U2J2 comprue$an los ar&umentos de la l<nea de comandos y terminan el pro&rama usando la funcin sys.exit38 si no ay exactamente un ar&umento. 5a l<nea 2J1 crea una instancia de Pac(Fox1. 5a l<nea 2J; llama a la funcin &t(.main38 para empezar el $ucle de procesamiento de e"entos GTK!. En este pro&rama de ejemplo# las referencias a los controles 3excepto a la "entana8 no se &uardan en los atri$utos de instancia del o$jeto porque no se necesitan m9s tarde. 2.2. :so de Tablas para el E"pa6uetado Teamos otra manera de empaquetado. 4ediante ta$las. Pueden ser extremadamente 2tiles en determinadas situaciones. -l usar ta$las# creamos una rejilla en donde podemos colocar los controles# que pueden

ocupar tantos espacios como especifiquemos. 5o primero que de$emos mirar es# o$"iamente# la funcin &t(.Ta$le38 ) ta$le M &t(.Ta$le3ro(sM1# colu"nsM1# ho"ogeneousM7-51E8 El primer ar&umento es el n2mero de filas de la ta$la# mientras que el se&undo# o$"iamente# es el n2mero de columnas. El ar&umento homogeneous tiene que "er con el tama=o de las celdas de la ta$la. 1i homogeneous es T0.E# las celdas de la ta$la tienen el tama=o del mayor control en ella. 1i homogeneous es 7-51E# el tama=o de las celdas "iene dado por el control m9s alto de su misma fila# y el control m9s anc o de su columna. 5as filas y las columnas se disponen de 0 a n# donde n es el n2mero que se especific en la llamada a &t(.Ta$le38. Por tanto# si se especifica ro's 3filas8 M 2 y columns 3columnas8 M 2# la dispoisicin quedar<a as<) 0 1 2 0!UUUUUUUUUU!UUUUUUUUUU! b b b 1!UUUUUUUUUU!UUUUUUUUUU! b b b 2!UUUUUUUUUU!UUUUUUUUUU! /$s%r"ese que el sistema de coordenadas tiene su or&ien en la esquina superior izquierda. Para introducir un control en una caja# se usa el si&uiente m%todo) ta$le.attac 3child# le-t.attach# right.attach# top.attach# botto".attach# xoptionsME6P-?@b7:55# yoptionsME6P-?@b7:55# xpaddingM0# ypaddingM08 5a instancia ta$le es la ta$la que se cre con &t(.Ta$le38. El primer par9metro 3Ec ildE8 es el control que se desea introducir en la ta$la. 5os ar&umentos left_attach# right_attach# top_attach y bottom_attach especifican dnde situar el control# y cu9ntas cajas usar. 1i se quiere poner un $otn en la esquina inferior derec a de una ta$la 2x2# y se quiere que ocupe 1c5/ ese espacio# left_attach ser<a M 1# right_attach M 2# top_attach M 1# bottom_attach M 2. - ora# si se desea que un control ocupe la fila entera de la ta$la 2x2# se pondr<a left_attach M 0# right_attach M 2# top_attach M 0# bottom_attach M 1. 5os ar&umentos xoptions e yoptions se usan para especificar opciones de colocacin y pueden unirse mediante la operacin /0# permitiendo as< m2ltiples opciones. Estas opciones son) 1i la caja es m9s &rande que el control# y se especifica 7:55# el control se expandir9 asta usar todo el espacio disponi$le. 1i se le asi&na menos espacio a la ta$la del que solicit 3normalmente porque el usuario a redimensionado la "entana8# entonces los controles normalmente ser<a 1+0:?K empujados a la parte inferior de la "entana y desaparecer<an. 1i se especifica 1+0:?K# los controles se encojer9n con la ta$la. 7:55

E6P-?@ Esto ar9 que la ta$la se expanda para usar el espacio so$rante en la "entana. El Paddin& es i&ual que en las cajas# ya que crea un espacio "ac<o especificado en p<xeles alrededor del control. Tam$i%n tenemos los m%todos setBro'Bspacin&38 y setBcolBspacin&38# que a=aden espacio entre las filas en la columna o fila especificada. ta$le.setBro'Bspacin&3ro(# spacing8 y ta$le.setBcolBspacin&3colu"n# spacing8 /$s%r"ese que# para las columnas# el espacio "a a la derec a de la columna# y# para las filas# el espacio "a de$ajo de la fila. Tam$i%n se puede poner un espacio i&ual en todas las filas yGo columnas con) ta$le.setBro'Bspacin&s3spacing8 y# ta$le.setBcolBspacin&s3spacing8 /$s%r"ese que con %stas funciones# la 2ltima fila y la 2ltima columna no o$tienen nin&2n espacio. 2.;. E)e"plo de E"pa6uetado con Tablas El pro&rama de ejemplo table.py crea una "entana con tres $otones en una ta$la 2x2. 5os primeros dos $otones se colocar9n en la fila superior. .n tercer $otn# para salir# se coloca en la fila inferior# y ocupa las dos columnas. 5a 7i&ura C.C# VEmpaquetado aciendo uso de una Ta$laW ilustra la "entana resultante) #igura 2.2. E"pa6uetado haciendo uso de una Tabla

-qu< si&ue el cdi&o fuente) 1 2 ; C J I R S D 10 11 12 QPGusrG$inGen" pyt on Q ejemplo ta$le.py import py&t( py&t(.require3N2.0N8 import &t( class Ta$le) Q ?uestra retrollamada. Q 5os datos que se pasan a este m%todo se imprimen por la salida est9ndar. def call$ac(3self# 'id&et# dataM?one8)

1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0

print E+ello a&ain U `s 'as pressedE ` data Q Esta retrollamada sale del pro&rama. def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def BBinitBB3self8) Q Areamos una "entana nue"a self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 Q Esta$lecemos el t<tulo de la "entana self.'indo'.setBtitle3ETa$leE8 Q 7ijamos un manejador para deleteBe"ent que sale de GTK! Q inmediatamente. self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 Q 7ijamos el &rosor de los $ordes. self.'indo'.setB$orderB'idt 3208 Q Areamos una ta$la 2x2. ta$le M &t(.Ta$le32# 2# &t(.T0.E8 Q Ponemos la ta$la en la "entana principal self.'indo'.add3ta$le8 Q Areamos el primer $otn $utton M &t(.Futton3E$utton 1E8 Q Auando se pulsa el $otn llamamos al m%todo Ecall$ac(E Q con una indicacin a E$utton 1E como ar&umento. $utton.connect3Eclic(edE# self.call$ac(# E$utton 1E8 Q :nsertamos el $otn 1 en el cuadrante superior izquierdo de la ta$la. ta$le.attac 3$utton# 0# 1# 0# 18 $utton.s o'38 Q Areamos el se&undo $otn. $utton M &t(.Futton3E$utton 2E8 Q Auando se pulsa el $otn llamamos al m%todo Ecall$ac(E Q con una indicacin a E$utton 2E como ar&umento. $utton.connect3Eclic(edE# self.call$ac(# E$utton 2E8 Q :nsertamos el $otn 2 en el cuadrante superior derec o de la ta$la.

I1 ta$le.attac 3$utton# 1# 2# 0# 18 I2 I; $utton.s o'38 IC IJ Q Areamos el $otn de salida EHuitE II $utton M &t(.Futton3EHuitE8 IR IS Q Auando se pulsa el $otn llamamos a la funcin mainBquit y ID Q el pro&rama se termina R0 $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 R1 R2 Q :nsertamos el $otn de salida en los dos cuadrantes inferiores de la ta$la R; ta$le.attac 3$utton# 0# 2# 1# 28 RC RJ $utton.s o'38 RI RR ta$le.s o'38 RS self.'indo'.s o'38 RD S0 def main38) S1 &t(.main38 S2 return 0 S; SC if BBnameBB MM EBBmainBBE) SJ Ta$le38 SI main38 5a clase Ta$le se define en las l<neas DURS. 5as l<neas 12U1; definen el m%todo call$ac(38 que se llama al acer Eclic(E en dos de los $otones. 5a retrollamada slo imprime un mensaje en la consola indicando qu% $otn se puls usando los datos que se le pasan. 5as lineas 1IU1S definen el m%todo deleteBe"ent38 que se llama cuando el manejador de "entanas le pide a la "entana que se elimine. 5as l<neas 20URS definen el constructor de la clase Ta$le BBinitBB38. Area una "entana 3l<nea 228# le pone el t<tulo 3l<nea 2J8# conecta la retrollamada deleteBe"ent38 a la se=al EdeleteBe"entE 3l<nea 2D8# y le pone el anc o al $orde 3l<nea ;28. 1e crea una &t(.Ta$le en la l<nea ;J y se a=ade a la "entana en la l<nea ;S. 5os dos $otones superiores se crean en las l<neas C1 y JJ# sus se=ales Eclic(edE se conectan al m%todo call$ac(38 en las l<neas CJ y JD\ y se a=aden a la ta$la en la primera fila en las l<neas CD y I1. 5as l<neas IIUR2 crean el $otn EHuitE# conectan su se=al Eclic(edE a la funcin mainquit38 y lo a=aden a la ta$la ocupando la fila inferior completa. Captulo ;. Perspecti0a General de Controles Tabla de contenidos J.1. *erarqu<a de Aontroles J.2. Aontroles sin Tentana

5os pasos &enerales para usar un control 3'id&et8 en PyGTK son) 1e llama a &t(.Z 3una de las m2ltiples funciones para crear un nue"o control# y que se detallan en esta seccin. 1e conectan todas la se=ales y e"entos que queramos usar a los manejadores apropiados. 1e esta$lecen los atri$utos del control. 1e empaqueta el control dentro de un contenedor usando una llamada como &t(.Aontainer.add38 o &t(.Fox.pac(Bstart38. 1e llama a &t(.>id&et.s o'38 en el control. s o'38 le permite sa$er a GTK que emos terminado de confi&urar los atri$utos del control# y est9 listo para ser mostrado. Tam$i%n se puede usar &t(.>id&et. ide38 para que desaparezca otra "ez. El orden en el que se muestran los controles no es importante# pero es con"eniente que se muestre la "entana al final de modo que la toda la "entana aparezca de una "ez y no se "ea como "an apareciendo los controles indi"iduales en la "entana a medida que se "an formando. 5os ijos de un control 3una "entana tam$i%n es un control8 no se mostrar9n asta que la propia "entana se muestre usando el m%todo s o'38 . ;.1. <erar6ua de Controles Aomo referencia# aqu< aparece el 9r$ol de la jerarqu<a utilizada para implementar los controles. 31e an omitido los controles o$soletos y las clases auxiliares8. &o$ject.G/$ject b !&t(./$ject 3/$jeto8 b !&t(.>id&et 3Aontrol8 b b !&t(.4isc 34isc%laneo8 b b b !&t(.5a$el 3Etiqueta8 b b b b d&t(.-ccel5a$el 3Etiqueta-celeradora8 b b b !&t(.-rro' 37lec a8 b b b d&t(.:ma&e 3:ma&en8 b b !&t(.Aontainer 3Aontenedor8 b b b !&t(.Fin 3Finario8 b b b b !&t(.-li&nment 3-lineador8 b b b b !&t(.7rame 34arco8 b b b b b d&t(.-spect7rame 34arco Proporcional8 b b b b !&t(.Futton 3Fotn8 b b b b b !&t(.To&&leFutton 3Fotn Fiestado8 b b b b b b d&t(.A ec(Futton 3Fotn -cti"acin8 b b b b b b d&t(.0adioFutton 3Fotn Exclusin 42tua8 b b b b b !&t(.AolorFutton 3Fotn de seleccin de Aolor8 b b b b b !&t(.7ontFutton 3Fotn de seleccin de 7uente8 b b b b b d&t(./ption4enu 34en2 /pciones8 b b b b !&t(.:tem 3Elemento8 b b b b b !&t(.4enu:tem 3Elemento de 4en28 b b b b b !&t(.A ec(4enu:tem 3Elemento -cti"a$le de 4en28

b b b b b b d&t(.0adio4enu:tem 3Elemento de Exclusin 42tua de 4en28 b b b b b !&t(.:ma&e4enu:tem 3Elemento de :ma&en de 4en28 b b b b b !&t(.1eparator4enu:tem 3Elemento de 1eparacin de 4en28 b b b b b d&t(.Tearoff4enu:tem 34en2 @esprendi$le8 b b b b !&t(.>indo' 3Tentana8 b b b b b !&t(.@ialo& 3@i9lo&o8 b b b b b b !&t(.Aolor1election@ialo& 3@i9lo&o de 1eleccin de Aolores8 b b b b b b !&t(.7ileA ooser@ialo& 3@i9lo&o de 1eleccin de 7ic eros8 b b b b b b !&t(.7ile1election 31elector de 7ic eros8 b b b b b b !&t(.7ont1election@ialo& 3@i9lo&o de 1eleccin de Tipos de 5etra8 b b b b b b !&t(.:nput@ialo& 3@i9lo&o de Entrada de @atos8 b b b b b b d&t(.4essa&e@ialo& 3@i9lo&o de 4ensaje8 b b b b b d&t(.Plu& 3Aonecta$le8 b b b b !&t(.Aom$oFox 3Aaja con 5ista @esple&a$le8 b b b b b d&t(.Aom$oFoxEntry 3Entrada de Aaja de 5ista @esple&a$le8 b b b b !&t(.E"entFox 3Aaja de E"entos8 b b b b !&t(.Expander 3Expansin8 b b b b !&t(.+andleFox 34anejador de Aaja8 b b b b !&t(.Tool:tem 3Elemento de Farra de +erramientas8 b b b b b !&t(.ToolFutton 3Fotn de Farra de +erramientas8 b b b b b b !&t(.To&&leToolFutton 3Fotn Fiestado de Farra de +erramientas8 b b b b b b b d&t(.0adioToolFutton 3Fotn de Exclusin 42tua de Farra de +erramientas8 b b b b b d&t(.1eparatorToo:tem 31eparador de Elementos de Farra de +erramientas8 b b b b !&t(.1crolled>indo' 3Tentana de @esplazamiento8 b b b b d&t(.Tie'port 3Tista8 b b b !&t(.Fox 3Aaja8 b b b b !&t(.FuttonFox 3Aaja de Fotones8 b b b b b !&t(.+FuttonFox 3Aaja de Fotones +orizontal8 b b b b b d&t(.TFuttonFox 3Aaja de Fotones Tertical8 b b b b !&t(.TFox 3Aaja Tertical8 b b b b b !&t(.Aolor1election 31elector de Aolores8 b b b b b !&t(.7ont1election 31elector de Tipos de 5etra8 b b b b b d&t(.GammaAur"e 3Aur"a Gamma8 b b b b d&t(.+Fox 3Aaja +orizontal8 b b b b !&t(.Aom$o 35ista @esple&a$le8 b b b b d&t(.1tatus$ar 3Farra de Estado8 b b b !&t(.7ixed 37ijo8 b b b !&t(.Paned 3Panel8 b b b b !&t(.+Paned 3Panel +orizontal8 b b b b d&t(.TPaned 3Panel Tertical8 b b b !&t(.5ayout 3@isposicin8 b b b !&t(.4enu1 ell 3Aonsola de 4en28 b b b b !&t(.4enuFar 3Farra de 4en28 b b b b d&t(.4enu 34en28 b b b !&t(.?ote$oo( 3Auaderno de 7ic as8 b b b !&t(.1oc(et 31oc(et8 b b b !&t(.Ta$le 3Ta$la8 b b b !&t(.TextTie' 3Tista de Texto8

b b b !&t(.Tool$ar 3Farra de +erramientas8 b b b d&t(.TreeTie' 3Tista de er$ol8 b b !&t(.Aalendar 3Aalendario8 b b !&t(.@ra'in&-rea 3erea de @i$ujo8 b b b d&t(.Aur"e 3Aur"a8 b b !&t(.Entry 3Entrada de Texto8 b b b d&t(.1pinFutton 3Fotn -umentarG@isminuir8 b b !&t(.0uler 30e&la8 b b b !&t(.+0uler 30e&la +orizontal8 b b b d&t(.T0uler 30e&la Tertical8 b b !&t(.0an&e 30an&o8 b b b !&t(.1cale 3Escala8 b b b b !&t(.+1cale 3Escala +orizontal8 b b b b d&t(.T1cale 3Escala Tertical8 b b b d&t(.1croll$ar 3Farra de @esplazamiento8 b b b !&t(.+1croll$ar 3Farra de @esplazamiento +orizontal8 b b b d&t(.T1croll$ar 3Farra de @esplazamiento Tertical8 b b !&t(.1eparator 31eparador8 b b b !&t(.+1eparator 31eparador +orizontal8 b b b d&t(.T1eparator 31eparador Tertical8 b b !&t(.:n"isi$le 3:n"isi$le8 b b !&t(.Pro&ress 3Elemento de Pro&reso8 b b b d&t(.Pro&ressFar 3Farra de Pro&reso8 b !&t(.-djustment 3-juste8 b !&t(.Aell0enderer 3Tisualizador de Aelda8 b b !&t(.Aell0endererPix$uf 3Tisualizador de :m9&en de Aelda8 b b !&t(.Aell0endererText 3Tisualizador de Texto de Aelda8 b b !&t(.Aell0endererTo&&le 3Tisualizador de -cti"acin de Aelda8 b !&t(.7ile7ilter 37iltro de 1eleccin de -rc i"os8 b !&t(.:tem7actory 37actor<a de Elementos8 b !&t(.Tooltips 3Pistas8 b d&t(.TreeTie'Aolumn 3Aolumna de Tista de er$ol8 !&t(.-ction 3-ccin8 b !&t(.To&&le-ction 3-ccin Fiestado8 b b d&t(.0adio-ction 3-ccin de Exclusin 42tua8 !&t(.-ctionGroup 3Grupo de -cciones8 !&t(.EntryAompletion 3Aompletado de Entrada8 !&t(.:con7actory 37actor<a de :conos8 !&t(.:conT eme 3Tema de :conos8 !&t(.:4Aontext 3Aontexto de 4%todo de Entrada8 b !&t(.:4Aontext1imple 3Aontexto 1imple de 4%todo de Entrada8 b d&t(.:44ulticontext 3Aontexto 42ltiple de 4%todo de Entrada8 !&t(.5ist1tore 3-lmac%n en 5ista8 !&t(.0c1tyle 30ecurso de Estilos8 !&t(.1ettin&s 3/pciones8 !&t(.1izeGroup 3Grupo de Tama=o8 !&t(.1tyle 3Estilo8 !&t(.TextFuffer 3Fuffer de texto8

!&t(.TextA ild-nc or 3-nclaje +ijo de Texto8 !&t(.Text4ar( 34arca en Texto8 !&t(.TextTa& 3Etiqueta de Texto8 !&t(.TextTa&Ta$le 3Ta$la de Etiquetas de Texto8 !&t(.Tree4odel7ilter 34odelo en er$ol 7iltrado8 !&t(.Tree4odel1ort 34odelo en er$ol /rdenado8 !&t(.Tree1election 31eleccin de er$ol8 !&t(.Tree1tore 3-lmac%n en er$ol8 !&t(..:4ana&er 3Gestor de :nterfaces de .suario8 !&t(.>indo'Group 3Grupo de Tentanas8 !&t(.&d(.@ra&Aontext 3Aontexto de -rrastre8 !&t(.&d(.1creen 3Pantalla8 !&t(.&d(.Pix$uf 3Fuffer de p<xeles8 !&t(.&d(.@ra'a$le 3@i$uja$le8 b !&t(.&d(.Pixmap 34apa de Fits8 !&t(.&d(.:ma&e 3:ma&en8 !&t(.&d(.Pix$uf-nimation 3-nimacin8 !&t(.&d(.@e"ice 3@ispositi"o de Entrada8 &o$ject.G/$ject b !&t(.Aell5ayout 3@isposicin de Aeldas8 !&t(.Edita$le 3Edita$le8 !&t(.AellEdita$le 3Editor de Aelda8 !&t(.7ileA ooser 31eleccin de 7ic eros8 !&t(.Tree4odel 34odelo en er$ol8 !&t(.Tree@ra&1ource 37uente de -rrastre en er$ol8 !&t(.Tree@ra&@est 3@estino de -rrastre en er$ol8 !&t(.Tree1orta$le 3er$ol /rdena$le8

;.!. Controles sin $entana 5os si&uientes controles no tienen una "entana asociada. 1i quieres caputar e"entos# tendr9s que usar E"entFox. 4ira la seccin del control E"entFox. &t(.-li&nment 3-lineador8 &t(.-rro' 37lec a8 &t(.Fin 3Finario8 &t(.Fox 3Aaja8 &t(.Futton 3Fotn8 &t(.A ec(Futton 3Fotn de -cti"acin8 &t(.7ixed 37ijo8 &t(.:ma&e 3:ma&en8 &t(.5a$el 3Etiqueta8 &t(.4enu:tem 3Elemento de 4en28 &t(.?ote$oo( 3Auaderno de 7ic as8 &t(.Paned 3Panel8

&t(.0adioFutton 3Fotn de Exclusin 42tua8 &t(.0an&e 30an&o8 &t(.1crolled>indo' 3Tentana de @esplazamiento8 &t(.1eparator 31eparador8 &t(.Ta$le 3Ta$la8 &t(.Tool$ar 3Farra de +erramientas8 &t(.-spect7rame 34arco de -specto8 &t(.7rame 34arco8 &t(.TFox 3Aaja Tertical8 &t(.+Fox 3Aaja +orizontal8 &t(.T1eparator 31eparador Tertical8 &t(.+1eparator 31eparador +orizontal8 1e&uiremos nuestra exploracin de PyGTK examinando cada control# creando pro&ramas de ejemplo simples que los muestren. El Control de =otn Tabla de contenidos I.1. Fotones ?ormales I.2. Fotones Fiestado 3To&&le Futtons8 I.;. Fotones de -cti"acin 3A ec( Futtons8 I.C. Fotones de Exclusin 42tua 30adio Futtons8 >.1. =otones or"ales

[a emos "isto casi todo lo que ay que "er so$re el control de $otn. Es $astante sencillo. 1e puede usar la funcin &t(.Futton38 para crear un $otn con una etiqueta pas9ndole un par9metro de cadena# o uno en $lanco si no se especifica dic a cadena. @espu%s depende uno el empaquetar o$jetos tales como una etiqueta o un pixmap en este nue"o $otn. Para ello# se crea una nue"a caja# y despu%s se colocan los o$jetos en ella usando el t<pico pac(Bstart38. 7inalmente se usa add38 para colocar la caja dentro del $otn. 5a funcin para crear un $otn es) $utton M &t(.Futton3labelM?one# stockM?one8 si se especifica una etiqueta %sta se usa como texto del $otn.1i se especifica stoc( %ste se usa para ele&ir un icono de serie y una etiqueta para el $otn. 5os elementos de serie son) 1T/AKB@:-5/GB:?7/ 1T/AKB@:-5/GB>-0?:?G 1T/AKB@:-5/GBE00/0 1T/AKB@:-5/GBH.E1T:/? 1T/AKB@?@ 1T/AKB@?@B4.5T:P5E 1T/AKB-@@ 1T/AKB-PP5[ 1T/AKBF/5@

1T/AKBA-?AE5 1T/AKBA@0/4 1T/AKBA5E-0 1T/AKBA5/1E 1T/AKBA/?TE0T 1T/AKBA/P[ 1T/AKBA.T 1T/AKB@E5ETE 1T/AKBE6EA.TE 1T/AKB7:?@ 1T/AKB7:?@B-?@B0EP5-AE 1T/AKB75/PP[ 1T/AKBG/T/BF/TT/4 1T/AKBG/T/B7:01T 1T/AKBG/T/B5-1T 1T/AKBG/T/BT/P 1T/AKBG/BF-AK 1T/AKBG/B@/>? 1T/AKBG/B7/0>-0@ 1T/AKBG/B.P 1T/AKB+E5P 1T/AKB+/4E 1T/AKB:?@E6 1T/AKB:T-5:A 1T/AKB*.4PBT/ 1T/AKB*.1T:7[BAE?TE0 1T/AKB*.1T:7[B7:55 1T/AKB*.1T:7[B5E7T 1T/AKB*.1T:7[B0:G+T 1T/AKB4:11:?GB:4-GE 1T/AKB?E> 1T/AKB?/ 1T/AKB/K 1T/AKB/PE? 1T/AKBP-1TE 1T/AKBP0E7E0E?AE1 1T/AKBP0:?T 1T/AKBP0:?TBP0ET:E> 1T/AKBP0/PE0T:E1 1T/AKBH.:T 1T/AKB0E@/ 1T/AKB0E70E1+ 1T/AKB0E4/TE 1T/AKB0ETE0TBT/B1-TE@ 1T/AKB1-TE 1T/AKB1-TEB-1 1T/AKB1E5EATBA/5/0 1T/AKB1E5EATB7/?T

1T/AKB1/0TB-1AE?@:?G 1T/AKB1/0TB@E1AE?@:?G 1T/AKB1PE55BA+EAK 1T/AKB1T/P 1T/AKB1T0:KET+0/.G+ 1T/AKB.?@E5ETE 1T/AKB.?@E05:?E 1T/AKB.?@/ 1T/AKB[E1 1T/AKBf//4B100 1T/AKBf//4B7:T 1T/AKBf//4B:? 1T/AKBf//4B/.T El pro&rama de ejemplo buttons.py proporciona un ejemplo del uso de &t(.Futton38 para crear un $otn con una ima&en y una etiqueta en %l. 1e a separado el cdi&o para crear una caja del resto para que se pueda usar en m9s pro&ramas. +ay m9s ejemplos del uso de im9&enes m9s adelante en el tutorial. 5a fi&ura Figura 6.1, Botn con Pixmap y Etiqueta muestra la "entana con un $otn que incluye una ima&en y una etiqueta) #igura >.1. =otn con Pix"ap y Eti6ueta

El cdi&o fuente del pro&rama buttons.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; QPGusrG$inGen" pyt on Q ejemplo de inicializacin de $otones $uttons.py import py&t( py&t(.require3N2.0N8 import &t( Q Areamos una nue"a $ox con una ima&en y una etiqueta empaquetadas en ella Q y de"ol"emos la caja. def xpmBla$elB$ox3parent# xpmBfilename# la$elBtext8) Q Arear caja para xpm y etiqueta $ox1 M &t(.+Fox3&t(.7-51E# 08 $ox1.setB$orderB'idt 328 Q - ora nos ponemos con la ima&en ima&e M &t(.:ma&e38 ima&e.setBfromBfile3xpmBfilename8 Q Areamos una etiqueta para el $otn la$el M &t(.5a$el3la$elBtext8

2C Q Empaquetamos el pixmap y la etiqueta en la caja 2J $ox1.pac(Bstart3ima&e# &t(.7-51E# &t(.7-51E# ;8 2I $ox1.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# ;8 2R 2S ima&e.s o'38 2D la$el.s o'38 ;0 return $ox1 ;1 ;2 class Futtons) ;; Q ?uestro m%todo a$itual de retrollamada 3call$ac(8 ;C def call$ac(3self# 'id&et# dataM?one8) ;J print E+ello a&ain U `s 'as pressedE ` data ;I ;R def BBinitBB3self8) ;S Q Areamos una "entana nue"a ;D self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 C0 C1 self.'indo'.setBtitle3E:ma&eNd FuttonsPE8 C2 C; Q Es $uena idea acer esto para todas las "entanas CC self.'indo'.connect3EdestroyE# lam$da 'id) &t(.mainBquit388 CJ self.'indo'.connect3EdeleteBe"entE# lam$da a1#a2)&t(.mainBquit388 CI CR Q 7ijamos el anc o de $orde de la "entana CS self.'indo'.setB$orderB'idt 3108 CD J0 Q Areamos un nue"o $otn J1 $utton M &t(.Futton38 J2 J; Q Aonectamos la se=al Eclic(edE a nuestra retrollamada JC $utton.connect3Eclic(edE# self.call$ac(# Ecool $uttonE8 JJ JI Q Esto llama a nuestra funcin de creacin de caja JR $ox1 M xpmBla$elB$ox3self.'indo'# Einfo.xpmE# Ecool $uttonE8 JS JD Q Empaquetamos y mostramos todos los controles I0 $utton.add3$ox18 I1 I2 $ox1.s o'38 I; $utton.s o'38 IC IJ self.'indo'.add3$utton8 II self.'indo'.s o'38 IR IS def main38) ID &t(.main38 R0 return 0 R1

R2 if BBnameBB MM EBBmainBBE) R; Futtons38 RC main38 5as l<neas 12U;C definen la funcin auxiliar xpmBla$elB$ox38 que crea una caja orizontal con un $orde de anc o 2 3lineas 1CU1J8 y le pone una ima&en 3lineas 22U2;8 y una etiqueta 3linea 2I8. 5as l<neas ;IUR0 definen la clase Futtons. 5as l<neas C1UR0 definen el m%todo de inicializacin de instancia que crea una "entana 3linea C;8# le pone el t<tulo 3linea CJ8# le conecta las se=ales EdeleteBe"entE y EdestroyE 3lineas CSUCD8. 5a linea JJ crea el $otn sin etiqueta. 1u se=al Eclic(edE se conecta al m%todo call$ac(38 en la linea JS. 5a funcin xpmBla$elB$ox38 se llama en la linea I1 para crear la ima&en y la etiqueta que se pondr9n en el $otn en la linea IC. 5a funcin xpmBla$elB$ox38 podr<a usarse para empaquetar arc i"os xpm y etiquetas en cualquier control que pueda ser un contenedor. El control Fotn tiene las si&uientes se=ales) pressed U se emite cuando el $otn del puntero se presiona en el control Fotn released U se emite cuando el $otn del puntero se suelta en el control Fotn clic(ed U se emite cuando el $otn del puntero se presiona y lue&o se suelta so$re el control Fotn enter U se emite cuando el puntero entra en el control Fotn lea"e U se emite cuando el puntero sale del control Fotn >.!. =otones =iestado 8Toggle =uttons9 5os Fotones Fiestado deri"an de los $otones normales y son muy similares# excepto que siempre est9n en uno de dos estados# altern9ndolos con un clic. Puedan estar presionados# y cuando se "uel"a a acer clic# "ol"er9n a su estado inicial# le"antados. 1e ace clic otra "ez y "ol"er9n a estar presionados. 5os $otones Fiestado son la $ase para los $otones de acti"acin y los $otones de exclusin m2tua# y por ello# muc as de las llamadas usadas con los $otones $iestado son eredados por los $otones de acti"acin y los $otones de exclusin m2tua. Tol"eremos a destacar este ec o cuando tratemos esos $otones. Areacin de un nue"o $otn $iestado) to&&leB$utton M &t(.To&&leFutton3labelM?one8 Aomo se puede ima&inar# estas llamadas funcionan i&ual que las llamadas al control de $otn normal. 1i no se especifica etiqueta el $otn estar9 "acio. El texto de la etiqueta se analiza para compro$ar si contiene caracteres mnemot%cnicos con el prefijo NBN Para o$tener el estado de un $otn $iestado# incluyendo los $otones de exclusin m2tua y

los $otones de acti"acin# se utiliza el mecanismo del ejemplo anterior. -s< se comprue$a el estado del $iestado# llamando al m%todo &etBacti"e38 del o$jeto $otn $iestado. 5a se=al que nos interesa que emiten los $otones $iestado 3el $otn $iestado# el $otn de acti"acin y el $otn de exclusin m2tua8 es la se=al Eto&&ledE. Para compro$ar el estado de estos $otones# se confi&ura un manejador de se=ales para capturar la se=al to&&led# y se accede a los atri$utos del o$jeto para determinar su estado. 5a retrollamada ser9 parecida a) def to&&leB$uttonBcall$ac(3'id&et# data8) if 'id&et.&etBacti"e38) Q 1i estamos aqui# el $otn $iestado est9 pulsado else) Q 1i estamos aqui# el $otn $iestado est9 le"antado Para forzar el estado de un $otn $iestado# y de sus ijos# el $otn de exclusin m2tua y el $otn de acti"acin# se utiliza este m%todo) to&&leB$utton.setBacti"e3is.acti0e8 El m%todo anterior puede usarse para forzar el estado del $otn $iestado# y sus ijos los $otones de acti"acin y de exclusin m2tua. Especificando un ar&umento T0.E o 7-51E para el par9metro is_active indicamos si el $otn de$er<a estar pulsado o le"antado. Auando el $otn $iestado se crea# su "alor predeterminado es le"antado o 7-51E. +ay que fijarse en que# cuando se usa el m%todo setBacti"e38# y cam$ia realmente el estado del $otn# se produce la emisin de las se=ales Eclic(edE y Eto&&ledE por %ste. to&&leB$utton.&etBacti"e38 Este m%todo de"uel"e el estado actual del $otn $iestado como un "alor $ooleano T0.E o 7-51E. El pro&rama togglebutton.py proporciona un ejemplo simple del uso de $otones $iestado. 5a fi&ura 7i&ura I.2# VEjemplo de Fotn FiestadoW ilustra la "entana resultante con el se&undo $otn $iestado acti"o) #igura >.!. E)e"plo de =otn =iestado

El cdi&o fuente del pro&rama es) 1 2 ; C J I R S D QPGusrG$inGen" pyt on Q ejemplo to&&le$utton.py import py&t( py&t(.require3N2.0N8 import &t( class To&&leFutton)

10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR

Q ?uestra retrollamada. Q 5os datos pasados a este m%todo se imprimen a la salida est9ndar def call$ac(3self# 'id&et# dataM?one8) print E`s 'as to&&led `sE ` 3data# 3E/77E# E/?E8^'id&et.&etBacti"e38_8 Q Esta retrollamada termina el pro&rama def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def BBinitBB3self8) Q Arear una nue"a "entana self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 Q Esta$lece el t<tulo de la "entana self.'indo'.setBtitle3ETo&&le FuttonE8 Q 1et a andler for deleteBe"ent t at immediately Q exits GTK. self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 Q Esta$lece el anc o del $orde de la "entana self.'indo'.setB$orderB'idt 3208 Q Area una caja "ertical "$ox M &t(.TFox3&t(.T0.E# 28 Q :nserta "$ox en la "entana principal self.'indo'.add3"$ox8 Q Area el primer $otn $utton M &t(.To&&leFutton3Eto&&le $utton 1E8 Q cuando se conmuta el $otn llamamos el m%todo Ecall$ac(E Q con un puntero a E$uttonE como ar&umento $utton.connect3Eto&&ledE# self.call$ac(# Eto&&le $utton 1E8 Q :nsertar el $otn 1 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 $utton.s o'38 Q Arear el se&undo $otn $utton M &t(.To&&leFutton3Eto&&le $utton 2E8 Q Auando se conmuta el $otn llamamos el m%todo Ecall$ac(E

JS Q con un puntero a E$utton 2E como ar&umento JD $utton.connect3Eto&&ledE# self.call$ac(# Eto&&le $utton 2E8 I0 Q :nsertamos el $otn 2 I1 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 I2 I; $utton.s o'38 IC IJ Q Arear el $otn EHuitE II $utton M &t(.Futton3EHuitE8 IR IS Q Auando se pulsa el $otn llamamos la funcin mainBquit ID Q y el pro&rama finaliza R0 $utton.connect3Eclic(edE# lam$da 'id) &t(.mainBquit388 R1 R2 Q :nsertar el $otn de salida R; "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 RC RJ $utton.s o'38 RI "$ox.s o'38 RR self.'indo'.s o'38 RS RD def main38) S0 &t(.main38 S1 return 0 S2 S; if BBnameBB MM EBBmainBBE) SC To&&leFutton38 SJ main38 5as lineas interesantes son la 12U1;# que definen el m%todo call$ac(38 que imprime la etiqueta del $otn $iestado y su estado cuando es acti"ado. 5as lineas CJ y JD conectan la se=al Eto&&ledE de los $otones $iestado al m%todo call$ac(38. >./. =otones de 3cti0acin 8Check =uttons9 5os $otones de acti"acin eredan muc as propiedades y m%todos de los $otones $iestado "istos anteriormente# pero su apariencia es un poco diferente. En "ez de ser $otones con texto dentro de ellos# son peque=as cajas con un texto a su derec a. ?ormalmente se utilizan para opciones que pueden estar acti"adas o desacti"adas en las aplicaciones. El m%todo de creacin es similar al de los $otones normales. c ec(B$utton M &t(.A ec(Futton3labelM?one8 1i el ar&umento label se especifica# el m%todo crea un $otn de acti"acin con una etiqueta a su lado. El texto label de la etiqueta se analiza en $usca de caracteres mnemot%cnicos con prefijo NBN Ter y modificar el estado de un $otn de acti"acin es i&ual que en un $otn $iestado.

El pro&rama checkbutton.py proporciona un ejemplo del uso de los $otones de acti"acin. 5a fi&ura 7i&ura I.;# VEjemplo de Fotn de -cti"acinW ilustra la "entana resultante) #igura >./. E)e"plo de =otn de 3cti0acin

El cdi&o fuente del pro&rama checkbutton.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D QPGusrG$inGen" pyt on Q ejemplo c ec($utton.py import py&t( py&t(.require3N2.0N8 import &t( class A ec(Futton) Q ?uestra retrollamada Q 5os datos pasados a este m%todo se imprimen en la salida est9ndar def call$ac(3self# 'id&et# dataM?one8) print E`s 'as to&&led `sE ` 3data# 3E/77E# E/?E8^'id&et.&etBacti"e38_8 Q Esta retrollamada termina el pro&rama def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def BBinitBB3self8) Q Arear una nue"a "entana self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 Q Esta$lecer el t<tulo de la "entana self.'indo'.setBtitle3EA ec( FuttonE8 Q 7ijar un manejador para deleteBe"ent que Q sal&a inmediatamente de GTK. self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 Q 7ijamos el $orde de la "entana self.'indo'.setB$orderB'idt 3208 Q Areamos una caja "ertical "$ox "$ox M &t(.TFox3&t(.T0.E# 28 Q :nsertamos "$ox en la "entana principal self.'indo'.add3"$ox8

C0 Q Areamos el primer $otn C1 $utton M &t(.A ec(Futton3Ec ec( $utton 1E8 C2 C; Q Auando se conmuta el $otn llamamos el m%todo Ecall$ac(E CC Q con un puntero a E$uttonE como ar&umento CJ $utton.connect3Eto&&ledE# self.call$ac(# Ec ec( $utton 1E8 CI CR CS Q :nsertamos el $otn 1 CD "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 J0 J1 $utton.s o'38 J2 J; Q Areamos un se&undo $otn JC JJ $utton M &t(.A ec(Futton3Ec ec( $utton 2E8 JI JR Q Auando se conmuta el $otn llamamos el m%todo Ecall$ac(E JS Q con un puntero a E$utton 2E como ar&umento JD $utton.connect3Eto&&ledE# self.call$ac(# Ec ec( $utton 2E8 I0 Q :nsertamos el $otn 2 I1 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 I2 I; $utton.s o'38 IC IJ Q Areamos el $otn EHuitE II $utton M &t(.Futton3EHuitE8 IR IS Q Auando se pulsa el $otn llamamos la funcin mainquit ID Q y el pro&rama termina R0 $utton.connect3Eclic(edE# lam$da 'id) &t(.mainBquit388 R1 R2 Q :nsertamos el $otn de salida R; "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 RC RJ $utton.s o'38 RI "$ox.s o'38 RR self.'indo'.s o'38 RS RD def main38) S0 &t(.main38 S1 return 0 S2 S; if BBnameBB MM EBBmainBBE) SC A ec(Futton38 SJ main38

>.2. =otones de Exclusin '?tua 8,adio =uttons9 5os $otones de exclusin m2tua son similares a los $otones de acti"acin excepto que se a&rupan# de tal forma que slo uno puede estar seleccionadoGpulsado en un momento dado. Esto es $ueno para aquellas situaciones en las que la aplicacin necesita seleccionar un "alor entre una peque=a lista de opciones. 5a creacin de un nue"o $otn de exclusin m2tua se ace con la si&uiente llamada) radioB$utton M &t(.0adioFutton3groupM?one# labelM?one8 Es necesario fijarse en el ar&umento adicional de esta llamada. 5os $otones de exclusin m2tua requieren un &rupo group para funcionar correctamente.5a primera llamada a &t(.0adioFutton38 de$e pasarle ?one en el primer ar&umento y entonces se crear9 un nue"o &rupo de $otones de exclusin m2tua con el nue"o $otn de exclusin m2tua como su 2nico miem$ro. Para a=adir m9s $otones de exclusin m2tua a un &rupo se pasa una referencia a un $otn de exclusin m2tua en group en las llamadas posteriores a &t(.0adioFutton38. 1i se especifica un ar&umento label dic o texto se analizar9 para compro$ar la presencia de caracteres mnemot%cnicos con prefijo NBN. Tam$i%n es $uena idea especificar expl<citamente qu% $otn ser9 el que est% acti"ado por defecto mediante) radioB$utton.setBacti"e3is.acti0e8 Esto se descri$e en la seccin de los $otones $iestado# y funciona exactamente de la misma manera. .na "ez que los $otones de exclusin m2tua se a&rupan# slo uno de los pertenecientes al &rupo puede estar acti"o al mismo tiempo. 1i el usuario ace clic en un $otn de exclusin m2tua# y lue&o en otro# el primer $otn de exclusin m2tua emitir9 una se=al Eto&&ledE 3para informar de que "a a estar inacti"o8# y lue&o el se&undo $otn emitir9 su se=al Eto&&ledE 3para informar de que "a a estar acti"o8. El pro&rama de ejemplo radiobuttons.py crea un &rupo de $otones de exclusin m2tua con tres $otones. 5a fi&ura 7i&ura I.C# VEjemplo de Fotones de Exclusin 42tuaW ilustra la "entana resultante) #igura >.2. E)e"plo de =otones de Exclusin '?tua

T e source code for t e example pro&ram is) 1 2 ; C J I R S QPGusrG$inGen" pyt on Q ejemplo radio$uttons.py import py&t( py&t(.require3N2.0N8 import &t(

D class 0adioFuttons) 10 def call$ac(3self# 'id&et# dataM?one8) 11 print E`s 'as to&&led `sE ` 3data# 3E/77E# E/?E8^'id&et.&etBacti"e38_8 12 1; def closeBapplication3self# 'id&et# e"ent# dataM?one8) 1C &t(.mainBquit38 1J return &t(.7-51E 1I 1R def BBinitBB3self8) 1S self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 1D 20 self.'indo'.connect3EdeleteBe"entE# self.closeBapplication8 21 22 self.'indo'.setBtitle3Eradio $uttonsE8 2; self.'indo'.setB$orderB'idt 308 2C 2J $ox1 M &t(.TFox3&t(.7-51E# 08 2I self.'indo'.add3$ox18 2R $ox1.s o'38 2S 2D $ox2 M &t(.TFox3&t(.7-51E# 108 ;0 $ox2.setB$orderB'idt 3108 ;1 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 ;2 $ox2.s o'38 ;; ;C $utton M &t(.0adioFutton3?one# Eradio $utton1E8 ;J $utton.connect3Eto&&ledE# self.call$ac(# Eradio $utton 1E8 ;I $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 ;R $utton.s o'38 ;S ;D $utton M &t(.0adioFutton3$utton# Eradio $utton2E8 C0 $utton.connect3Eto&&ledE# self.call$ac(# Eradio $utton 2E8 C1 $utton.setBacti"e3&t(.T0.E8 C2 $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 C; $utton.s o'38 CC CJ $utton M &t(.0adioFutton3$utton# Eradio $utton;E8 CI $utton.connect3Eto&&ledE# self.call$ac(# Eradio $utton ;E8 CR $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 CS $utton.s o'38 CD J0 separator M &t(.+1eparator38 J1 $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# 08 J2 separator.s o'38 J; JC $ox2 M &t(.TFox3&t(.7-51E# 108 JJ $ox2.setB$orderB'idt 3108 JI $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.T0.E# 08

JR $ox2.s o'38 JS JD $utton M &t(.Futton3EcloseE8 I0 $utton.connectBo$ject3Eclic(edE# self.closeBapplication# self.'indo'# I1 ?one8 I2 $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 I; $utton.setBfla&s3&t(.A-?B@E7-.5T8 IC $utton.&ra$Bdefault38 IJ $utton.s o'38 II self.'indo'.s o'38 IR IS def main38) ID &t(.main38 R0 return 0 R1 R2 if BBnameBB MM EBBmainBBE) R; 0adioFuttons38 RC main38 El cdi&o es $astante simple de se&uir. 5as lineas I;UIC acen que el $otn EcloseE sea el control por defecto# de manera que# al pulsar la tecla EEnterE cuando la "entana est9 acti"a# el $otn EcloseE emitir9 la se=al Eclic(edE. Captulo @. 3)ustes Tabla de contenidos R.1. Areacin de un -juste R.2. .tilizacin de -justes de la 7orma 79cil R.;. :nterioridades de un -juste GTK tiene "arios controles que pueden ser ajustados "isualmente por el usuario usando el ratn o el teclado# tales como los controles de ran&o# descritos en la seccin Aontroles de 0an&o. Tam$i%n ay unos cuantos controles que "isualizan una parte ajusta$le de un 9rea de datos mayor# tales como el control de texto y el control de "ista. /$"iamente# una aplicacin necesita ser capaz de reaccionar ante los cam$ios que el usuario realiza en los controles de ran&o. .na forma de acer esto ser<a que cada control emitiera su propio tipo de se=al cuando su ajuste cam$iara y# o $ien pasar el nue"o "alor al manejador de se=al# o requerir que se mire dentro de la estructura de datos del control para "er el nue"o "alor. Pero puede que tam$i%n se quiera conectar los ajustes de "arios controles juntos# para que ajustando uno se ajusten los otros. El ejemplo m9s o$"io de esto es conectar una $arra de desplazamiento a una "ista o a un 9rea de texto desplaza$le. 1i cada control tu"iera su propia manera de manipular el "alor del ajuste# entonces el pro&ramador tendr<a que escri$ir sus propios manejadores de se=ales para traducir entre la salida de la se=al de un control y la entrada del m%todo de ajuste de otro control. GTK soluciona este pro$lema mediante el o$jeto -djustment# que no es un control sino una manera de que los controles almacenen y pasen la informacin de ajuste de una forma a$stracta y flexi$le. El uso m9s o$"io de -djustment es almacenar los par9metros de

confi&uracin y los "alores de los controles de ran&o# tales como las $arras de desplazamiento y los controles de escala. 1in em$ar&o# como la clase -djustments deri"a de /$ject# tam$i%n tiene unas caracter<sticas especiales m9s alla de ser estructuras de datos normales. 5a m9s importante es que pueden emitir se=ales# como los controles# y estas se=ales no slo pueden ser usadas para permitir a tus pro&ramas reaccionar a la entrada de usuario en controles ajusta$les# sino que pueden propa&ar "alores de ajuste de una forma transparente entre controles ajusta$les. 1e "er9 como encajan los ajustes en todo el sistema cuando se "ean los controles que los incorporan) Farras de Pro&reso# Tistas# Tentanas de @esplazamiento# y otros. @.1. Creacin de un 3)uste 4uc os de los controles que usan ajustes lo acen autom9ticamente# pero m9s tarde se mostrar9n casos en los que puede ser necesario crearlos. Es posi$le crear un ajuste usando) adjustment page.si4eM08 M &t(.-djustment30alueM0# lo(erM0# upperM0# step.incrM0#

page.incr

El ar&umento value es el "alor inicial que se quiere dar al ajuste# y normalmente corresponde a la posicin superior o la posicin m9s a la izquierda de un control ajusta$le. El ar&umento lower especifica el "alor m9s $ajo que puede tomar el ajuste adjustment. El ar&umento step_incr especifica el incremento m9s peque=o de los dos incrementos por los que el usuario puede cam$iar el "alor# mientras que el ar&umento page_incr es el m9s &rande de los dos. El ar&umento page_size normalmente se corresponde de al&una manera con el 9rea "isi$le de un control desplaza$le. El ar&umento upper se usa para representar la coordenada inferior o la m9s a la derec a de un control incluido en otro control desplaza$le. Por tanto no es siempre el n2mero m9s &rande que el "alor puede tomar# ya que el page_size de tales controles normalmente es distinto de cero. @.!. :tili4acin de 3)ustes de la #or"a #5cil 5os controles ajusta$les pueden di"idirse m9s o menos en aquellos que usan y requieren unidades espec<ficas para estos "alores# y aquellos que los tratan como n2mero ar$itrarios. El &rupo que trata los "alores como n2meros ar$itrarios incluye los controles de ran&o 3$arras de desplazamiento y escalas# la $arra de pro&reso y los $otones de aumentarGdisminuir8. Todos estos controles normalmente se ajustan directamente por el usuario con el ratn o el teclado. Tratar9n los "alores inferior y superior de un ajuste como un ran&o dentro del cual el usuario puede manipular el "alor del ajuste. Por defecto# solo modificar9n el "alor de un ajuste. El otro &rupo incluye el control de texto# el control de "ista# el control de lista compuesta y el control de "entana de desplazamiento. Todos ellos usan "alores de p<xeles para sus ajustes. Estos controles normalmente se ajustan indirectamente usando $arras de desplazamiento. -unque todos los controles que usan ajustes pueden crear sus propios ajustes o usar los que se les proporcione# normalmente se les querr9 dejar la tarea de crear sus propios ajustes. +a$itualmente# so$reescri$ir9n todos los "alores de confi&uracin de los ajustes que se les proporcionen# sal"o el propio "alor de ajuste# aunque los resultados son# en &eneral# impredeci$les. 35o que si&nifica que se tendr9 que leer el cdi&o fuente

para descu$rirlo# y puede "ariar entre controles8. - ora# pro$a$lemente se piense... puesto que los controles de texto y las "istas insisten en esta$lecer todos sus par9metros de confi&uracin excepto el "alor de ajuste mientras que las $arras de desplazamiento solamente tocan el "alor del ajuste# si se comparte un o$jeto ajuste entre una $arra de desplazamiento y un control de texto# al manipular la $arra de desplazamiento# Xse ajustar9 autom9&icamente el control de textoY OPor supuesto que lo ar9P @e la si&uiente manera) Q crea sus propios ajustes "ie'port M &t(.Tie'port38 Q usa los ajustes reci%n creados para la $arra de desplazamiento tam$i%n "scroll$ar M &t(.T1croll$ar3"ie'port.&etB"adjustment388 @./. Interioridades de un 3)uste Fien# se pensar9# eso est9 $ien# pero Xqu% sucede si se desea crear unos manejadores propios que respondan cuando el usuario ajuste un control de ran&o o un $otn aumentarGdisminuir# y cmo se o$tiene el "alor de un ajuste en estos manejadoresY Para contestar a estas pre&untas y a otras m9s# empezaremos ec ando un "istazo a los atri$utos de la propia clase &t(.-djustment) lo'er upper "alue stepBincrement pa&eBincrement pa&eBsize @ada una instancia adj de la clase &t(.-djustment# cada uno de los atri$utos se o$tienen o modifican usando adj.lower# adj.value# etc. [a que# cuando se determina el "alor de un ajuste# &eneralmente tam$i%n se quiere que el cam$io afecte a todos los controles que usan este ajuste# PyGTK proporciona un m%todo para acer esto mismo) adjustment.setB"alue30alue8 Aomo se mencion anteriormente# -djustment es una su$clase de /$ject# al i&ual que los dem9s controles# y# por tanto# es capaz de emitir se=ales. Esto es la causa# claro est9# de por qu% las actualizaciones ocurren autom9&icamente cuando se comparte un o$jeto ajuste entre una $arra de desplazamiento y otro control ajusta$le\ todos los controles ajusta$les conectan manejadores de se=ales a la se=al E"alueBc an&edE de sus ajustes# como podr<a acerlo cualquier pro&rama. Esta es la definicin de la retrollamada de esta se=al) def "alueBc an&ed3adjustment8) 5os di"ersos controles que usan el o$jeto -djustment emitir9n esta se=al en un ajuste siempre que cam$ien su "alor. Esto ocurre tanto cuando el usuario ace que el deslizador

se mue"a en un control de ran&o# como cuando el pro&rama expl<citamente cam$ia el "alor con el m%todo setB"alue38. -s<# por ejemplo# si se tiene un control de escala# y se quiere que cam$ie la rotacin de una ima&en siempre que su "alor cam$ie# se podr<a crear una retrollamada como esta) def c$BrotateBpicture3adj# picture8) setBpictureBrotation 3picture# adj."alue8 ... y conectarla al ajuste del control de escala as<) adj.connect3E"alueBc an&edE# c$BrotateBpicture# picture8 X[ qu% pasa cuando un control reconfi&ura los campos upper 3superior8 o lower 3inferior8 de su ajuste# tal y como sucede cuando un usario a=ade m9s texto al control de textoY En este caso# se emite la se=al Ec an&edE# que es as<) def c an&ed3adjustment8) 5os controles 0an&e normalmente conectan un manejador para esta se=al# el cual cam$ia su apariencia para reflejar el cam$io U por ejemplo# el tama=o del deslizador de una $arra de desplazamiento aumentar9 o se reducir9 en proporcin in"ersa a la diferencia entre el "alor superior e inferior de su ajuste. Pro$a$lemente nunca ser9 necesario que se a&a la conexin de un manejador a esta se=al# sal"o que se est% escri$iendo un nue"o tipo de control de ran&o. En cualquier caso# si se cam$ia directamente al&uno de los "alores de un -djustment# se de$e emitir esta se=al para reconfi&urar los controles que lo usan. Tal que as<) adjustment.emit3Ec an&edE8 Captulo A. Controles de ,ango Tabla de contenidos S.1. Farras de @esplazamiento S.2. Aontroles de Escala S.2.1. Areacin de un Aontrol de Escala S.2.2. 4%todos y 1e=ales 3$ueno# al menos m%todos8 S.;. 4%todos Aomunes de los 0an&os S.;.1. Esta$lecimiento de la Pol<tica de -ctualizacin S.;.2. /$tencin y Aam$io de -justes S.C. -tajos de Teclas y 0atn S.J. Ejemplo de Aontrol de 0an&o 5a cate&or<a de los controles de ran&o incluye el u$<cuo control de $arra de desplazamiento y el menos com2n control de escala. -unque estos dos tipos de controles se usan &eneralmente para propsitos diferentes# son $astante similares en funcin e implementacin. Todos los controles de ran&o comparten un conjunto de elementos &r9ficos# cada uno de los cuales tiene su propia "entana 6 y reci$e e"entos. Todos ellos

contienen una &u<a o canal y un deslizador. -rrastrar el deslizador con el puntero del ratn ace que se mue"a acia adelante y acia atr9s en el canal# mientras que aciendo clic en el canal a"anza el deslizador acia la localizacin del clic# ya sea completamente# o con una cantidad desi&nada# dependiendo del $otn del ratn que se use. Aomo se mencion en -djustments m9s arri$a# todos los controles de ran&o est9n asociados con un o$jeto ajuste# a partir del cual se calcula la lon&itud del deslizador y su posicin con respecto al canal. Auando el usuario manipula el deslizador# el control de ran&o cam$iar9 el "alor del ajuste. A.1. =arras de Bespla4a"iento Estas son las $arras de desplazamiento est9ndar. @e$er<an usarse 2nicamente para desplazar otro control# tal como una lista# una caja de texto# o una "ista 3"ie'port8# aunque# &eneralmente# es m9s f9cil de usar la "entana de desplazamiento en la mayor<a de los casos. Para otros propsitos# se de$er<an usar los controles de escala# ya que son m9s a&rada$les y tienen m9s funciones. Existen tipos separados para las $arras de desplazamiento orizontales y "erticales. ?o ay demasiado que decir so$re ellos. 5os puedes crear con los si&uientes m%todos) scroll$ar M &t(.+1scroll$ar3ad)ust"entM?one8 "scroll$ar M &t(.T1scroll$ar3ad)ust"entM?one8 y eso es todo. El ar&umento adjustment puede ser# o $ien una referencia a un -djustment existente# o $ien nada# en cuyo caso se crear9 uno. Especificar nada puede ser 2til en el caso en el que se quiera pasar el ajuste reci%n creado al constructor de otro control que lo confi&urar9 por uno# tal como podr<a ocurrir con una caja de texto. A.!. Controles de Escala 5os controles 1cale 3Escala8 se usan para permitir al usuario seleccionar y manipular "isualmente un "alor dentro de un ran&o espec<fico. 1e puede usar un control de escala# por ejemplo# para ajustar el ni"el de zoom en una pre"isualizacin de una ima&en# o para controlar el $rillo de un color# o para especificar el n2mero de minutos de inacti"idad antes de que el protector de pantalla se acti"e. A.!.1. Creacin de un Control de Escala -l i&ual que con las $arras de desplazamiento# ay controles separados para los controles de escala orizontales y "erticales. 35a mayor<a de los pro&ramadres parecen usar los controles de escala orizontales.8 [a que esencialmente funcionan de la misma manera# no ay necesidad de tratarlos por separado aqu<. 5os si&uientes m%todos crean controles de escala "erticales y orizontales# respecti"amente) "scale M &t(.T1cale3ad)ust"entM?one8 scale M &t(.+1cale3ad)ust"entM?one8 El ar&umento adjustment puede ser $ien un ajuste que ya aya sido creado con

&t(.-djustment38# o $ien nada# en cuyo caso se crea un -djustment annimo con todos sus "alores puestos a 0.0 3lo cual no es demasiado 2til8. Para e"itar confusiones# pro$a$lemente sea mejor crear un ajuste con un "alor pa&eBsize de 0.0 para que su "alor upper realmente corresponda con el "alor m9s alto que el usuario puede seleccionar. 31i esto resulta confuso# la seccin so$re Ajustes da una explicacin detallada so$re qu% acen exactamente los ajustes y cmo crearlos y manipularlos.8 A.!.!. 'Ctodos y %e+ales 8buenoD al "enos "Ctodos9 5os controles de escala pueden "isualizar su "alor como un n2mero al lado del canal. El comportamiento por defecto es mostrar el "alor# pero esto se puede cam$iar con el m%todo) scale.setBdra'B"alue3dra(.0alue8 Aomo a$r9s ima&inado# draw_value 3representar "alor8 es o T0.E o 7-51E# con consecuencias predeci$les para cualquiera de los dos. El "alor que muestra un control de escala se redondea a un "alor decimal por defecto# tal y como se ace con el campo "alor en su -djustment 3-juste8. 1e puede cam$iar esto con) scale.setBdi&its3digits8 donde digits 3d<&itos8 es el n2mero de posiciones decimales que se representar9n. 1e puede poner el n2mero que se desee# pero no se representar9n en pantalla m9s de 1; d<&itos decimales. 7inalmente# el "alor se puede mostrar en diferentes posiciones relati"as al canal) scale.setB"alueBpos3pos8 El ar&umento pos 3posicin8 puede tomar uno de los si&uientes "alores) P/1B5E7T P/1B0:G+T P/1BT/P P/1BF/TT/4 1i pones el "alor en un EladoE del canal 3por ejemplo# en la parte de arri$a o de a$ajo de un control de escala orizontal8# entonces se&uir9 al deslizador en su desplazamiento acia arri$a y acia a$ajo del canal. A./. 'Ctodos Co"unes de los ,angos 5a clase 0an&e es $astante complicada internamente# pero# como todas las clases $ase de los controles# la mayor<a de su complejidad solo resulta de inter%s si se quiere trastear con ellos. -dem9s# la mayor<a de los m%todos y se=ales que define slo son 2tiles al escri$ir controles deri"ados. +ay# en cualquier caso# unos cuantos m%todos 2tiles que funcionar9n con todos los controles de ran&o.

A./.1. Estableci"iento de la Poltica de 3ctuali4acin 5a Epol<tica de actualizacinE de un control de ran&o define en qu% puntos de la interaccin con el usuario se cam$iar9 el campo de "alor de su -djustment y emitir9 la se=al E"alueBc an&edE en este -djustment. 5as pol<ticas de actualizacin son) .P@-TEBA/?T:?. Es es el "alor predeterminado. 5a se=al E"alueBc an&edE se emite /.1 cont<nuamente# por ejemplo# cada "ez que el deslizador se mue"e# incluso en las cantidades mas min2sculas. .P@-TEB@:1A/?T 5a se=al E"alueBc an&edE slo se mite una "ez que el deslizador :?./.1 parado de mo"erse y el usuario a soltado el $otn del ratn. a

.P@-TEB@E5-[E@ 5a se=al E"alueBc an&edE se emite cuando el usuario suelta el $otn del ratn# o si el deslizador deja de mo"erse durante un corto per<odo de tiempo. 5a pol<tica de actualizacin de un control de ran&o puede cam$iarse con este m%todo) ran&e.setBupdateBpolicy3policy8 A./.!. Ebtencin y Ca"bio de 3)ustes 5a o$tencin y cam$io del ajuste de un control de ran&o se puede acer so$re la marc a# como era predeci$le# con) adjustment M ran&e.&etBadjustment38 ran&e.setBadjustment3ad)ust"ent8 El m%todo &etBadjustment38 de"uel"e una referencia al adjustment que est9 conectado al ran&o. El m%todo setBadjustment38 no ace a$solutamente nada si se le pasa el adjustment que el range ya est% utilizando# independientemente de que se le ayan cam$iado al&uno de sus campos o no. 1i se le pasa un nue"o -djustment# se perder9 la referencia al anti&uo si exist<a 3posi$lemente se destruir98# se conectar9n las se=ales apropiadas al nue"o# y se recalcular9 el tama=o yGo posicin del deslizador y se repintar9 si es necesario. Aomo se mencion en la seccin de ajustes# si se desea reutilizar el mismo -djustment# cuando se modifiquen sus "alores directamente se de$e emitir la se=al Ec an&edE desde %l# como por ejemplo) adjustment.emit3Ec an&edE8 A.2. 3ta)os de Teclas y ,atn Todos los controles de ran&o de GTK reaccionan a clics de ratn m9s o menos de la misma forma. +aciendo clic con el $otnU1 en el canal ace que el "alor page_increment del ajuste se a=ada o se reste a su value# y que el deslizador se mue"a de forma acorde. +aciendo clic con el $otnU2 en el canal ar9 que el deslizador salte al punto donde se a ec o clic.

+aciendo clic con cualquier $otn en las flec as de una $arra de desplazamiento se ar9 que el "alor value de su ajuste cam$ie de una "ez tanto como di&a su propiedad step_increment. 5as $arras de desplazamiento no pueden reci$ir el foco# por lo que no tienen atajos de teclado. 5os atajos de teclado de otros controles de ran&o 3que por supuesto slo est9n ati"os cuando el control tiene el foco8 no se diferencian entre controles de ran&o orizontales y "erticales. Todos los controles de ran&o pueden manejarse con las teclas de flec a izquierda# flec a derec a# flec a arri$a y flec a a$ajo # as< como con las teclas P5gina 3nterior y P5gina %iguiente. 5as flec as mue"en el deslizador en cantidades i&uales a step_increment# mientras que P5gina 3nterior y P5gina %iguiente lo mue"en en cantidades de page_increment. El usuario tam$i%n puede mo"er el deslizador directamente a un extremo u otro del canal usando el teclado. Esto se ace con las teclas Inicio y #in A.;. E)e"plo de Control de ,ango El pro&rama de ejemplo 3range(idgets.py8 muestra una "entana con tres controles de ran&o todos conectados al mismo ajuste# y un par de controles para modificar al&unos de los par9metros mencionados m9s arri$a y en la seccin de ajustes# por lo que se puede "er cmo afectan a la manera en la que estos controles se comportan para el usuario. 5a fi&ura 7i&ura S.1# VEjemplo de Aontroles de 0an&oW muestra el resultado de ejecutar el pro&rama) #igura A.1. E)e"plo de Controles de ,ango

El cdi&o fuente de range(idgets.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D QPGusrG$inGen" pyt on Q ejemplo ran&e'id&ets.py import py&t( py&t(.require3N2.0N8 import &t( Q 7unciones auxiliares def ma(eBmenuBitem3name# call$ac(# dataM?one8) item M &t(.4enu:tem3name8 item.connect3Eacti"ateE# call$ac(# data8 item.s o'38 return item def scaleBsetBdefaultB"alues3scale8) scale.setBupdateBpolicy3&t(..P@-TEBA/?T:?./.18 scale.setBdi&its318

20 scale.setB"alueBpos3&t(.P/1BT/P8 21 scale.setBdra'B"alue3&t(.T0.E8 22 2; class 0an&e>id&ets) 2C def c$BposBmenuBselect3self# item# pos8) 2J Q 7ijar la posicin del "alor para am$os ajustes 2I self. scale.setB"alueBpos3pos8 2R self."scale.setB"alueBpos3pos8 2S 2D def c$BupdateBmenuBselect3self# item# policy8) ;0 Q Esta$lecer la pol<tica de actualizacin para am$os controles ;1 self. scale.setBupdateBpolicy3policy8 ;2 self."scale.setBupdateBpolicy3policy8 ;; ;C def c$Bdi&itsBscale3self# adj8) ;J Q 7ijar el n2mero de posiciones decimales a las que se ajusta el "alor ;I self. scale.setBdi&its3adj."alue8 ;R self."scale.setBdi&its3adj."alue8 ;S ;D def c$Bpa&eBsize3self# &et# set8) C0 Q 7ijar el "alor del tama=o de p9&ina y de su incremento C1 Q para el ajuste al "alor especificado por la escala EPa&e 1izeE C2 set.pa&eBsize M &et."alue C; set.pa&eBincr M &et."alue CC Q - ora emitir la se=al Ec an&edE para reconfi&urar todos los controles CJ Q que est9n li&ados a este ajuste CI set.emit3Ec an&edE8 CR CS def c$Bdra'B"alue3self# $utton8) CD Q -cti"ar o desacti"ar la representacin del "alor en funcin del J0 Q estado del $otn de acti"acin J1 self. scale.setBdra'B"alue3$utton.&etBacti"e388 J2 self."scale.setBdra'B"alue3$utton.&etBacti"e388 J; JC Q crea la "entana de ejemplo JJ JI def BBinitBB3self8) JR Q Areacin de la "entana principal JS self.'indo' M &t(.>indo' 3&t(.>:?@/>BT/P5ETE58 JD self.'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 I0 self.'indo'.setBtitle3Eran&e controlsE8 I1 I2 $ox1 M &t(.TFox3&t(.7-51E# 08 I; self.'indo'.add3$ox18 IC $ox1.s o'38 IJ II $ox2 M &t(.+Fox3&t(.7-51E# 108 IR $ox2.setB$orderB'idt 3108

IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J

$ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 Q "alue# lo'er# upper# stepBincrement# pa&eBincrement# pa&eBsize Q /$s%r"ese que el "alor pa&eBsize solamente es si&nificati"o Q para controles de $arra de desplazamiento y que el "alor m9s alto posi$le es Q 3upper U pa&eBsize8. adj1 M &t(.-djustment30.0# 0.0# 101.0# 0.1# 1.0# 1.08 self."scale M &t(.T1cale3adj18 scaleBsetBdefaultB"alues3self."scale8 $ox2.pac(Bstart3self."scale# &t(.T0.E# &t(.T0.E# 08 self."scale.s o'38 $ox; M &t(.TFox3&t(.7-51E# 108 $ox2.pac(Bstart3$ox;# &t(.T0.E# &t(.T0.E# 08 $ox;.s o'38 Q 0eutilizamos el mismo ajuste self. scale M &t(.+1cale3adj18 self. scale.setBsizeBrequest3200# ;08 scaleBsetBdefaultB"alues3self. scale8 $ox;.pac(Bstart3self. scale# &t(.T0.E# &t(.T0.E# 08 self. scale.s o'38 Q 0eutilizamos el mismo ajuste otra "ez scroll$ar M &t(.+1croll$ar3adj18 Q /$s%r"ese como esto ace que las escalas se actualicen Q continuamente cuando se mue"e la $arra de desplazamiento scroll$ar.setBupdateBpolicy3&t(..P@-TEBA/?T:?./.18 $ox;.pac(Bstart3scroll$ar# &t(.T0.E# &t(.T0.E# 08 scroll$ar.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 Q .n $otn de acti"acin para definir se se muestra el "alor o no $utton M &t(.A ec(Futton3E@isplay "alue on scale 'id&etsE8 $utton.setBacti"e3&t(.T0.E8 $utton.connect3Eto&&ledE# self.c$Bdra'B"alue8 $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 $utton.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108

11I 11R 11S 11D 120 121 122 12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2 1C; 1CC 1CJ 1CI 1CR 1CS 1CD 1J0 1J1 1J2 1J; 1JC 1JJ 1JI 1JR 1JS 1JD 1I0 1I1 1I2 1I;

Q .n men2 de opciones para cam$iar la posicin del "alor la$el M &t(.5a$el3E1cale Talue Position)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 opt M &t(./ption4enu38 menu M &t(.4enu38 item M ma(eBmenuBitem 3ETopE# self.c$BposBmenuBselect# &t(.P/1BT/P8 menu.append3item8 item M ma(eBmenuBitem 3EFottomE# self.c$BposBmenuBselect# &t(.P/1BF/TT/48 menu.append3item8 item M ma(eBmenuBitem 3E5eftE# self.c$BposBmenuBselect# &t(.P/1B5E7T8 menu.append3item8 item M ma(eBmenuBitem 3E0i& tE# self.c$BposBmenuBselect# &t(.P/1B0:G+T8 menu.append3item8 opt.setBmenu3menu8 $ox2.pac(Bstart3opt# &t(.T0.E# &t(.T0.E# 08 opt.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 Q /tro men2 de opciones m9s# esta "ez para la pol<tica de actualizacin Q de los controles de escala la$el M &t(.5a$el3E1cale .pdate Policy)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 opt M &t(./ption4enu38 menu M &t(.4enu38 item M ma(eBmenuBitem3EAontinuousE# self.c$BupdateBmenuBselect# &t(..P@-TEBA/?T:?./.18 menu.append3item8 item M ma(eBmenuBitem 3E@iscontinuousE# self.c$BupdateBmenuBselect# &t(..P@-TEB@:1A/?T:?./.18 menu.append3item8

1IC 1IJ 1II 1IR 1IS 1ID 1R0 1R1 1R2 1R; 1RC 1RJ 1RI 1RR 1RS 1RD 1S0 1S1 1S2 1S; 1SC 1SJ 1SI 1SR 1SS 1SD 1D0 1D1 1D2 1D; 1DC 1DJ 1DI 1DR 1DS 1DD 200 201 202 20; 20C 20J 20I 20R 20S 20D 210 211

item M ma(eBmenuBitem 3E@elayedE# self.c$BupdateBmenuBselect# &t(..P@-TEB@E5-[E@8 menu.append3item8 opt.setBmenu3menu8 $ox2.pac(Bstart3opt# &t(.T0.E# &t(.T0.E# 08 opt.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 Q .n control +1cale para ajustar el n2mero de d<&itos en las escalas Q de ejemplo la$el M &t(.5a$el3E1cale @i&its)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 adj2 M &t(.-djustment31.0# 0.0# J.0# 1.0# 1.0# 0.08 adj2.connect3E"alueBc an&edE# self.c$Bdi&itsBscale8 scale M &t(.+1cale3adj28 scale.setBdi&its308 $ox2.pac(Bstart3scale# &t(.T0.E# &t(.T0.E# 08 scale.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 Q [ un 2ltimo control +1cale para ajustar el tama=o de p9&ina Q de la $arra de desplazamiento. la$el M &t(.5a$el3E1croll$ar Pa&e 1ize)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 adj2 M &t(.-djustment31.0# 1.0# 101.0# 1.0# 1.0# 0.08 adj2.connect3E"alueBc an&edE# self.c$Bpa&eBsize# adj18 scale M &t(.+1cale3adj28 scale.setBdi&its308 $ox2.pac(Bstart3scale# &t(.T0.E# &t(.T0.E# 08 scale.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38

212 21; separator M &t(.+1eparator38 21C $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# 08 21J separator.s o'38 21I 21R $ox2 M &t(.TFox3&t(.7-51E# 108 21S $ox2.setB$orderB'idt 3108 21D $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.T0.E# 08 220 $ox2.s o'38 221 222 $utton M &t(.Futton3EHuitE8 22; $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 22C $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 22J $utton.setBfla&s3&t(.A-?B@E7-.5T8 22I $utton.&ra$Bdefault38 22R $utton.s o'38 22S self.'indo'.s o'38 22D 2;0 def main38) 2;1 &t(.main38 2;2 return 0 2;; 2;C if BBnameBB MM EBBmainBBE) 2;J 0an&e>id&ets38 2;I main38 1e de$e ad"ertir que el pro&rama no llama al m%todo connect38 para el e"ento EdeleteBe"entE# sino solamente a la se=al EdestroyE. Esto se&uir9 realizando la accin deseada# puesto que un e"ento EdeleteBe"entE sin tratar resultar9 en una se=al EdestroyE en"iada a la "entana. A.;. E)e"plo de Control de ,ango El pro&rama de ejemplo 3range(idgets.py8 muestra una "entana con tres controles de ran&o todos conectados al mismo ajuste# y un par de controles para modificar al&unos de los par9metros mencionados m9s arri$a y en la seccin de ajustes# por lo que se puede "er cmo afectan a la manera en la que estos controles se comportan para el usuario. 5a fi&ura 7i&ura S.1# VEjemplo de Aontroles de 0an&oW muestra el resultado de ejecutar el pro&rama) #igura A.1. E)e"plo de Controles de ,ango

El cdi&o fuente de range(idgets.py es) 1 QPGusrG$inGen" pyt on 2 ; Q ejemplo ran&e'id&ets.py C

J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2

import py&t( py&t(.require3N2.0N8 import &t( Q 7unciones auxiliares def ma(eBmenuBitem3name# call$ac(# dataM?one8) item M &t(.4enu:tem3name8 item.connect3Eacti"ateE# call$ac(# data8 item.s o'38 return item def scaleBsetBdefaultB"alues3scale8) scale.setBupdateBpolicy3&t(..P@-TEBA/?T:?./.18 scale.setBdi&its318 scale.setB"alueBpos3&t(.P/1BT/P8 scale.setBdra'B"alue3&t(.T0.E8 class 0an&e>id&ets) def c$BposBmenuBselect3self# item# pos8) Q 7ijar la posicin del "alor para am$os ajustes self. scale.setB"alueBpos3pos8 self."scale.setB"alueBpos3pos8 def c$BupdateBmenuBselect3self# item# policy8) Q Esta$lecer la pol<tica de actualizacin para am$os controles self. scale.setBupdateBpolicy3policy8 self."scale.setBupdateBpolicy3policy8 def c$Bdi&itsBscale3self# adj8) Q 7ijar el n2mero de posiciones decimales a las que se ajusta el "alor self. scale.setBdi&its3adj."alue8 self."scale.setBdi&its3adj."alue8 def c$Bpa&eBsize3self# &et# set8) Q 7ijar el "alor del tama=o de p9&ina y de su incremento Q para el ajuste al "alor especificado por la escala EPa&e 1izeE set.pa&eBsize M &et."alue set.pa&eBincr M &et."alue Q - ora emitir la se=al Ec an&edE para reconfi&urar todos los controles Q que est9n li&ados a este ajuste set.emit3Ec an&edE8 def c$Bdra'B"alue3self# $utton8) Q -cti"ar o desacti"ar la representacin del "alor en funcin del Q estado del $otn de acti"acin self. scale.setBdra'B"alue3$utton.&etBacti"e388 self."scale.setBdra'B"alue3$utton.&etBacti"e388

J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100

Q crea la "entana de ejemplo def BBinitBB3self8) Q Areacin de la "entana principal self.'indo' M &t(.>indo' 3&t(.>:?@/>BT/P5ETE58 self.'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 self.'indo'.setBtitle3Eran&e controlsE8 $ox1 M &t(.TFox3&t(.7-51E# 08 self.'indo'.add3$ox18 $ox1.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 Q "alue# lo'er# upper# stepBincrement# pa&eBincrement# pa&eBsize Q /$s%r"ese que el "alor pa&eBsize solamente es si&nificati"o Q para controles de $arra de desplazamiento y que el "alor m9s alto posi$le es Q 3upper U pa&eBsize8. adj1 M &t(.-djustment30.0# 0.0# 101.0# 0.1# 1.0# 1.08 self."scale M &t(.T1cale3adj18 scaleBsetBdefaultB"alues3self."scale8 $ox2.pac(Bstart3self."scale# &t(.T0.E# &t(.T0.E# 08 self."scale.s o'38 $ox; M &t(.TFox3&t(.7-51E# 108 $ox2.pac(Bstart3$ox;# &t(.T0.E# &t(.T0.E# 08 $ox;.s o'38 Q 0eutilizamos el mismo ajuste self. scale M &t(.+1cale3adj18 self. scale.setBsizeBrequest3200# ;08 scaleBsetBdefaultB"alues3self. scale8 $ox;.pac(Bstart3self. scale# &t(.T0.E# &t(.T0.E# 08 self. scale.s o'38 Q 0eutilizamos el mismo ajuste otra "ez scroll$ar M &t(.+1croll$ar3adj18 Q /$s%r"ese como esto ace que las escalas se actualicen Q continuamente cuando se mue"e la $arra de desplazamiento scroll$ar.setBupdateBpolicy3&t(..P@-TEBA/?T:?./.18 $ox;.pac(Bstart3scroll$ar# &t(.T0.E# &t(.T0.E# 08 scroll$ar.s o'38

101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122 12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2 1C; 1CC 1CJ 1CI 1CR 1CS

$ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 Q .n $otn de acti"acin para definir se se muestra el "alor o no $utton M &t(.A ec(Futton3E@isplay "alue on scale 'id&etsE8 $utton.setBacti"e3&t(.T0.E8 $utton.connect3Eto&&ledE# self.c$Bdra'B"alue8 $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 $utton.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 Q .n men2 de opciones para cam$iar la posicin del "alor la$el M &t(.5a$el3E1cale Talue Position)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 opt M &t(./ption4enu38 menu M &t(.4enu38 item M ma(eBmenuBitem 3ETopE# self.c$BposBmenuBselect# &t(.P/1BT/P8 menu.append3item8 item M ma(eBmenuBitem 3EFottomE# self.c$BposBmenuBselect# &t(.P/1BF/TT/48 menu.append3item8 item M ma(eBmenuBitem 3E5eftE# self.c$BposBmenuBselect# &t(.P/1B5E7T8 menu.append3item8 item M ma(eBmenuBitem 3E0i& tE# self.c$BposBmenuBselect# &t(.P/1B0:G+T8 menu.append3item8 opt.setBmenu3menu8 $ox2.pac(Bstart3opt# &t(.T0.E# &t(.T0.E# 08 opt.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 Q /tro men2 de opciones m9s# esta "ez para la pol<tica de actualizacin Q de los controles de escala

1CD 1J0 1J1 1J2 1J; 1JC 1JJ 1JI 1JR 1JS 1JD 1I0 1I1 1I2 1I; 1IC 1IJ 1II 1IR 1IS 1ID 1R0 1R1 1R2 1R; 1RC 1RJ 1RI 1RR 1RS 1RD 1S0 1S1 1S2 1S; 1SC 1SJ 1SI 1SR 1SS 1SD 1D0 1D1 1D2 1D; 1DC 1DJ 1DI

la$el M &t(.5a$el3E1cale .pdate Policy)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 opt M &t(./ption4enu38 menu M &t(.4enu38 item M ma(eBmenuBitem3EAontinuousE# self.c$BupdateBmenuBselect# &t(..P@-TEBA/?T:?./.18 menu.append3item8 item M ma(eBmenuBitem 3E@iscontinuousE# self.c$BupdateBmenuBselect# &t(..P@-TEB@:1A/?T:?./.18 menu.append3item8 item M ma(eBmenuBitem 3E@elayedE# self.c$BupdateBmenuBselect# &t(..P@-TEB@E5-[E@8 menu.append3item8 opt.setBmenu3menu8 $ox2.pac(Bstart3opt# &t(.T0.E# &t(.T0.E# 08 opt.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 Q .n control +1cale para ajustar el n2mero de d<&itos en las escalas Q de ejemplo la$el M &t(.5a$el3E1cale @i&its)E8 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 la$el.s o'38 adj2 M &t(.-djustment31.0# 0.0# J.0# 1.0# 1.0# 0.08 adj2.connect3E"alueBc an&edE# self.c$Bdi&itsBscale8 scale M &t(.+1cale3adj28 scale.setBdi&its308 $ox2.pac(Bstart3scale# &t(.T0.E# &t(.T0.E# 08 scale.s o'38 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 $ox2.s o'38 $ox2 M &t(.+Fox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108

1DR Q [ un 2ltimo control +1cale para ajustar el tama=o de p9&ina 1DS Q de la $arra de desplazamiento. 1DD la$el M &t(.5a$el3E1croll$ar Pa&e 1ize)E8 200 $ox2.pac(Bstart3la$el# &t(.7-51E# &t(.7-51E# 08 201 la$el.s o'38 202 20; adj2 M &t(.-djustment31.0# 1.0# 101.0# 1.0# 1.0# 0.08 20C adj2.connect3E"alueBc an&edE# self.c$Bpa&eBsize# adj18 20J scale M &t(.+1cale3adj28 20I scale.setBdi&its308 20R $ox2.pac(Bstart3scale# &t(.T0.E# &t(.T0.E# 08 20S scale.s o'38 20D 210 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 211 $ox2.s o'38 212 21; separator M &t(.+1eparator38 21C $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# 08 21J separator.s o'38 21I 21R $ox2 M &t(.TFox3&t(.7-51E# 108 21S $ox2.setB$orderB'idt 3108 21D $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.T0.E# 08 220 $ox2.s o'38 221 222 $utton M &t(.Futton3EHuitE8 22; $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 22C $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 22J $utton.setBfla&s3&t(.A-?B@E7-.5T8 22I $utton.&ra$Bdefault38 22R $utton.s o'38 22S self.'indo'.s o'38 22D 2;0 def main38) 2;1 &t(.main38 2;2 return 0 2;; 2;C if BBnameBB MM EBBmainBBE) 2;J 0an&e>id&ets38 2;I main38 1e de$e ad"ertir que el pro&rama no llama al m%todo connect38 para el e"ento EdeleteBe"entE# sino solamente a la se=al EdestroyE. Esto se&uir9 realizando la accin deseada# puesto que un e"ento EdeleteBe"entE sin tratar resultar9 en una se=al EdestroyE en"iada a la "entana.

F.!. #lechas 83rro(9 El control -rro' 37lec a8 di$uja la ca$eza de una flec a# apuntando a un n2mero de direcciones posi$les y con un n2mero de estilos posi$les. Puede ser muy 2til en un $otn en muc as aplicaciones. -l i&ual que el control 5a$el 3Etiqueta8# tampoco emite nin&una se=al. 1lo ay dos llamadas para manipular un control -rro' ) arro' M &t(.-rro'3arro(.type# shado(.type8 arro'.set3arro(.type# shado(.type8 5a primera crea un control flec a con el tipo y apariencia indicados. 5a se&unda permite cam$iar cualquiera de estos "alores. El ar&umento arrow_type puede tomar uno de lo si&uientes "alores) -00/>B.P Q3-rri$a8 -00/>B@/>? Q3-$ajo8 -00/>B5E7T Q3:zquierda8 -00/>B0:G+T Q3@erec a8 Estos "alores o$"iamente indican la direccin acia la que apunta la flec a. El ar&umento g(ey'ordLs ado'BtypegG(ey'ordL puede tomar uno de los si&uientes "alores) 1+-@/>B:? 1+-@/>B/.T Q "alor predeterminado 1+-@/>BETA+E@B:? 1+-@/>BETA+E@B/.T El pro&rama de ejemplo arro(.py ilustra $re"emente su uso. 5a fi&ura 7i&ura D.2# VEjemplos de Fotones con 7lec asW muestra el resultado de ejecutar el pro&rama) #igura F.!. E)e"plos de =otones con #lechas

El cdi&o fuente del pro&rama arro(.py es) 1 2 ; C J I R S D 10 11 12 QPGusrG$inGen" pyt on Q example arro'.py import py&t( py&t(.require3N2.0N8 import &t( Q Area un control de 7lec a con los par9metros especificados Q y lo empaqueta en un $otn def createBarro'B$utton3arro'Btype# s ado'Btype8) $utton M &t(.Futton38\

1; arro' M &t(.-rro'3arro'Btype# s ado'Btype8\ 1C $utton.add3arro'8 1J $utton.s o'38 1I arro'.s o'38 1R return $utton 1S 1D class -rro's) 20 def BBinitBB3self8) 21 Q Areamos una "entana nue"a 22 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 2; 2C 'indo'.setBtitle3E-rro' FuttonsE8 2J 2I Q Es $uena idea acer esto con todas las "entanas 2R 'indo'.connect3EdestroyE# lam$da x) &t(.mainBquit388 2S 2D Q Esta$lecer el anc o del $orde de "entana ;0 'indo'.setB$orderB'idt 3108 ;1 ;2 Q Areamos una caja para poner las flec asG$otones ;; $ox M &t(.+Fox3&t(.7-51E# 08 ;C $ox.setB$orderB'idt 328 ;J 'indo'.add3$ox8 ;I ;R Q Empaquetar y mostrar todos los controles ;S $ox.s o'38 ;D C0 $utton M createBarro'B$utton3&t(.-00/>B.P# &t(.1+-@/>B:?8 C1 $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 C2 C; $utton M createBarro'B$utton3&t(.-00/>B@/>?# &t(.1+-@/>B/.T8 CC $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 CJ CI $utton M createBarro'B$utton3&t(.-00/>B5E7T# &t(.1+-@/>BETA+E@B:?8 CR $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 CS CD $utton M createBarro'B$utton3&t(.-00/>B0:G+T# &t(.1+-@/>BETA+E@B/.T8 J0 $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 J1 J2 'indo'.s o'38 J; JC def main38) JJ &t(.main38 JI return 0 JR JS if BBnameBB MM EBBmainBBE) JD -rro's38

I0

main38

F./. El Eb)eto Pistas 8Tooltip9 5as Tooltips 3Pistas8 son peque=as cadenas de texto que aparecen cuando se deja el cursor so$re un $otn u otro control durante unos se&undos. 5os controles que no reci$en e"entos 3controles que no tienen su propia "entana8 no funcionar9n con las pistas. 5a primera llamada que se usar9 crea una nue"a pista. 1lo es necesario acer esto una "ez ya que el o$jeto que de"uel"e &t(.Tooltips puede usarse para crear m2ltiples pistas. tooltips M &t(.Tooltips38 .na "ez que se a creado una nue"a pista# y el control que se quiere que la use est9 preparado# simplemente se utiliza esta llamada para asociarlos) tooltips.setBtip3(idget# tip.text# tip.pri0ateM?one8 El o$jeto tooltips es la pista que se aca$a de crear. El primer ar&umento 3 widget8 es el control que se quiere que muestre la pista\ el se&undo ar&umento 3 tip_text8# el texto que se quiere "isualizar. El 2ltimo ar&umento 3tip_private8 es una cadena de texto que puede usarse como identificador. El pro&rama de ejemplo tooltip.py modifica el pro&rama arro(.py para a=adir una pista a cada $otn. 5a fi&ura 7i&ura D.;# VEjemplo de PistasW ilustra la "entana resultante con la pista del se&undo $otn flec a acti"ada) #igura F./. E)e"plo de Pistas

El cdi&o fuente del pro&rama tooltip.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I QPGusrG$inGen" pyt on Q ejemplo tooltip.py import py&t( py&t(.require3N2.0N8 import &t( Q Arear una 7lec a con los par9metros especificados Q y empaquetarlo en un $otn def createBarro'B$utton3arro'Btype# s ado'Btype8) $utton M &t(.Futton38 arro' M &t(.-rro'3arro'Btype# s ado'Btype8 $utton.add3arro'8 $utton.s o'38 arro'.s o'38

1R return $utton 1S 1D class Tooltips) 20 def BBinitBB3self8) 21 Q Areamos una "entana nue"a 22 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 2; 2C 'indo'.setBtitle3ETooltipsE8 2J 2I Q :tNs a &ood idea to do t is for all 'indo's. 2R 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 2S 2D Q Esta$lece el &rosor del $orde de la "entana ;0 'indo'.setB$orderB'idt 3108 ;1 ;2 Q Areamos una caja para poner las flec asG$otones ;; $ox M &t(.+Fox3&t(.7-51E# 08 ;C $ox.setB$orderB'idt 328 ;J 'indo'.add3$ox8 ;I ;R Q creamos un o$jeto de pista ;S self.tooltips M &t(.Tooltips38 ;D C0 Q Empaquetamos y mostramos todos los controles C1 $ox.s o'38 C2 C; $utton M createBarro'B$utton3&t(.-00/>B.P# &t(.1+-@/>B:?8 CC $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 CJ self.tooltips.setBtip3$utton# E1+-@/>B:?E8 CI CR $utton M createBarro'B$utton3&t(.-00/>B@/>?# &t(.1+-@/>B/.T8 CS $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 CD self.tooltips.setBtip3$utton# E1+-@/>B/.TE8 J0 J1 $utton M createBarro'B$utton3&t(.-00/>B5E7T# &t(.1+-@/>BETA+E@B:?8 J2 $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 J; self.tooltips.setBtip3$utton# E1+-@/>BETA+E@B:?E8 JC JJ $utton M createBarro'B$utton3&t(.-00/>B0:G+T# &t(.1+-@/>BETA+E@B/.T8 JI $ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# ;8 JR self.tooltips.setBtip3$utton# E1+-@/>BETA+E@B/.TE8 JS JD 'indo'.s o'38 I0 I1 def main38) I2 &t(.main38 I; return 0 IC

IJ if BBnameBB MM EBBmainBBE) II tt M Tooltips38 IR main38 +ay otros m%todos que se pueden usar con las pistas. 1implemente los listaremos# junto con una $re"e descripcin so$re su funcin. tooltips.ena$le38 -cti"a un conjunto de pistas desacti"adas. tooltips.disa$le38 @esacti"a un conjunto de pistas acti"adas. tooltips.setBdelay3delay8 7ija los milise&undos que de$en transcurrir con el puntero so$re el control antes de que la pista aparezca. El "alor predefinido es de J00 milise&undos 3medio se&undo8. [ esos son todos los m%todos asociados con las pistas. 49s de lo que siempre se querr<a sa$er )U8 .2. =arras de Progreso 8Progress=ar9 5as $arras de pro&reso se usan para mostrar el estado de una operacin. 1on $astante f9ciles de usar# como se "er9 en el cdi&o que si&ue. Pero primero empecemos con una llamada para crear una nue"a $arra de pro&reso. pro&ress$ar M &t(.Pro&ressFar3ad)ust"entM?one8 El ar&umento adjustment 3ajuste8 especifica un ajuste para usarlo con la $arra de pro&reso progressbar. 1i no se especifica se crear9 un ajuste. - ora que la $arra de pro&reso est9 creada ya podemos usarla. pro&ress$ar.setBfraction3-raction8 El o$jeto progressbar es la $arra de pro&reso con la que queremos operar# y el ar&umento 3fraction8 es la cantidad EcompletadaE# lo que si&nifica la cantidad con la que se a rellenado la $arra de pro&reso desde 0 a 100`. Esto se le pasa al m%todo como un n2mero real entre 0 y 1. .na $arra de pro&reso puede orientarse de di"ersas formas usando el m%todo) pro&ress$ar.setBorientation3orientation8 El ar&umento orientation puede tomar uno de los si&uientes "alores para indicar la direccin en la que la $arra de pro&reso se mue"e) P0/G0E11B5E7TBT/B0:G+T Q izquierda a derec a P0/G0E11B0:G+TBT/B5E7T Q derec a a izquierda P0/G0E11BF/TT/4BT/BT/P Q a$ajo a arri$a

P0/G0E11BT/PBT/BF/TT/4 Q arri$a a a$ajo -dem9s de indicar la cantidad de pro&reso que se a completado# la $arra de pro&reso tam$i%n puede usarse simplemente para indicar que a a$ido al&una acti"idad. Esto puede ser 2til en situaciones donde el pro&reso no se puede medir con un ran&o de "alores. 5a si&uiente funcin indica que se a ec o al&2n pro&reso. pro&ress$ar.pulse38 El tama=o de paso de un indicador de acti"idad se esta$lece usando la si&uiente funcin# donde la fraccin es un n2mero entre 0.0 y 1.0. pro&ress$ar.setBpulseBstep3-raction8 Auando no est9 en el modo acti"idad# la $arra de pro&reso tam$i%n puede mostrar una cadena de texto en su canal# usando el si&uiente m%todo) pro&ress$ar.setBtext3text8 ota T%n&ase en cuenta que setBtext38 no soporta el formateo de texto al estilo printf38 como lo ac<a la $arra de pro&reso de GTK! 1.2. 1e puede desacti"ar la "isualizacin de la cadena llamando a setBtext38 de nue"o sin ar&umentos. 5a cadena de texto actual de la $arra de pro&reso se puede o$tener con el si&uiente m%todo) text M pro&ress$ar.&etBtext38 ?ormalmente las Farras de Pro&reso usan cronmetros u otras funciones parecidas 3mira la seccin so$re Aronmetros# EG1 y 7unciones de :nacti"idad8 para dar la ilusin de multitarea. Todas usar9n los m%todos setBfraction38 o pulse38 de la misma forma. El pro&rama progressbar.py proporciona un ejemplo de $arra de pro&reso# actualizada usando cronmetros. Este cdi&o tam$i%n muestra como reiniciar la Farra de Pro&reso. 5a fi&ura 7i&ura D.C# VEjemplo de Farra de Pro&resoW muestra la "entana resultante) #igura F.2. E)e"plo de =arra de Progreso

El cdi&o fuente del pro&rama progressbar.py es) 1 2 ; C J I QPGusrG$inGen" pyt on Q ejemplo pro&ress$ar.py import py&t( py&t(.require3N2.0N8

R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC

import &t( Q -ctualizar el "alor de la $arra de pro&reso de manera Q que ten&amos al&o de mo"imiento def pro&ressBtimeout3p$o$j8) if p$o$j.acti"ityBc ec(.&etBacti"e38) p$o$j.p$ar.pulse38 else) Q Aalcular el "alor de la $arra de pro&reso usando el Q "alor del ran&o esta$lecido en el o$jeto ajuste ne'B"al M p$o$j.p$ar.&etBfraction38 ! 0.01 if ne'B"al L 1.0) ne'B"al M 0.0 Q 7ijar el nue"o "alor p$o$j.p$ar.setBfraction3ne'B"al8 Q Puesto que esta es una funcin de cronmetro# de"ol"er T0.E de manera Q que contin2e siendo llamada return &t(.T0.E class Pro&ressFar) Q 0etrollamada que conmuta el di$ujado del texto en el Q canal de la $arra de pro&reso def to&&leBs o'Btext3self# 'id&et# dataM?one8) if 'id&et.&etBacti"e38) self.p$ar.setBtext3Esome textE8 else) self.p$ar.setBtext3EE8 Q 0etrollamada que conmuta el modo de acti"idad de Q la $arra de pro&reso def to&&leBacti"ityBmode3self# 'id&et# dataM?one8) if 'id&et.&etBacti"e38) self.p$ar.pulse38 else) self.p$ar.setBfraction30.08 Q 0etrollamada que conmuta la orientacin de la $arra de pro&reso def to&&leBorientation3self# 'id&et# dataM?one8) if self.p$ar.&etBorientation38 MM &t(.P0/G0E11B5E7TBT/B0:G+T) self.p$ar.setBorientation3&t(.P0/G0E11B0:G+TBT/B5E7T8 elif self.p$ar.&etBorientation38 MM &t(.P0/G0E11B0:G+TBT/B5E7T) self.p$ar.setBorientation3&t(.P0/G0E11B5E7TBT/B0:G+T8 Q 5impiamos la memoria reser"ada y eliminamos el temporizador def destroyBpro&ress3self# 'id&et# dataM?one8) &t(.timeoutBremo"e3self.timer8 self.timer M 0

JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102

&t(.mainBquit38 def BBinitBB3self8) self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 self.'indo'.setBresiza$le3&t(.T0.E8 self.'indo'.connect3EdestroyE# self.destroyBpro&ress8 self.'indo'.setBtitle3EPro&ressFarE8 self.'indo'.setB$orderB'idt 308 "$ox M &t(.TFox3&t(.7-51E# J8 "$ox.setB$orderB'idt 3108 self.'indo'.add3"$ox8 "$ox.s o'38 Q Areamos un o$jeto de alineacin centrador ali&n M &t(.-li&nment30.J# 0.J# 0# 08 "$ox.pac(Bstart3ali&n# &t(.7-51E# &t(.7-51E# J8 ali&n.s o'38 Q Areamos la $arra de pro&reso self.p$ar M &t(.Pro&ressFar38 ali&n.add3self.p$ar8 self.p$ar.s o'38 Q -=adimos una retrollamada temporizada para actualizar el "alor de la $arra self.timer M &t(.timeoutBadd 3100# pro&ressBtimeout# self8 separator M &t(.+1eparator38 "$ox.pac(Bstart3separator# &t(.7-51E# &t(.7-51E# 08 separator.s o'38 Q filas# columnas# omo&%neas ta$le M &t(.Ta$le32# 2# &t(.7-51E8 "$ox.pac(Bstart3ta$le# &t(.7-51E# &t(.T0.E# 08 ta$le.s o'38 Q -=adir un $otn de acti"acin para mostrar o no el texto del canal c ec( M &t(.A ec(Futton3E1 o' textE8 ta$le.attac 3c ec(# 0# 1# 0# 1# &t(.E6P-?@ b &t(.7:55# &t(.E6P-?@ b &t(.7:55# J# J8 c ec(.connect3Eclic(edE# self.to&&leBs o'Btext8 c ec(.s o'38 Q -=adir un $otn de acti"acin para conmutar el modo de acti"idad self.acti"ityBc ec( M c ec( M &t(.A ec(Futton3E-cti"ity modeE8

10; ta$le.attac 3c ec(# 0# 1# 1# 2# 10C &t(.E6P-?@ b &t(.7:55# &t(.E6P-?@ b &t(.7:55# 10J J# J8 10I c ec(.connect3Eclic(edE# self.to&&leBacti"ityBmode8 10R c ec(.s o'38 10S 10D Q -=adir un $otn de acti"acin para conmutar de orientacin 110 c ec( M &t(.A ec(Futton3E0i& t to 5eftE8 111 ta$le.attac 3c ec(# 0# 1# 2# ;# 112 &t(.E6P-?@ b &t(.7:55# &t(.E6P-?@ b &t(.7:55# 11; J# J8 11C c ec(.connect3Eclic(edE# self.to&&leBorientation8 11J c ec(.s o'38 11I 11R Q -=adir un $otn para salir del pro&rama 11S $utton M &t(.Futton3EcloseE8 11D $utton.connect3Eclic(edE# self.destroyBpro&ress8 120 "$ox.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# 08 121 122 Q Esto lo ace el $otn por defecto 12; $utton.setBfla&s3&t(.A-?B@E7-.5T8 12C 12J Q Esto ace que el $otn tome el foco por defecto. Pulsando simplemente 12I Q la tecla EEnterE se producir9 la acti"acin de este $otn. 12R $utton.&ra$Bdefault 38 12S $utton.s o'38 12D 1;0 self.'indo'.s o'38 1;1 1;2 def main38) 1;; &t(.main38 1;C return 0 1;J 1;I if BBnameBB MM EBBmainBBE) 1;R Pro&ressFar38 1;S main38 F.;. Bi5logos El control @ialo& 3@i9lo&o8 es muy simple# y realmente es slo una "entana con unas cuantas cosas ya empaquetadas. 1implemente crea una "entana# y lue&o empaqueta una TFox en ella# que contiene un separador y lue&o una +Fox llamada EactionBareaE 3E9rea de accinE8. El control @ialo& 3@i9lo&o8 se puede usar para mensajes emer&entes para el usuario# y otras tareas similares. Es realmente $9sico# y slo ay una funcin para la caja de di9lo&o# que es)

dialo& M &t(.@ialo&3titleM?one# parentM?one# -lagsM0# buttonsM?one8 donde title 3t<tulo8 es el texto usado en la $arra de t<tulo# parent 3padre8 es la "entana principal de la aplicacin y flags esta$lece "arios modos de operacin para el di9lo&o) @:-5/GB4/@-5 U ace el di9lo&o modal @:-5/GB@E1T0/[B>:T+BP-0E?T U destruye el di9lo&o cuando su padre sea destruido @:-5/GB?/B1EP-0-T/0 U omite el separador entre la "$ox y el 9rea de accin El ar&umento buttons 3$otones8 es una tupla de pares texto de $otn y respuesta. Todos los ar&umentos tienen "alores predeterminados y pueden especificarse usando pala$ras cla"e. Esto crear9 la caja de di9lo&o# y a ora depende del desarrollador el usarla. 1e podr<a empaquetar un $otn en el 9rea de accin) $utton M ... dialo&.actionBarea.pac(Bstart3$utton# T0.E# T0.E# 08 $utton.s o'38 [ se podr<a a=adir# por ejemplo# una etiqueta# al 9rea vbox usando el empaquetamiento# con al&o as<) la$el M &t(.5a$el3E5os di9lo&os molanE8 dialo&."$ox.pac(Bstart3la$el# T0.E# T0.E# 08 la$el.s o'38 Aomo ejemplo del uso de una caja de di9lo&o# se podr<an poner dos $otones en el 9rea de accin# un $otn de Aancelar# un $otn de -ceptar y una etiqueta en el 9rea vbox# aciendo una pre&unta al usuario# informando de un error# etc. 5ue&o se podr<an conectar diferentes se=ales a cada $otn y realizar la operacin que el usuario seleccione. 1i la funcionalidad $9sica que proporcionan las cajas "erticales y orizontales predeterminadas no dan el suficiente control para la aplicacin# entonces se puede sencillamente empaquetar otro control dentro de las cajas proporcionadas. Por ejemplo# se podr<a empaquetar una ta$la en la caja "ertical. F.>. I"5genes 5as :ma&es 3:m9&enes8 son estructuras de datos que contienen di$ujos. Estos di$ujos se pueden usar en "arios sitios. 5as :ma&es 3:m9&enes8 se pueden crear a partir de Pix$ufs# Pixmaps# arc i"os que conten&an informacin de ima&en 3por ejemplo. 6P4# P?G# *PEG# T:77# etc.8# e incluso fic eros de animacin. 5as :ma&es 3:m9&enes8 se crean usando la funcin) ima&e M &t(.:ma&e38 @espu%s se car&a la ima&en usando al&uno de los si&uientes m%todos) ima&e.setBfromBpix$uf3pixbu-8

ima&e.setBfromBpixmap3pix"ap# "ask8 ima&e.setBfromBima&e3i"age8 ima&e.setBfromBfile3-ilena"e8 ima&e.setBfromBstoc(8stock.id# si4e8 ima&e.setBfromBiconBset3icon.set# si4e8 ima&e.setBfromBanimation3ani"ation8 @onde pixbuf es un Gd(Pix$uf\ pixmap y mask son &t(.&d(.Pixmaps\ image es una &t(.&d(.:ma&e\ stock_id es el nom$re de un &t(.1toc(:tem\ icon_set es un &t(.:con1et\ y# animation es una &t(.&d(.Pix$uf-nimation. el ar&umento size 3tama=o8 es uno de) :A/?B1:fEB4E?. :A/?B1:fEB14-55BT//5F-0 :A/?B1:fEB5-0GEBT//5F-0 :A/?B1:fEBF.TT/? :A/?B1:fEB@?@ :A/?B1:fEB@:-5/G 5a forma m9s f9cil de crear una ima&en es usar el m%todo setBfromBfile38 que autom9ticamente determina el tipo de ima&en y la car&a. El pro&rama i"ages.py muestra cmo car&ar "arios tipos de ima&en 3&oalie.&if# appleU red.pn&# c aos.jp&# important.tif# soccer$all.&if8 en im9&enes que se colocan dentro de $otones) #igura F.;. E)e"plo de I"5genes en =otones

El cdi&o fuente es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D QPGusrG$inGen" pyt on Q ejemplo ima&es.py import py&t( py&t(.require3N2.0N8 import &t( class :ma&esExample) Q cuando se in"oca 3con la se=al deleteBe"ent8# finaliza la aplicacin def closeBapplication3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E Q se in"oca cuando el $otn es pulsado. 1implemente imprime un mensaje. def $uttonBclic(ed3self# 'id&et# dataM?one8) print E$utton `s clic(edE ` data def BBinitBB3self8)

20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR

Q crea la "entana principal y conecta la se=al deleteBe"ent si&nal para finalizar Q la aplicacin 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.connect3EdeleteBe"entE# self.closeBapplication8 'indo'.setB$orderB'idt 3108 'indo'.s o'38 Q una caja orizontal que conten&a los $otones $ox M &t(.+Fox38 $ox.s o'38 'indo'.add3 $ox8 pix$ufanim M &t(.&d(.Pix$uf-nimation3E&oalie.&ifE8 ima&e M &t(.:ma&e38 ima&e.setBfromBanimation3pix$ufanim8 ima&e.s o'38 Q un $otn que conten&a el control de ima&en $utton M &t(.Futton38 $utton.add3ima&e8 $utton.s o'38 $ox.pac(Bstart3$utton8 $utton.connect3Eclic(edE# self.$uttonBclic(ed# E1E8 Q crear "arias im9&enes con datos de arc i"os y car&arlos Q en $otones ima&e M &t(.:ma&e38 ima&e.setBfromBfile3EappleUred.pn&E8 ima&e.s o'38 Q un $otn que coten&a el control de ima&en $utton M &t(.Futton38 $utton.add3ima&e8 $utton.s o'38 $ox.pac(Bstart3$utton8 $utton.connect3Eclic(edE# self.$uttonBclic(ed# E2E8 ima&e M &t(.:ma&e38 ima&e.setBfromBfile3Ec aos.jp&E8 ima&e.s o'38 Q un $otn que coten&a el control de ima&en $utton M &t(.Futton38 $utton.add3ima&e8 $utton.s o'38 $ox.pac(Bstart3$utton8 $utton.connect3Eclic(edE# self.$uttonBclic(ed# E;E8 ima&e M &t(.:ma&e38 ima&e.setBfromBfile3Eimportant.tifE8 ima&e.s o'38

IS Q un $otn que coten&a el control de ima&en ID $utton M &t(.Futton38 R0 $utton.add3ima&e8 R1 $utton.s o'38 R2 $ox.pac(Bstart3$utton8 R; $utton.connect3Eclic(edE# self.$uttonBclic(ed# ECE8 RC RJ ima&e M &t(.:ma&e38 RI ima&e.setBfromBfile3Esoccer$all.&ifE8 RR ima&e.s o'38 RS Q un $otn que coten&a el control de ima&en RD $utton M &t(.Futton38 S0 $utton.add3ima&e8 S1 $utton.s o'38 S2 $ox.pac(Bstart3$utton8 S; $utton.connect3Eclic(edE# self.$uttonBclic(ed# EJE8 SC SJ SI def main38) SR &t(.main38 SS return 0 SD D0 if BBnameBB MM EBBmainBBE) D1 :ma&esExample38 D2 main38 F.>.1. Pix"aps 5os Pixmaps son estructuras de datos que contienen di$ujos. Estos di$ujos se pueden usar en "arios sitios# pero lo m9s com2n es usarlos como iconos en un escritorio 6# o como cursores. .n pixmap con slo 2 colores se llama $itmap# y ay unas cuantas rutinas adicionales para tra$ajar con este caso especial. Para entender los pixmaps# es de ayuda entender cmo funciona el sistema 6 >indo'. En 6# las aplicaciones no necesitan ejecutarse en el mismo ordenador que interactua con el usuario. En cam$io# estas aplicaciones# llamadas EclientesE# se comunican con un pro&rama que muestra los &r9ficos y maneja el teclado y el ratn. Este pro&rama que interactua directamente con el usuario se llama un Eser"idor de "isualizacinE o Eser"idor 6E. [a que la comunicacin puede tener lu&ar so$re una red# es importante mantener al&una informacin en el ser"idor 6. 5os Pixmaps# por ejemplo# se almacenan en la memoria del ser"idor 6. Esto si&nifica que# una "ez que los "alores de un pixmap se esta$lecen# no ay que se&uir transmitiendolos por la red\ en lu&ar de eso# se en"<a un comando para Emostrar el pixmap n2mero 6[f aqui.E :ncluso si no se est9 usando 6 con GTK simult9neamente# usando construcciones como Pixmaps ar9 que los pro&ramas funcionen de forma acepta$le en 6. Para usar pixmaps en PyGTK# primero de$emos construir un &t(.&d(.Pixmap usando las

funciones de &t(.&d( en PyGTK. 5os Pixmaps se pueden crear a partir de datos en memoria# o a partir de datos le<dos desde un fic ero. Teamos cada una de las llamadas usadas para crear un pixmap. pixmap M &t(.&d(.pixmapBcreateBfromBdata3(indo(# data# (idth# height# depth# -g# bg8 Esta rutina se usa para crear un pixmap con la profundidad de color dada por el ar&umento depth a partir de los datos data en memoria. 1i depth es U1 su "alor se deduce de la de la "entana window. Aada pixel usa un n2mero de $its de datos para representar el color que es i&ual a la profundidad de color. El width3anc o8 y el height 3alto8 son en pixeles. El ar&umento window 3"entana8 de$e referirse a una &t(.&d(.>indo' realizada# ya que los recursos de un pixmap slo tienen sentido en el contexto de la pantalla donde se "a a "isualizar. fg y bg son los colores de frente y fondo del pixmap. 1e pueden crear pixmaps desde fic eros 6P4 usando) pixmap# -ilena"e8 mas( M &t(.&d(.pixmapBcreateBfromBxpm3 (indo(# transparent.color#

El formato 6P4 es una representacin le&i$le de pixmap para el 1istema de Tentanas 6. Es usado ampliamente y ay muc as utilidades disponi$les para crear fic eros de im9&enes en este formato. En la funcin pixmapBcreateBfromBxpm38 el primer ar&umento es del tipo &t(.&d(.>indo' . 35a mayor<a de los controles GTK tienen una &t(.&d(.>indo' su$yacente que se puede o$tener usando el atri$uto 'indo' 3"entana8 del control.8 El fic ero se especifica con filename y de$e contener una ima&en en formato 6P4 el cual se car&a en la estructura del pixmap. 5a mask 3m9scara8 es un $itmap que especifica qu% $its del pixmap son opacos\ se crea con la funcin. Todos los dem9s pixeles se colorean con el color especificado por transparent_color. .n ejemplo del uso de esta funcin se reco&e a continuacin. 5os Pixmaps tam$i%n puede crearse a partir de datos en memoria usando la funcin) pixmap# mas( M &t(.&d(.pixmapBcreateBfromBxpmBd3 (indo(# transparent.color# data8 :ma&enes peque=as se pueden incorporar a un pro&rama como datos en el formato 6P4 usando la funcin anterior. .n pixmap se crea usando estos datos# en lu&ar de leerlo de un fic ero. .n ejemplo de este tipo de datos es) xpmBdata M ^ E1I 1I ; 1E# E c ?oneE# E. c Q000000000000E# E6 c Q777777777777E# E E# E ...... E# E .666.6. E# E .666.66. E# E .666.666. E# E .666..... E# E .6666666. E#

E E E E E E E E E _

.6666666. .6666666. .6666666. .6666666. .6666666. .6666666. ......... E# E# E

E# E# E# E# E# E#

5a 2ltima forma para crear un pixmap en $lanco disponi$le para operaciones de di$ujo es) pixmap M &t(.&d(.Pixmap3(indo(# (idth# height# depthMU18 window es o una &t(.&d(.>indo' o ?one. 1i window es una &t(.&d(.>indo' entonces depth puede ser U1 para indicar que la profundidad de color se o$tiene de la "entana. 1i window es ?one entonces depth de$e especificarse. El pro&rama pix"ap.py es un ejemplo del uso de un pixmap en un $otn. 5a fi&ura Figura 9.6, Ejemp o !e Pixmap en un Botn muestra el resultado) #igura F.>. E)e"plo de Pix"ap en un =otn

El cdi&o fuente es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 QPGusrG$inGen" pyt on Q ejemplo pixmap.py import py&t( py&t(.require3N2.0N8 import &t( Q 6P4 data of /penU7ile icon xpmBdata M ^ E1I 1I ; 1E# E c ?oneE# E. c Q000000000000E# E6 c Q777777777777E# E E# E ...... E# E .666.6. E# E .666.66. E# E .666.666. E# E .666..... E# E .6666666. E# E .6666666. E#

2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0

E E E E E E E E _

.6666666. .6666666. .6666666. .6666666. .6666666. ......... E# E# E

E# E# E# E# E#

class PixmapExample) Q cuando se in"oca 3con la se=al deleteBe"ent8# finaliza la aplicacin. def closeBapplication3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E Q se in"oca al pulsar el $otn. 1implemente imprime un mensaje def $uttonBclic(ed3self# 'id&et# dataM?one8) print E$utton clic(edE def BBinitBB3self8) Q crea la "entana principal y conecta la se=al deleteBe"ent para finalizar Q la aplicacin 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.connect3EdeleteBe"entE# self.closeBapplication8 'indo'.setB$orderB'idt 3108 'indo'.s o'38 Q a ora el pixmap desde datos 6P4 pixmap# mas( M &t(.&d(.pixmapBcreateBfromBxpmBd3'indo'.'indo'# ?one# xpmBdata8 Q un control de ima&en que conten&a el pixmap ima&e M &t(.:ma&e38 ima&e.setBfromBpixmap3pixmap# mas(8 ima&e.s o'38 Q un $otn que conten&a el control de ima&en $utton M &t(.Futton38 $utton.add3ima&e8 'indo'.add3$utton8 $utton.s o'38 $utton.connect3Eclic(edE# self.$uttonBclic(ed8 def main38) &t(.main38

R1 return 0 R2 R; if BBnameBB MM EBBmainBBE) RC PixmapExample38 RJ main38 .na des"entaja de usar pixmaps es que que el o$jeto mostrado siempre es rectan&ular# independientemente de la ima&en. ?os &ustar<a crear escritorios y aplicaciones con iconos que ten&an formas m9s naturales. Por ejemplo# para la interfaz de un jue&o# nos &ustar<a tener $otones redondos para pulsar. 5a forma de acer esto es usar "entanas con forma. .na "entana con forma es simplemente un pixmap en el que los pixeles de fondo son transparentes. @e esta forma# cuando la ima&en de fondo se colorea# no la so$reescri$imos con un $orde rectan&ular y que no encaja# de nuestro icono. El pro&rama de ejemplo (heelbarro(.p muestra una ima&en completa en el escritorio. 5a fi&ura Figura 9.", Ejemp o !e #entana con Forma muestra la ima&en so$re una "entana de terminal) #igura F.@. E)e"plo de $entana con #or"a

T e source code for (heelbarro(.py is) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I QPGusrG$inGen" pyt on Q ejemplo ' eel$arro'.py import py&t( py&t(.require3N2.0N8 import &t( Q 6P4 > eel$arro'7ullBxpm M ^ ECS CS IC 1E# E c ?oneE# E. c Q@7R@A7;AAR1FE# E6 c QDIJSRJ@IID-IE# Eo c QR1AIR1AIR1AIE# E/ c Q-IDD-2SD-IDDE# E! c QDIJSD2CSDIJSE# E, c QSE;SC10;;0A2E# EQ c Q@RJAR@7RID-IE# EK c Q7R@EA7;AAR1FE# E` c QDIJSS-2SSE;SE# Eh c Q-IDDD2CSDERDE# EZ c QSE;SSI1RSE;SE# EM c Q10C00S200S20E# EU c QJDIJ10C010C0E# E\ c QAR1F;0A2;0A2E#

2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC

E) EL E# Eg E1 E2 E; EC EJ EI ER ES ED E0 Eq E' Ee Er Et Ey Eu Ei Ep Ea Es Ed Ef E& E Ej E( El Ez Ex Ec E" E$ En Em E4 E? EF ET EA Ef EE1 E@

c QAR1FD-IDDIJSE# c QI1SJI1SJI1SJE# c Q20S11AR120S1E# c Q10C000000000E# c QSI1R20S120S1E# c Q@7R@C@;CC10;E# c QRDERID-IR1AIE# c QSI1RS20RSI1RE# c QC10;;A7;C10;E# c Q000000000000E# c QCD2C1AR110C0E# c QCD2CCJ1CCD2CE# c Q0S200S200S20E# c QID-I1SI11SI1E# c QFI@-R1AIJ1CCE# c QC10;;0A2;SE;E# c QA7;AF-E-FI@-E# c QR1AICJ1C;0A2E# c QE7FE@FIA@RJAE# c Q2S-20S200S20E# c Q1SI110C010C0E# c QJDIJ2S-21SI1E# c QR1AII1SJJDIJE# c Q-IDDDIJSDIJSE# c Q;0A22S-2;0A2E# c QFE7F-2SD-EF-E# c QJDIJCJ1CJ1CCE# c Q;0A2;0A2;0A2E# c QSE;SS20RSI1RE# c Q20S11SI120S1E# c Q;SE;0A;00S20E# c Q;0A220S12S-2E# c Q;SE;2S-2;SE;E# c QJ1CC;SE;CD2CE# c QI1SJJJJJJDIJE# c Q;0A220S1;0A2E# c Q;SE;2S-2;0A2E# c Q2S-22S-22S-2E# c QC10;2AF22S-2E# c Q10C010C010C0E# c QCD2C;SE;C10;E# c Q2S-220S12S-2E# c Q-IDDJDIJ;SE;E# c Q;0A21AR110C0E# c Q;0A21SI110C0E# c QDIJSIJDJJDIJE# c QI1SJ;C@;20S1E# c Q;SE;1AR110C0E#

RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122

E7 c Q0S2000000S20E# E E# E .6o/ E# E !,QK`oh E# E ZMU\Q))o! E# E L#g12Q);C E# E CJIR1Q)6; E# E !SDg02q'o E# EeZ L#IR\ro E# EtyL CJD,L!hh E# EK2u! LgipasSZ E# E`K\MZ Z;).6a.df&L E# E/ K\ya Z;d.aSj#6e.d;&S! E# E / K\(a Z;dKaSlz##xxc).e;&JC E# E / K\(/ ZpdK`s"$zz#sxxxxf6..h'nL E# E / K,m/ Z;dt 'lsslszjzxxxxxxx;)tdS4C E# E / K,&h Z;dK6?l"""lllm#m?'xxxxxxxfa.)#FZ E# E / K,#/d.czlllllzlmmqT,TQT,fxxxxxxxf)`jJh E# E / K1 dJlllslllAAfrTQrQ)Q2-xxxxxxxxxcd'4Z E# E /6qIc.`S"""llffiqq-p-)mq)6xcpcxxxxxfdcDZ E# E 2rgI&de;$llffrTiR1,1TRR-))q-pxxxxxxfdc4 E# E )#qUI4?.dfmffrr11)Qriir@1-6,-fJxxxxxfe"oE# E !-2Ij&u6t-fffARi@iAArTTiiRAmmmxxxxxx`;&E# E ZQ1Ijsz?..;@ffffrAT1-2rfrTR@mm'xxxxhenE# E p2y7"zss6e)fAffAii@Riif@i@11f''xxSeZLE# E /-1gjzx''c)Kd`?@ffffAAAfAAffAmxxfd.F E# E ;20IF'xxszx`et.ea-pRRmRRmmmf;heee&Z E# E ,2I4"zx?z"l$'fpdettttttttttt.c#nh E# E Z\1IMls?''?'&s"sl$''"ccc;pcfugo E# E p\gIDF"''sszslll$FlllllllugJ! E# E /10yI7Fl"""z"zss#uMFllljMJC E# E c1UIDDFl"llllluR(DI444&C E# E Z10ySnI7j"llllFg1IIIIS E# E 1U(&!LIIIg4gDDIUyIngSZ E# E pR1MC mIDDDI(@SfUIIIDShh E# E hi0ycmInC o&(1R#0gIIII& E# E ?U(UgL LM01U(uuIIIL E# E #I(yh hCIU10ul#II# E# E /u0gL oIIygul'gIIh E# E Z((J LIIFyRMxuIIC E# E gg4C CIIljg4xuIIo E# E ZLL !IIu"#z?IIIZ E# E JII#xxjIID E# E CIII77IIIL E# E LDIIIII4 E# E o4IIIS! E# E ZC E# E E#

12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2 1C; 1CC 1CJ 1CI 1CR 1CS 1CD 1J0 1J1 1J2 1J; 1JC 1JJ 1JI 1JR 1JS 1JD 1I0 1I1 1I2 1I; 1IC 1IJ 1II 1IR 1IS 1ID

E _

class > eel$arro'Example) Q Auando se in"oca 3con la se=al deleteBe"ent8# finaliza la aplicacin def closeBapplication3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def BBinitBB3self8) Q Area la "entana principal y conecta la se=al deleteBe"ent para finalizar Q la aplicacin. /$s%r"ese que la "entana principal no tendr9 t<tulo Q ya que "amos a acer una "entana emer&ente 3popup8. 'indo' M &t(.>indo'3&t(.>:?@/>BP/P.P8 'indo'.connect3EdeleteBe"entE# self.closeBapplication8 'indo'.setBe"ents3'indo'.&etBe"ents38 b &t(.&d(.F.TT/?BP0E11B4-1K8 'indo'.connect3E$uttonBpressBe"entE# self.closeBapplication8 'indo'.s o'38 Q a ora para el pixmap y el control de ima&en pixmap# mas( M &t(.&d(.pixmapBcreateBfromBxpmBd3 'indo'.'indo'# ?one# > eel$arro'7ullBxpm8 ima&e M &t(.:ma&e38 ima&e.setBfromBpixmap3pixmap# mas(8 ima&e.s o'38 Q Para mostrar la ima&en usamos un control fijo para situarla fixed M &t(.7ixed38 fixed.setBsizeBrequest3200# 2008 fixed.put3ima&e# 0# 08 'indo'.add3fixed8 fixed.s o'38 Q Esto enmascara todo sal"o la ima&en misma 'indo'.s apeBcom$ineBmas(3mas(# 0# 08 Q mostramos la "entana 'indo'.setBposition3&t(.>:?BP/1BAE?TE0B-5>-[18 'indo'.s o'38 def main38) &t(.main38 return 0 if BBnameBB MM EBBmainBBE) > eel$arro'Example38 main38

Para acer la ima&en sensi$le# conectamos la se=al E$uttonBpressBe"entE para que el pro&rama finalice. 5as lineas 1;SU1;D acen el di$ujo sensi$le a una pulsacin de un $otn del ratn y lo conectan al m%todo closeBapplication38 . F.@. ,eglas 5os controles 0uler 30e&la8 se usan para indicar la posicin del puntero del ratn en una "entana determinada. .na "entana puede tener una re&la "ertical a lo lar&o del anc o y una re&la orizontal a lo lar&o del alto. .n peque=o tri9n&ulo indicador en la re&la muestra la posicin exacta del puntero respecto a la re&la. -ntes de nada es necesario crear una re&la. 5as re&las orizontales y "erticales se crean usando las si&uientes funciones) ruler M &t(.+0uler38 "ruler M &t(.T0uler38 Q re&la orizontal Q re&la "ertical

.na "ez que se crea una re&la podemos definir la unidad de medida. 5as unidades de medida para las re&las pueden ser P:6E51 3p<xeles8# :?A+E1 3pul&adas8 o AE?T:4ETE01 3cent<metros8. Esto se fija con el m%todo) ruler.setBmetric3"etric8 5a medida predeterminada es P:6E51. ruler.setBmetric3&t(.P:6E518 /tra caracter<stica importante de una re&la es cmo marca las unidades de escala y donde se coloca el indicador de posicin inicialmente. Esto se fija usando el m%todo) ruler.setBran&e3lo(er# upper# position# max_size8 5os ar&umentos lower 3$ajo8 y upper 3alto8 definen la extensin de la re&la# y max_size 3tama=o m9ximo8 es el mayor n2mero posi$le que se "isualizar9. 5a Position 3Posicin8 define la posicin inicial del indicador del puntero dentro de la re&la. .na re&la "ertical puede medir una "entana de S00 p<xeles de anc o as<) "ruler.setBran&e30# S00# 0# S008 5as marcas mostradas en la re&la ir9n desde 0 a S00# con un n2mero cada 100 p<xeles. 1i en lu&ar de eso quisieramos una re&la de R a 1I# escri$ir<amos) "ruler.setBran&e3R# 1I# 0# 208 El indicador de la re&la es una peque=a marca trian&ular que indica la posicin del puntero relati"a a la re&la. 1i la re&la se usa para se&uir el puntero del ratn# la se=al EmotionBnotifyBe"entE de$e conectarse al m%todo EmotionBnotifyBe"entE de la re&la. +ay que confi&urar una retrollamada para EmotionBnotifyBe"entE para el 9rea y usar connectBo$ject38 para que la re&la emita una se=al EmotionBnotifyBsi&nalE)

def motionBnotify3ruler# e"ent8) return ruler.emit3EmotionBnotifyBe"entE# e"ent8 area.connectBo$ject3EmotionBnotifyBe"entE# motionBnotify# ruler8 El pro&rama de ejemplo rulers.py crea un 9rea de di$ujo con una re&la orizontal en la parte de arri$a y una re&la "ertical a su izquierda. El tama=o del 9rea de di$ujo es de I00 p<xeles de anc o por C00 p<xeles de alto. 5a re&la orizontal "a desde R asta 1; con una marca cada 100 p<xeles# mientras que la re&la "ertical "a de 0 a C00 con una marca cada 100 p<xeles. 5a colocacin del 9rea de di$ujo y las re&las se ace con una ta$la. 5a fi&ura 7i&ura D.S# VEjemplo de 0e&lasW ilustra el resultado) #igura F.A. E)e"plo de ,eglas

El cdi&o fuente es rulers.py) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 QPGusrG$inGen" pyt on Q ejemplo rulers.py import py&t( py&t(.require3N2.0N8 import &t( class 0ulersExample) 61:fE M C00 [1:fE M C00 Q Esta rutina toma el control cuando se pulsa el $otn de cerrar def closeBapplication3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.connect3EdeleteBe"entE# self.closeBapplication8 'indo'.setB$orderB'idt 3108 Q Area una ta$la para colocar la re&la y el 9rea de di$ujo ta$le M &t(.Ta$le3;# 2# &t(.7-51E8 'indo'.add3ta$le8 area M &t(.@ra'in&-rea38 area.setBsizeBrequest3self.61:fE# self.[1:fE8 ta$le.attac 3area# 1# 2# 1# 2# &t(.E6P-?@b&t(.7:55# &t(.7:55# 0# 0 8 area.setBe"ents3&t(.&d(.P/:?TE0B4/T:/?B4-1K b

;2 &t(.&d(.P/:?TE0B4/T:/?B+:?TB4-1K 8 ;; ;C Q 5a re&la orizontal est9 arri$a. Auando el ratn se mue"e por el ;J Q 9rea de di$ujo se pasa un e"ento motionBnotifyBe"ent al manejador ;I Q adecuado para la re&la ;R rule M &t(.+0uler38 ;S rule.setBmetric3&t(.P:6E518 ;D rule.setBran&e3R# 1;# 0# 208 C0 def motionBnotify3ruler# e"ent8) C1 return ruler.emit3EmotionBnotifyBe"entE# e"ent8 C2 area.connectBo$ject3EmotionBnotifyBe"entE# motionBnotify# rule8 C; ta$le.attac 3 rule# 1# 2# 0# 1# CC &t(.E6P-?@b&t(.1+0:?Kb&t(.7:55# &t(.7:55# 0# 0 8 CJ CI Q 5a re&la "ertical est9 a la izquierda. Auando el ratn se mue"e por el CR Q 9rea de di$ujo se pasa un e"ento motionBnotifyBe"ent al manejador CS Q adecuado para la re&la CD "rule M &t(.T0uler38 J0 "rule.setBmetric3&t(.P:6E518 J1 "rule.setBran&e30# self.[1:fE# 10# self.[1:fE8 J2 area.connectBo$ject3EmotionBnotifyBe"entE# motionBnotify# "rule8 J; ta$le.attac 3"rule# 0# 1# 1# 2# JC &t(.7:55# &t(.E6P-?@b&t(.1+0:?Kb&t(.7:55# 0# 0 8 JJ JI Q - ora mostramos todo JR area.s o'38 JS rule.s o'38 JD "rule.s o'38 I0 ta$le.s o'38 I1 'indo'.s o'38 I2 I; def main38) IC &t(.main38 IJ return 0 II IR if BBnameBB MM EBBmainBBE) IS 0ulersExample38 ID main38 5as lineas C2 y J2 conectan la retrollamada motionBnotify38 al 9rea pasandole hrule en la linea C2 y vrule en la l<nea J2 como datos de usuario. 5a retrollamada motionBnotify38 se llamar9 dos "eces cada "ez que el ratn se mue"a U una "ez con hrule y otra "ez con vrule. F.A. =arras de Estado 5as 1tatus$ar 3Farras de Estado8 son unos controles simples que se usan para "isualizar un mensaje de texto. 4antienen una pila de los mensajes que se les an en"iado# para que al quitar el mensaje actual se "isualice el mensaje anterior.

Para que distintas partes de la aplicacin puedan usar la misma $arra de estado para "isualizar mensajes# el control de $arra de estado mantiene :dentificadores de Aontexto que se usan para identificar diferentes EusuariosE. El mensaje en el tope de la pila es el que se "isualiza# no importa el contexto al que pertenezca. 5os mensajes se apilan en orden 2ltimo en lle&ar primero en salir# no en orden de identificadores de contexto. .na $arra de estado se crea con una llamada a) status$ar M &t(.1tatus$ar38 1e puede solicitar un nue"o :dentificador de Aontexto usando una llamada al si&uiente m%todo con una peque=a descripcin textual del contexto) contextBid M status$ar.&etBcontextBid3context.description8 +ay tres m%todos adicionales para utilizar las $arras de estado) messa&eBid M status$ar.pus 3context.id# text8 status$ar.pop3context.id8 status$ar.remo"e3context.id# "essage.id8 El primero# pus 38# se usa para a=adir un nue"o mensaje a la statusbar 3$arra de estado8. @e"uel"e un message_id 3identificador de mensaje8# que puede usarse con el m%todo remo"e38 para $orrar el mensaje que cumpla la com$inacin de message_id y context_id en la pila de la statusbar 3$arra de estado8. El m%todo pop38 elimina el mensaje que est% en la posicin m9s alta de la pila con el identificador de contexto context_id. El pro&rama de ejemplo statusbar.py crea una $arra de estado y dos $otones# uno para insertar elementos en la $arra de estado# y otro para sacar el 2ltimo elemento fuera. 5a fi&ura 7i&ura D.D# VEjemplo de Farra de EstadoW muestra el resultado) #igura F.F. E)e"plo de =arra de Estado

El cdi&o fuente es) 1 2 ; C J I R S D 10 11 QPGusrG$inGen" pyt on Q ejemplo status$ar.py import py&t( py&t(.require3N2.0N8 import &t( class 1tatus$arExample) def pus Bitem3self# 'id&et# data8) $uff M E :tem `dE ` self.count

12 self.count M self.count ! 1 1; self.statusB$ar.pus 3data# $uff8 1C return 1J 1I def popBitem3self# 'id&et# data8) 1R self.statusB$ar.pop3data8 1S return 1D 20 def BBinitBB3self8) 21 self.count M 1 22 Q crea una "entana nue"a 2; 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 2C 'indo'.setBsizeBrequest3200# 1008 2J 'indo'.setBtitle3EPyGTK 1tatus$ar ExampleE8 2I 'indo'.connect3EdeleteBe"entE# lam$da '#e) &t(.mainBquit388 2R 2S "$ox M &t(.TFox3&t(.7-51E# 18 2D 'indo'.add3"$ox8 ;0 "$ox.s o'38 ;1 ;2 self.statusB$ar M &t(.1tatus$ar38 ;; "$ox.pac(Bstart3self.statusB$ar# &t(.T0.E# &t(.T0.E# 08 ;C self.statusB$ar.s o'38 ;J ;I contextBid M self.statusB$ar.&etBcontextBid3E1tatus$ar exampleE8 ;R ;S $utton M &t(.Futton3Epus itemE8 ;D $utton.connect3Eclic(edE# self.pus Bitem# contextBid8 C0 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 C1 $utton.s o'38 C2 C; $utton M &t(.Futton3Epop last itemE8 CC $utton.connect3Eclic(edE# self.popBitem# contextBid8 CJ "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 28 CI $utton.s o'38 CR CS Q siempre mostramos la "entana al final para que se muestre CD Q de una "ez en pantalla. J0 'indo'.s o'38 J1 J2 def main38) J; &t(.main38 JC return 0 JJ JI if BBnameBB MM EBBmainBBE) JR 1tatus$arExample38 JS main38

F.F. Entradas de Texto 8Entry9 El control Entry 3Entrada8 permite escri$ir texto y mostrarlo en una caja de texto con una 2nica l<nea. El texto puede fijarse con llamadas a m%todos que permiten que nue"o texto reemplace# se inserte antes o se a=ada despu%s del contenido actual del control Entry . 5a funcin para crear un control Entry es) entry M &t(.Entry3"axM08 1i el ar&umento max se especifica se esta$lece un l<mite de lon&itud del texto dentro de la Entry. 1i max es 0 no ay l<mite. 5a lon&itud m9xima de una entrada puede cam$iarse usando el m%todo) entry.setBmaxBlen&t 3"ax8 El si&uiente m%todo altera el texto que ay actualmente en el control Entry . entry.setBtext3text8 El m%todo setBtext38 fija el contenido del control Entry a text# remplazando el contenido actual. /$s%r"ese que la clase Entry implementa la interfaz Edita$le 3s<# &o$ject soporta interfaces al estilo de *a"a8 que contiene al&unas funciones m9s para manipular los contenidos. Por ejemplo# el m%todo) entry.insertBtext3text# positionM08 inserta text en la posicin indicada dentro de la entry. El contenido de la Entry puede recuperarse usando una llamada al si&uiente m%todo. Esto es 2til en las retrollamadas que se descri$en m9s a$ajo. text M entry.&etBtext38 1i no queremos que el contenido de la Entry sea modificada por al&uien escri$iendo en ella# podemos cam$iar su estado de edicin. entry.setBedita$le3is.editable8 El m%todo anterior permite intercam$iar el estado de edicin del control Entry pas9ndole un "alor T0.E o 7-51E en el ar&umento is_editable. 1i estamos usando el control Entry y no queremos que el texto que se introduzca sea "isi$le# por ejemplo cuando una contrase=a se escri$e# podemos usar el si&uiente m%todo# que adem9s acepta una $andera $ooleana. entry.setB"isi$ility30isible8 .na re&in del texto se puede poner como seleccionada usando el si&uiente m%todo. Esto se usar<a so$re todo cuando se pon&a al&2n "alor predeterminado en un Entry# aciendo f9cil para el usuario el $orrado. entry.selectBre&ion3start# end8

1i queremos reci$ir notificacin cuando el usuario introduzca el texto# podemos conectar a las se=ales Eacti"ateE o Ec an&edE. 5a primera se produce cuando el usuario pulsa la tecla enter dentro del control Entry. 5a se&unda se produce cuando ocurre cualquier cam$io en el texto# por ejemplo# para cualquier insercin o $orrado de un caracter. El pro&rama de ejemplo entry.py muestra el uso de un control Entry . 5a fi&ura 7i&ura D.10# VEjemplo de EntradaW muestra el resultado de ejecutar el pro&rama) #igura F.1G. E)e"plo de Entrada

El cdi&o fuente entry.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C QPGusrG$inGen" pyt on Q ejemplo entry.py import py&t( py&t(.require3N2.0N8 import &t( class EntryExample) def enterBcall$ac(3self# 'id&et# entry8) entryBtext M entry.&etBtext38 print EEntry contents) `sanE ` entryBtext def entryBto&&leBedita$le3self# c ec($utton# entry8) entry.setBedita$le3c ec($utton.&etBacti"e388 def entryBto&&leB"isi$ility3self# c ec($utton# entry8) entry.setB"isi$ility3c ec($utton.&etBacti"e388 def BBinitBB3self8) Q create a ne' 'indo' 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBsizeBrequest3200# 1008 'indo'.setBtitle3EGTK EntryE8 'indo'.connect3EdeleteBe"entE# lam$da '#e) &t(.mainBquit388 "$ox M &t(.TFox3&t(.7-51E# 08 'indo'.add3"$ox8 "$ox.s o'38 entry M &t(.Entry38 entry.setBmaxBlen&t 3J08 entry.connect3Eacti"ateE# self.enterBcall$ac(# entry8 entry.setBtext3E elloE8

;J entry.insertBtext3E 'orldE# len3entry.&etBtext3888 ;I entry.selectBre&ion30# len3entry.&etBtext3888 ;R "$ox.pac(Bstart3entry# &t(.T0.E# &t(.T0.E# 08 ;S entry.s o'38 ;D C0 $ox M &t(.+Fox3&t(.7-51E# 08 C1 "$ox.add3 $ox8 C2 $ox.s o'38 C; CC c ec( M &t(.A ec(Futton3EEdita$leE8 CJ $ox.pac(Bstart3c ec(# &t(.T0.E# &t(.T0.E# 08 CI c ec(.connect3Eto&&ledE# self.entryBto&&leBedita$le# entry8 CR c ec(.setBacti"e3&t(.T0.E8 CS c ec(.s o'38 CD J0 c ec( M &t(.A ec(Futton3ETisi$leE8 J1 $ox.pac(Bstart3c ec(# &t(.T0.E# &t(.T0.E# 08 J2 c ec(.connect3Eto&&ledE# self.entryBto&&leB"isi$ility# entry8 J; c ec(.setBacti"e3&t(.T0.E8 JC c ec(.s o'38 JJ JI $utton M &t(.Futton3stoc(M&t(.1T/AKBA5/1E8 JR $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 JS "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 JD $utton.setBfla&s3&t(.A-?B@E7-.5T8 I0 $utton.&ra$Bdefault38 I1 $utton.s o'38 I2 'indo'.s o'38 I; IC def main38) IJ &t(.main38 II return 0 IR IS if BBnameBB MM EBBmainBBE) ID EntryExample38 R0 main38 F.1G. =otones 3u"entarHBis"inuir El control 1pinFutton 3Fotn -umentarG @isminuir8 se usa &eneralmente para permitir al usuario seleccionar un "alor dentro de un ran&o de "alores num%ricos. Aonsiste en una caja de entrada de texto con $otones de flec a arri$a y a$ajo a un lado. 1eleccionando uno de los $otones causa que el "alor aumente o disminuya en el ran&o de "alores posi$les. 5a caja de entrada tam$i%n puede editarse directamente para introducir un "alor espec<fico. El 1pinFutton permite que el "alor ten&a cero o m9s cifras decimales y puede incrementarseGdecrementarse en pasos confi&ura$les. 5a accin de mantener pulsado uno de los $otones opcionalmente pro"oca una aceleracin en el cam$io del "alor

correspondiente al tiempo que se manten&a presionado. El 1pinFutton usa un o$jeto -djustment 3-juste8 para almacenar la informacin del ran&o de "alores que el $otn aumentarGdisminuir puede tomar. Esto le ace un control muy 2til. 0ecordemos que un control -djustment 3-juste8 se crea con la si&uiente funcin# que muestra la informacin que almacena) adjustment page.si4eM08 M &t(.-djustment30alueM0# lo(erM0# upperM0# step.incrM0#

page.incr

Estos atri$utos de un -djustment 3-juste8 se usan en el 1pinFutton de la si&uiente manera) "alor inicial para el Fotn -umentarG@isminuir el "alor m9s $ajo del ran&o el "alor m9s alto del ran&o "alor que se incrementaGdecrementa cuando se pulsa el $otnU1 del step_increment ratn en un $otn "alor que se incrementaGdecrementa cuando se pulsa el $otnU2 del page_increment ratn en un $otn page_size no se usa -dicionalmente# el $otn del ratn $otnU; se puede usar para saltar directamente a los "alores upper 3superior8 y lower 3inferior8 cuando se usa para seleccionar uno de los $otones. Teamos como crear un 1pinFutton 3Fotn -umentarG@isminuir8) spinB$utton M &t(.1pinFutton3ad)ust"entM?one# cli"b.rateM0.0# digitsM08 El ar&umento climb_rate 3razn de escalada8 puede tomar un "alor entre 0.0 y 1.0 e indica la cantidad de aceleracin que el 1pinFutton tiene. El ar&umento digits especifica el n2mero de cifras decimales que se mostrar9n. .n 1pinFutton se puede reconfi&urar despu%s de su creacin usando el si&uiente m%todo) spinB$utton.confi&ure3ad)ust"ent# cli"b.rate# digits8 5a "aria$le spin_button especifica el $otn aumentarGdisminuir que se "a a reconfi&urar. 5os otros ar&umentos son los mismos que antes. El adjustment 3ajuste8 se puede fijar y recupar independientemente usando los si&uientes dos m%todos) spinB$utton.setBadjustment3ad)ust"ent8 adjustment M spinB$utton.&etBadjustment38 El n2mero de cifras decimales tam$i%n se puede cam$iar usando) spinB$utton.setBdi&its3digits8 El "alor que un 1pinFutton est9 mostrando actualmente se puede cam$iar usando el si&uiente m%todo) value lower upper

spinB$utton.setB"alue30alue8 El "alor actual de un 1pinFutton se puede recuperar como un "alor real o como un "alor entero usando los si&uientes m%todos) floatB"alue M spinB$utton.&etB"alue38 intB"alue M spinB$utton.&etB"alueBasBint38 1i quieres alterar el "alor de un 1pinFutton relati"o a su "alor actual# entonces usa el si&uiente m%todo) spinB$utton.spin3direction# incre"ent8 El par9metro direction 3direccin8 puede tomar uno de los si&uientes "alores) 1P:?B1TEPB7/0>-0@ Q paso acia adelante 1P:?B1TEPBF-AK>-0@ Q paso acia atr9s 1P:?BP-GEB7/0>-0@ Q p9&ina acia adelante 1P:?BP-GEBF-AK>-0@ Q p9&ina acia atr9s 1P:?B+/4E Q inicio 1P:?BE?@ Q fin 1P:?B.1E0B@E7:?E@ Q definido por el usuario Este m%todo comprime $astante funcionalidad# que explicaremos a ora. 4uc os de estos par9metros usan "alores del o$jeto -djustment 3-juste8 que est9 asociado con un 1pinFutton 3Fotn -umentarG@isminuir8. 1P:?B1TEPB7/0>-0@ 3paso adelante8 y 1P:?B1TEPBF-AK>-0@ 3paso atr9s8 cam$ian el "alor del 1pinFutton con una cantidad especificada por el increment 3incremento8# a menos que increment 3incremento8 sea i&ual a 0# en cuyo caso el "alor se modifica con el step_increment 3incremento de paso8 del -djustment. 1P:?BP-GEB7/0>-0@ 3p9&ina adelante8 y 1P:?BP-GEBF-AK>-0@ simplemente alteran el "alor del 1pinFutton por increment 3incremento8. 3p9&ina atr9s8

1P:?B+/4E 3inicio8 pone el "alor del 1pinFutton a la parte de a$ajo del ran&o del -djustment . 1P:?BE?@ 3fin8 fija el "alor del 1pinFutton a la parte de arri$a del ran&o del -djustment . 1P:?B.1E0B@E7:?E@ 3definido por el usuario8 simplemente modifica el "alor del 1pinFutton con la cantidad especificada. - ora nos alejamos de los m%todos para fijar y recuperar los atri$utos del ran&o de un 1pinFutton# y nos centramos en los m%todos que modifican la apariencia y comportamiento del propio control 1pinFutton. El primero de estos m%todos se usa para limitar la caja de texto del 1pinFutton para que solo conten&a un "alor num%rico. Esto e"ita que el usuario escri$a cualquier otra cosa que no sea un "alor num%rico dentro de la caja de texto de un 1pinFutton) spinB$utton.setBnumeric3nu"eric8

El ar&umento numeric es T0.E para limitar la caja de texto a "alores num%ricos o 7-51E para quitar esta limitacin. Puedes fijar si quieres que el "alor del 1pinFutton se quede en los "alores inferior y superior del ran&o con el si&uiente m%todo) spinB$utton.setB'rap3(rap8 El 1pinFutton limitar9 los "alores dentro del ran&o si wrap es T0.E. Puedes acer que el 1pinFutton redondee el "alor al step_increment 3incremento8 m9s cercano# lo cual se fija dentro del o$jeto -djustment usado en el 1pinFutton. Esto se consi&ue con el si&uiente m%todo cuando el ar&umento snap_to_ticks es T0.E ) spinB$utton.setBsnapBtoBtic(s3snap.to.ticks8 5a pol<tica de actualizacin de un 1pinFutton se cam$ia con el si&uiente m%todo) spinB$utton.setBupdateBpolicy3policy8 5os "alores posi$les de esta pol<tica son) .P@-TEB-5>-[1 Q actualizar siempre .P@-TEB:7BT-5:@ Q actualizar si es "9lido Estas pol<ticas afectan el comportamiento de un 1pinFutton cuando analiza el texto insertado y sincroniza su "alor con los "alores del -djustment. En el caso de .P@-TEB:7BT-5:@ 3actualizar si es "9lido8 el "alor del 1pinFutton slo cam$ia si el texto es un "alor num%rico que est9 dentro del ran&o especificado por el -djustment. En cualquier otro caso el texto se resetea al "alor actual. En el caso de .P@-TEB-5>-[1 3actualizar siempre8 se i&noran los errores de con"ersin al pasar el texto a un "alor num%rico. 7inalmente# se puede solicitar una actualizacin del 1pinFutton ) spinB$utton.update38 El pro&rama de ejemplo spinbutton.py muestra el uso de $otones de aumentarGdisminuir incluyendo el uso de "arias caracter<sticas. 5a fi&ura 7i&ura D.11# VEjemplo de Fotn -umentarG@isminuirW muestra el resultado de ejecutar el pro&rama de ejemplo) #igura F.11. E)e"plo de =otn 3u"entarHBis"inuir

El cdi&o fuente spinbutton.py es) 1 QPGusrG$inGen" pyt on 2

; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0

Q ejemplo spin$utton.py import py&t( py&t(.require3N2.0N8 import &t( class 1pinFuttonExample) def to&&leBsnap3self# 'id&et# spin8) spin.setBsnapBtoBtic(s3'id&et.&etBacti"e388 def to&&leBnumeric3self# 'id&et# spin8) spin.setBnumeric3'id&et.&etBacti"e388 def c an&eBdi&its3self# 'id&et# spin# spin18) spin1.setBdi&its3spin.&etB"alueBasBint388 def &etB"alue3self# 'id&et# data# spin# spin2# la$el8) if data MM 1) $uf M E`dE ` spin.&etB"alueBasBint38 else) $uf M E`0.ZfE ` 3spin2.&etB"alueBasBint38# spin.&etB"alue388 la$el.setBtext3$uf8 def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 'indo'.setBtitle3E1pin FuttonE8 mainB"$ox M &t(.TFox3&t(.7-51E# J8 mainB"$ox.setB$orderB'idt 3108 'indo'.add3mainB"$ox8 frame M &t(.7rame3E?ot acceleratedE8 mainB"$ox.pac(Bstart3frame# &t(.T0.E# &t(.T0.E# 08 "$ox M &t(.TFox3&t(.7-51E# 08 "$ox.setB$orderB'idt 3J8 frame.add3"$ox8 Q Fotones de aumentarGdisminuir d<a# mes y a=o $ox M &t(.+Fox3&t(.7-51E# 08 "$ox.pac(Bstart3 $ox# &t(.T0.E# &t(.T0.E# J8 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E@ay )E8

J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS

la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment31.0# 1.0# ;1.0# 1.0# J.0# 0.08 spinner M &t(.1pinFutton3adj# 0# 08 spinner.setB'rap3&t(.T0.E8 "$ox2.pac(Bstart3spinner# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E4ont )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment31.0# 1.0# 12.0# 1.0# J.0# 0.08 spinner M &t(.1pinFutton3adj# 0# 08 spinner.setB'rap3&t(.T0.E8 "$ox2.pac(Bstart3spinner# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E[ear )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment31DDS.0# 0.0# 2100.0# 1.0# 100.0# 0.08 spinner M &t(.1pinFutton3adj# 0# 08 spinner.setB'rap3&t(.7-51E8 spinner.setBsizeBrequest3JJ# U18 "$ox2.pac(Bstart3spinner# &t(.7-51E# &t(.T0.E# 08 frame M &t(.7rame3E-cceleratedE8 mainB"$ox.pac(Bstart3frame# &t(.T0.E# &t(.T0.E# 08 "$ox M &t(.TFox3&t(.7-51E# 08 "$ox.setB$orderB'idt 3J8 frame.add3"$ox8 $ox M &t(.+Fox3&t(.7-51E# 08 "$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# J8 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3ETalue )E8 la$el.setBali&nment30# 0.J8

DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122 12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2 1C; 1CC 1CJ 1CI

"$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment30.0# U10000.0# 10000.0# 0.J# 100.0# 0.08 spinner1 M &t(.1pinFutton3adj# 1.0# 28 spinner1.setB'rap3&t(.T0.E8 spinner1.setBsizeBrequest3100# U18 "$ox2.pac(Bstart3spinner1# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E@i&its )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment32# 1# J# 1# 1# 08 spinner2 M &t(.1pinFutton3adj# 0.0# 08 spinner2.setB'rap3&t(.T0.E8 adj.connect3E"alueBc an&edE# self.c an&eBdi&its# spinner2# spinner18 "$ox2.pac(Bstart3spinner2# &t(.7-51E# &t(.T0.E# 08 $ox M &t(.+Fox3&t(.7-51E# 08 "$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# J8 $utton M &t(.A ec(Futton3E1nap to 0.JUtic(sE8 $utton.connect3Eclic(edE# self.to&&leBsnap# spinner18 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 $utton.setBacti"e3&t(.T0.E8 $utton M &t(.A ec(Futton3E?umeric only input modeE8 $utton.connect3Eclic(edE# self.to&&leBnumeric# spinner18 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 $utton.setBacti"e3&t(.T0.E8 "alBla$el M &t(.5a$el3EE8 $ox M &t(.+Fox3&t(.7-51E# 08 "$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# J8 $utton M &t(.Futton3ETalue as :ntE8 $utton.connect3Eclic(edE# self.&etB"alue# 1# spinner1# spinner2# "alBla$el8 $ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# J8 $utton M &t(.Futton3ETalue as 7loatE8 $utton.connect3Eclic(edE# self.&etB"alue# 2# spinner1# spinner2# "alBla$el8 $ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# J8

1CR "$ox.pac(Bstart3"alBla$el# &t(.T0.E# &t(.T0.E# 08 1CS "alBla$el.setBtext3E0E8 1CD 1J0 $ox M &t(.+Fox3&t(.7-51E# 08 1J1 mainB"$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# 08 1J2 1J; $utton M &t(.Futton3EAloseE8 1JC $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 1JJ $ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# J8 1JI 'indo'.s o'Ball38 1JR 1JS def main38) 1JD &t(.main38 1I0 return 0 1I1 1I2 if BBnameBB MM EBBmainBBE) 1I; 1pinFuttonExample38 1IC main38 F.1G. =otones 3u"entarHBis"inuir El control 1pinFutton 3Fotn -umentarG @isminuir8 se usa &eneralmente para permitir al usuario seleccionar un "alor dentro de un ran&o de "alores num%ricos. Aonsiste en una caja de entrada de texto con $otones de flec a arri$a y a$ajo a un lado. 1eleccionando uno de los $otones causa que el "alor aumente o disminuya en el ran&o de "alores posi$les. 5a caja de entrada tam$i%n puede editarse directamente para introducir un "alor espec<fico. El 1pinFutton permite que el "alor ten&a cero o m9s cifras decimales y puede incrementarseGdecrementarse en pasos confi&ura$les. 5a accin de mantener pulsado uno de los $otones opcionalmente pro"oca una aceleracin en el cam$io del "alor correspondiente al tiempo que se manten&a presionado. El 1pinFutton usa un o$jeto -djustment 3-juste8 para almacenar la informacin del ran&o de "alores que el $otn aumentarGdisminuir puede tomar. Esto le ace un control muy 2til. 0ecordemos que un control -djustment 3-juste8 se crea con la si&uiente funcin# que muestra la informacin que almacena) adjustment page.si4eM08 M &t(.-djustment30alueM0# lo(erM0# upperM0# step.incrM0#

page.incr

Estos atri$utos de un -djustment 3-juste8 se usan en el 1pinFutton de la si&uiente manera) value lower upper step_increment page_increment "alor inicial para el Fotn -umentarG@isminuir el "alor m9s $ajo del ran&o el "alor m9s alto del ran&o "alor que se incrementaGdecrementa cuando se pulsa el $otnU1 del ratn en un $otn "alor que se incrementaGdecrementa cuando se pulsa el $otnU2 del

ratn en un $otn page_size no se usa -dicionalmente# el $otn del ratn $otnU; se puede usar para saltar directamente a los "alores upper 3superior8 y lower 3inferior8 cuando se usa para seleccionar uno de los $otones. Teamos como crear un 1pinFutton 3Fotn -umentarG@isminuir8) spinB$utton M &t(.1pinFutton3ad)ust"entM?one# cli"b.rateM0.0# digitsM08 El ar&umento climb_rate 3razn de escalada8 puede tomar un "alor entre 0.0 y 1.0 e indica la cantidad de aceleracin que el 1pinFutton tiene. El ar&umento digits especifica el n2mero de cifras decimales que se mostrar9n. .n 1pinFutton se puede reconfi&urar despu%s de su creacin usando el si&uiente m%todo) spinB$utton.confi&ure3ad)ust"ent# cli"b.rate# digits8 5a "aria$le spin_button especifica el $otn aumentarGdisminuir que se "a a reconfi&urar. 5os otros ar&umentos son los mismos que antes. El adjustment 3ajuste8 se puede fijar y recupar independientemente usando los si&uientes dos m%todos) spinB$utton.setBadjustment3ad)ust"ent8 adjustment M spinB$utton.&etBadjustment38 El n2mero de cifras decimales tam$i%n se puede cam$iar usando) spinB$utton.setBdi&its3digits8 El "alor que un 1pinFutton est9 mostrando actualmente se puede cam$iar usando el si&uiente m%todo) spinB$utton.setB"alue30alue8 El "alor actual de un 1pinFutton se puede recuperar como un "alor real o como un "alor entero usando los si&uientes m%todos) floatB"alue M spinB$utton.&etB"alue38 intB"alue M spinB$utton.&etB"alueBasBint38 1i quieres alterar el "alor de un 1pinFutton relati"o a su "alor actual# entonces usa el si&uiente m%todo) spinB$utton.spin3direction# incre"ent8 El par9metro direction 3direccin8 puede tomar uno de los si&uientes "alores) 1P:?B1TEPB7/0>-0@ Q paso acia adelante 1P:?B1TEPBF-AK>-0@ Q paso acia atr9s

1P:?BP-GEB7/0>-0@ Q p9&ina acia adelante 1P:?BP-GEBF-AK>-0@ Q p9&ina acia atr9s 1P:?B+/4E Q inicio 1P:?BE?@ Q fin 1P:?B.1E0B@E7:?E@ Q definido por el usuario Este m%todo comprime $astante funcionalidad# que explicaremos a ora. 4uc os de estos par9metros usan "alores del o$jeto -djustment 3-juste8 que est9 asociado con un 1pinFutton 3Fotn -umentarG@isminuir8. 1P:?B1TEPB7/0>-0@ 3paso adelante8 y 1P:?B1TEPBF-AK>-0@ 3paso atr9s8 cam$ian el "alor del 1pinFutton con una cantidad especificada por el increment 3incremento8# a menos que increment 3incremento8 sea i&ual a 0# en cuyo caso el "alor se modifica con el step_increment 3incremento de paso8 del -djustment. 1P:?BP-GEB7/0>-0@ 3p9&ina adelante8 y 1P:?BP-GEBF-AK>-0@ simplemente alteran el "alor del 1pinFutton por increment 3incremento8. 3p9&ina atr9s8

1P:?B+/4E 3inicio8 pone el "alor del 1pinFutton a la parte de a$ajo del ran&o del -djustment . 1P:?BE?@ 3fin8 fija el "alor del 1pinFutton a la parte de arri$a del ran&o del -djustment . 1P:?B.1E0B@E7:?E@ 3definido por el usuario8 simplemente modifica el "alor del 1pinFutton con la cantidad especificada. - ora nos alejamos de los m%todos para fijar y recuperar los atri$utos del ran&o de un 1pinFutton# y nos centramos en los m%todos que modifican la apariencia y comportamiento del propio control 1pinFutton. El primero de estos m%todos se usa para limitar la caja de texto del 1pinFutton para que solo conten&a un "alor num%rico. Esto e"ita que el usuario escri$a cualquier otra cosa que no sea un "alor num%rico dentro de la caja de texto de un 1pinFutton) spinB$utton.setBnumeric3nu"eric8 El ar&umento numeric es T0.E para limitar la caja de texto a "alores num%ricos o 7-51E para quitar esta limitacin. Puedes fijar si quieres que el "alor del 1pinFutton se quede en los "alores inferior y superior del ran&o con el si&uiente m%todo) spinB$utton.setB'rap3(rap8 El 1pinFutton limitar9 los "alores dentro del ran&o si wrap es T0.E. Puedes acer que el 1pinFutton redondee el "alor al step_increment 3incremento8 m9s cercano# lo cual se fija dentro del o$jeto -djustment usado en el 1pinFutton. Esto se consi&ue con el si&uiente m%todo cuando el ar&umento snap_to_ticks es T0.E ) spinB$utton.setBsnapBtoBtic(s3snap.to.ticks8 5a pol<tica de actualizacin de un 1pinFutton se cam$ia con el si&uiente m%todo)

spinB$utton.setBupdateBpolicy3policy8 5os "alores posi$les de esta pol<tica son) .P@-TEB-5>-[1 Q actualizar siempre .P@-TEB:7BT-5:@ Q actualizar si es "9lido Estas pol<ticas afectan el comportamiento de un 1pinFutton cuando analiza el texto insertado y sincroniza su "alor con los "alores del -djustment. En el caso de .P@-TEB:7BT-5:@ 3actualizar si es "9lido8 el "alor del 1pinFutton slo cam$ia si el texto es un "alor num%rico que est9 dentro del ran&o especificado por el -djustment. En cualquier otro caso el texto se resetea al "alor actual. En el caso de .P@-TEB-5>-[1 3actualizar siempre8 se i&noran los errores de con"ersin al pasar el texto a un "alor num%rico. 7inalmente# se puede solicitar una actualizacin del 1pinFutton ) spinB$utton.update38 El pro&rama de ejemplo spinbutton.py muestra el uso de $otones de aumentarGdisminuir incluyendo el uso de "arias caracter<sticas. 5a fi&ura 7i&ura D.11# VEjemplo de Fotn -umentarG@isminuirW muestra el resultado de ejecutar el pro&rama de ejemplo) #igura F.11. E)e"plo de =otn 3u"entarHBis"inuir

El cdi&o fuente spinbutton.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D QPGusrG$inGen" pyt on Q ejemplo spin$utton.py import py&t( py&t(.require3N2.0N8 import &t( class 1pinFuttonExample) def to&&leBsnap3self# 'id&et# spin8) spin.setBsnapBtoBtic(s3'id&et.&etBacti"e388 def to&&leBnumeric3self# 'id&et# spin8) spin.setBnumeric3'id&et.&etBacti"e388 def c an&eBdi&its3self# 'id&et# spin# spin18) spin1.setBdi&its3spin.&etB"alueBasBint388 def &etB"alue3self# 'id&et# data# spin# spin2# la$el8)

20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR

if data MM 1) $uf M E`dE ` spin.&etB"alueBasBint38 else) $uf M E`0.ZfE ` 3spin2.&etB"alueBasBint38# spin.&etB"alue388 la$el.setBtext3$uf8 def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 'indo'.setBtitle3E1pin FuttonE8 mainB"$ox M &t(.TFox3&t(.7-51E# J8 mainB"$ox.setB$orderB'idt 3108 'indo'.add3mainB"$ox8 frame M &t(.7rame3E?ot acceleratedE8 mainB"$ox.pac(Bstart3frame# &t(.T0.E# &t(.T0.E# 08 "$ox M &t(.TFox3&t(.7-51E# 08 "$ox.setB$orderB'idt 3J8 frame.add3"$ox8 Q Fotones de aumentarGdisminuir d<a# mes y a=o $ox M &t(.+Fox3&t(.7-51E# 08 "$ox.pac(Bstart3 $ox# &t(.T0.E# &t(.T0.E# J8 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E@ay )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment31.0# 1.0# ;1.0# 1.0# J.0# 0.08 spinner M &t(.1pinFutton3adj# 0# 08 spinner.setB'rap3&t(.T0.E8 "$ox2.pac(Bstart3spinner# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E4ont )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment31.0# 1.0# 12.0# 1.0# J.0# 0.08 spinner M &t(.1pinFutton3adj# 0# 08

IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J

spinner.setB'rap3&t(.T0.E8 "$ox2.pac(Bstart3spinner# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E[ear )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment31DDS.0# 0.0# 2100.0# 1.0# 100.0# 0.08 spinner M &t(.1pinFutton3adj# 0# 08 spinner.setB'rap3&t(.7-51E8 spinner.setBsizeBrequest3JJ# U18 "$ox2.pac(Bstart3spinner# &t(.7-51E# &t(.T0.E# 08 frame M &t(.7rame3E-cceleratedE8 mainB"$ox.pac(Bstart3frame# &t(.T0.E# &t(.T0.E# 08 "$ox M &t(.TFox3&t(.7-51E# 08 "$ox.setB$orderB'idt 3J8 frame.add3"$ox8 $ox M &t(.+Fox3&t(.7-51E# 08 "$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# J8 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3ETalue )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment30.0# U10000.0# 10000.0# 0.J# 100.0# 0.08 spinner1 M &t(.1pinFutton3adj# 1.0# 28 spinner1.setB'rap3&t(.T0.E8 spinner1.setBsizeBrequest3100# U18 "$ox2.pac(Bstart3spinner1# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# 08 $ox.pac(Bstart3"$ox2# &t(.T0.E# &t(.T0.E# J8 la$el M &t(.5a$el3E@i&its )E8 la$el.setBali&nment30# 0.J8 "$ox2.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 adj M &t(.-djustment32# 1# J# 1# 1# 08 spinner2 M &t(.1pinFutton3adj# 0.0# 08

11I spinner2.setB'rap3&t(.T0.E8 11R adj.connect3E"alueBc an&edE# self.c an&eBdi&its# spinner2# spinner18 11S "$ox2.pac(Bstart3spinner2# &t(.7-51E# &t(.T0.E# 08 11D 120 $ox M &t(.+Fox3&t(.7-51E# 08 121 "$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# J8 122 12; $utton M &t(.A ec(Futton3E1nap to 0.JUtic(sE8 12C $utton.connect3Eclic(edE# self.to&&leBsnap# spinner18 12J "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 12I $utton.setBacti"e3&t(.T0.E8 12R 12S $utton M &t(.A ec(Futton3E?umeric only input modeE8 12D $utton.connect3Eclic(edE# self.to&&leBnumeric# spinner18 1;0 "$ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 1;1 $utton.setBacti"e3&t(.T0.E8 1;2 1;; "alBla$el M &t(.5a$el3EE8 1;C 1;J $ox M &t(.+Fox3&t(.7-51E# 08 1;I "$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# J8 1;R $utton M &t(.Futton3ETalue as :ntE8 1;S $utton.connect3Eclic(edE# self.&etB"alue# 1# spinner1# spinner2# 1;D "alBla$el8 1C0 $ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# J8 1C1 1C2 $utton M &t(.Futton3ETalue as 7loatE8 1C; $utton.connect3Eclic(edE# self.&etB"alue# 2# spinner1# spinner2# 1CC "alBla$el8 1CJ $ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# J8 1CI 1CR "$ox.pac(Bstart3"alBla$el# &t(.T0.E# &t(.T0.E# 08 1CS "alBla$el.setBtext3E0E8 1CD 1J0 $ox M &t(.+Fox3&t(.7-51E# 08 1J1 mainB"$ox.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# 08 1J2 1J; $utton M &t(.Futton3EAloseE8 1JC $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 1JJ $ox.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# J8 1JI 'indo'.s o'Ball38 1JR 1JS def main38) 1JD &t(.main38 1I0 return 0 1I1 1I2 if BBnameBB MM EBBmainBBE) 1I; 1pinFuttonExample38

1IC

main38

F.1!. Calendario El control Aalendar 3Aalendario8 es una forma efecti"a para "isualizar y o$tener informacin relati"a a fec as mensuales. Es un control muy f9cil de usar y tra$ajar con %l. Arear un control Gt(Aalendar es tan simple como) calendar M &t(.Aalendar38 El calendario mostrar9 el mes y el a=o actual de manera predeterminada. Puede a$er ocasiones en las que se necesite cam$iar muc a informacin dentro de este control y los si&uientes m%todos permiten realizar m2ltiples cam$ios al control Aalendar sin que el usuario "ea muc os cam$ios en pantalla. calendar.freeze38 Q con&elar calendar.t a'38 Q reanudar 7uncionan exactamente i&ual que los m%todos freezeGt a' de cualquier otro control 3desacti"ando los cam$ios y reanud9ndolos8. El control Aalendar tiene unas cuantas opciones que permiten cam$iar la manera en la que el control se "isualiza y se comporta usando el m%todo) calendar.displayBoptions3-lags8 El ar&umento flags 3$anderas8 se puede formar com$inando cualquiera de las si&uientes cinco opciones usando el operador l&ico 3b8) esta opcin especifica que el mes y el a=o de$en mostrarse cuando se di$uje el calendario. esta opcin especifica que la descripcin de tres letras para cada d<a 35un# 4ar# etc.8 de$e mostrarse. esta opcin dice que el usuario no podr9 cam$iar el mes que se A-5E?@-0B?/B4/? muestra. Esto puede ser $ueno si slo se necesita mostrar un mes en T+BA+-?GE particular como cuando se muestran 12 controles de calendario uno para cada mes dentro de un mes en particular. esta opcin especifica que se muestre el n2mero de cada semana en A-5E?@-0B1+/>B la parte de a$ajo izquierda del calendario 3ejemplo) Enero 1 M >EEKB?.4FE01 1emana 1# @iciem$re ;1 M 1emana J28. esta opcin dice que la semana empezar9 en 5unes en lu&ar de en A-5E?@-0B>EEKB1 @omin&o# que es el "alor predeterminado. Esto solo afecta al orden T-0TB4/?@-[ en el que se muestran los d<as de izquierda a derec a. - partir de PyGTK 2.C esta opcin est9 o$soleta. 5os si&uientes m%todos se usan para fijar la fec a que se muestra) result M calendar.selectBmont 3"onth# year8 A-5E?@-0B1+/>B+ E-@:?G A-5E?@-0B1+/>B@ -[B?-4E1

calendar.selectBday3day8 El "alor que de"uel"e el m%todo selectBmont 38 es un "alor $ooleano que indica si la seleccin tu"o %xito. Aon el m%todo selectBday38 el d<a especificado se selecciona dentro del mes actual# si eso es posi$le. .n "alor para el d<a de 0 limpiar9 la seleccin actual. -dem9s de tener un d<a seleccionado# un n2mero ar$itrario de d<as se pueden EmarcarE. .n d<a marcado se destaca en el calendario. 5os si&uientes m%todos se proporcionan para manipular d<as marcados) result M calendar.mar(Bday3day8 result M calendar.unmar(Bday3day8 calendar.clearBmar(s38 mar(Bday38 y unmar(Bday38 de"uel"en un "alor $ooleano que indica si el m%todo tu"o %xito. +a de ad"ertirse que las marcas son persistentes entre cam$ios de mes y a=o. El 2ltimo m%todo del control Aalendar se usa para o$tener la fec a seleccionada# mes yGo a=o. a=o# mes# d<a M calendar.&etBdate38 El control Aalendar puede &enerar "arias se=ales que indican la seleccin y cam$io de la fec a. 5os nom$res de estas se=ales son autoexplicati"os# y son) mont Bc an&ed Q cam$io de mes dayBselected Q d<a seleccionado dayBselectedBdou$leBclic( Q do$le clic en d<a seleccionado pre"Bmont nextBmont pre"Byear nextByear Q mes anterior Q mes si&uiente Q a=o anterior Q a=o si&uiente

Esto nos deja con la necesidad de poner todo ello junto en el pro&rama de ejemplo calendar.py. 5a fi&ura 7i&ura D.12# VEjemplo de AalendarioW muestra el resultado del pro&rama) #igura F.1!. E)e"plo de Calendario

El cdi&o fuente es calendar.py) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI QPGusrG$inGen" pyt on Q ejemplo calendar.py Q Q Aopyri& t 3A8 1DDS Aesar 4iquel# 1 a'n T. -mundson# 4attias Gronlund Q Aopyri& t 3A8 2000 Tony Gale Q Aopyri& t 3A8 2001U200C *o n 7inlay Q Q T is pro&ram is free soft'are\ you can redistri$ute it andGor modify Q it under t e terms of t e G?. General Pu$lic 5icense as pu$lis ed $y Q t e 7ree 1oft'are 7oundation\ eit er "ersion 2 of t e 5icense# or Q 3at your option8 any later "ersion. Q Q T is pro&ram is distri$uted in t e ope t at it 'ill $e useful# Q $ut >:T+/.T -?[ >-00-?T[\ 'it out e"en t e implied 'arranty of Q 4E0A+-?T-F:5:T[ or 7:T?E11 7/0 - P-0T:A.5-0 P.0P/1E. 1ee t e Q G?. General Pu$lic 5icense for more details. Q Q [ou s ould a"e recei"ed a copy of t e G?. General Pu$lic 5icense Q alon& 'it t is pro&ram\ if not# 'rite to t e 7ree 1oft'are Q 7oundation# :nc.# IRJ 4ass -"e# Aam$rid&e# 4- 021;D# .1-. import py&t( py&t(.require3N2.0N8 import &t(# pan&o import time class AalendarExample) @E7BP-@ M 10 @E7BP-@B14-55 M J T4B[E-0BF-1E M 1D00 calendarBs o'B eader M 0 calendarBs o'Bdays M 1 calendarBmont Bc an&e M 2 calendarBs o'B'ee( M ; def calendarBdateBtoBstrin&3self8) year# mont # day M self.'indo'.&etBdate38 mytime M time.m(time33year# mont !1# day# 0# 0# 0# 0# 0# U188 return time.strftime3E`xE# time.localtime3mytime88 def calendarBsetBsi&nalBstrin&s3self# si&Bstr8) pre"Bsi& M self.pre"Bsi&.&et38 self.pre"2Bsi&.setBtext3pre"Bsi&8

CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC

pre"Bsi& M self.lastBsi&.&et38 self.pre"Bsi&.setBtext3pre"Bsi&8 self.lastBsi&.setBtext3si&Bstr8 def calendarBmont Bc an&ed3self# 'id&et8) $uffer M Emont Bc an&ed) `sE ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 def calendarBdayBselected3self# 'id&et8) $uffer M EdayBselected) `sE ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 def calendarBdayBselectedBdou$leBclic(3self# 'id&et8) $uffer M EdayBselectedBdou$leBclic() `sE $uffer M $uffer ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 year# mont # day M self.'indo'.&etBdate38 if self.mar(edBdate^dayU1_ MM 0) self.'indo'.mar(Bday3day8 self.mar(edBdate^dayU1_ M 1 else) self.'indo'.unmar(Bday3day8 self.mar(edBdate^dayU1_ M 0 def calendarBpre"Bmont 3self# 'id&et8) $uffer M Epre"Bmont ) `sE ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 def calendarBnextBmont 3self# 'id&et8) $uffer M EnextBmont ) `sE ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 def calendarBpre"Byear3self# 'id&et8) $uffer M Epre"Byear) `sE ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 def calendarBnextByear3self# 'id&et8) $uffer M EnextByear) `sE ` self.calendarBdateBtoBstrin&38 self.calendarBsetBsi&nalBstrin&s3$uffer8 def calendarBsetBfla&s3self8) options M 0 for i in ran&e3J8) if self.settin&s^i_) options M options ! 31ggi8 if self.'indo')

DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122 12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2

self.'indo'.displayBoptions3options8 def calendarBto&&leBfla&3self# to&&le8) jM0 for i in ran&e3J8) if self.fla&Bc ec($oxes^i_ MM to&&le) jMi self.settin&s^j_ M not self.settin&s^j_ self.calendarBsetBfla&s38 def calendarBfontBselectionBo(3self# $utton8) self.font M self.fontBdialo&.&etBfontBname38 if self.'indo') fontBdesc M pan&o.7ont@escription3self.font8 if fontBdesc) self.'indo'.modifyBfont3fontBdesc8 def calendarBselectBfont3self# $utton8) if not self.fontBdialo&) 'indo' M &t(.7ont1election@ialo&3E7ont 1election @ialo&E8 self.fontBdialo& M 'indo' 'indo'.setBposition3&t(.>:?BP/1B4/.1E8 'indo'.connect3EdestroyE# self.fontBdialo&Bdestroyed8 'indo'.o(B$utton.connect3Eclic(edE# self.calendarBfontBselectionBo(8 'indo'.cancelB$utton.connectBo$ject3Eclic(edE# lam$da 'id) 'id.destroy38# self.fontBdialo&8 'indo' M self.fontBdialo& if not 3'indo'.fla&s38 h &t(.T:1:F5E8) 'indo'.s o'38 else) 'indo'.destroy38 self.fontBdialo& M ?one def fontBdialo&Bdestroyed3self# dataM?one8) self.fontBdialo& M ?one def BBinitBB3self8) fla&s M ^ E1 o' +eadin&E# E1 o' @ay ?amesE# E?o 4ont A an&eE# E1 o' >ee( ?um$ersE#

1C; 1CC 1CJ 1CI 1CR 1CS 1CD 1J0 1J1 1J2 1J; 1JC 1JJ 1JI 1JR 1JS 1JD 1I0 1I1 1I2 1I; 1IC 1IJ 1II 1IR 1IS 1ID 1R0 1R1 1R2 1R; 1RC 1RJ 1RI 1RR 1RS 1RD 1S0 1S1 1S2 1S; 1SC 1SJ 1SI 1SR 1SS 1SD 1D0

_ self.'indo' M ?one self.font M ?one self.fontBdialo& M ?one self.fla&Bc ec($oxes M JZ^?one_ self.settin&s M JZ^0_ self.mar(edBdate M ;1Z^0_ 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBtitle3EAalendar ExampleE8 'indo'.setB$orderB'idt 3J8 'indo'.connect3EdestroyE# lam$da x) &t(.mainBquit388 'indo'.setBresiza$le3&t(.7-51E8 "$ox M &t(.TFox3&t(.7-51E# self.@E7BP-@8 'indo'.add3"$ox8 Q 5a parte superior de la "entana# el Aalendario# las opcines y fuente. $ox M &t(.+Fox3&t(.7-51E# self.@E7BP-@8 "$ox.pac(Bstart3 $ox# &t(.T0.E# &t(.T0.E# self.@E7BP-@8 $$ox M &t(.+FuttonFox38 $ox.pac(Bstart3 $$ox# &t(.7-51E# &t(.7-51E# self.@E7BP-@8 $$ox.setBlayout3&t(.F.TT/?F/6B1P0E-@8 $$ox.setBspacin&3J8 Q Aontrol calendario frame M &t(.7rame3EAalendarE8 $$ox.pac(Bstart3frame# &t(.7-51E# &t(.T0.E# self.@E7BP-@8 calendar M &t(.Aalendar38 self.'indo' M calendar self.calendarBsetBfla&s38 calendar.mar(Bday31D8 self.mar(edBdate^1DU1_ M 1 frame.add3calendar8 calendar.connect3Emont Bc an&edE# self.calendarBmont Bc an&ed8 calendar.connect3EdayBselectedE# self.calendarBdayBselected8 calendar.connect3EdayBselectedBdou$leBclic(E# self.calendarBdayBselectedBdou$leBclic(8 calendar.connect3Epre"Bmont E# self.calendarBpre"Bmont 8 calendar.connect3EnextBmont E# self.calendarBnextBmont 8 calendar.connect3Epre"ByearE# self.calendarBpre"Byear8 calendar.connect3EnextByearE# self.calendarBnextByear8 separator M &t(.T1eparator38 $ox.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# 08 "$ox2 M &t(.TFox3&t(.7-51E# self.@E7BP-@8

1D1 1D2 1D; 1DC 1DJ 1DI 1DR 1DS 1DD 200 201 202 20; 20C 20J 20I 20R 20S 20D 210 211 212 21; 21C 21J 21I 21R 21S 21D 220 221 222 22; 22C 22J 22I 22R 22S 22D 2;0 2;1 2;2 2;; 2;C 2;J 2;I 2;R 2;S

$ox.pac(Bstart3"$ox2# &t(.7-51E# &t(.7-51E# self.@E7BP-@8 Q Arear el frame derec o con sus opciones frame M &t(.7rame3E7la&sE8 "$ox2.pac(Bstart3frame# &t(.T0.E# &t(.T0.E# self.@E7BP-@8 "$ox; M &t(.TFox3&t(.T0.E# self.@E7BP-@B14-558 frame.add3"$ox;8 for i in ran&e3len3fla&s88) to&&le M &t(.A ec(Futton3fla&s^i_8 to&&le.connect3Eto&&ledE# self.calendarBto&&leBfla&8 "$ox;.pac(Bstart3to&&le# &t(.T0.E# &t(.T0.E# 08 self.fla&Bc ec($oxes^i_ M to&&le Q Arear el $otn de fuentes derec o $utton M &t(.Futton3E7ont...E8 $utton.connect3Eclic(edE# self.calendarBselectBfont8 "$ox2.pac(Bstart3$utton# &t(.7-51E# &t(.7-51E# 08 Q Arear la parte relati"o a se=ales frame M &t(.7rame3E1i&nal e"entsE8 "$ox.pac(Bstart3frame# &t(.T0.E# &t(.T0.E# self.@E7BP-@8 "$ox2 M &t(.TFox3&t(.T0.E# self.@E7BP-@B14-558 frame.add3"$ox28 $ox M &t(.+Fox 3&t(.7-51E# ;8 "$ox2.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# 08 la$el M &t(.5a$el3E1i&nal)E8 $ox.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 self.lastBsi& M &t(.5a$el3EE8 $ox.pac(Bstart3self.lastBsi&# &t(.7-51E# &t(.T0.E# 08 $ox M &t(.+Fox 3&t(.7-51E# ;8 "$ox2.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# 08 la$el M &t(.5a$el3EPre"ious si&nal)E8 $ox.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 self.pre"Bsi& M &t(.5a$el3EE8 $ox.pac(Bstart3self.pre"Bsi&# &t(.7-51E# &t(.T0.E# 08 $ox M &t(.+Fox 3&t(.7-51E# ;8 "$ox2.pac(Bstart3 $ox# &t(.7-51E# &t(.T0.E# 08 la$el M &t(.5a$el3E1econd pre"ious si&nal)E8 $ox.pac(Bstart3la$el# &t(.7-51E# &t(.T0.E# 08 self.pre"2Bsi& M &t(.5a$el3EE8 $ox.pac(Bstart3self.pre"2Bsi&# &t(.7-51E# &t(.T0.E# 08 $$ox M &t(.+FuttonFox 38

2;D "$ox.pac(Bstart3$$ox# &t(.7-51E# &t(.7-51E# 08 2C0 $$ox.setBlayout3&t(.F.TT/?F/6BE?@8 2C1 2C2 $utton M &t(.Futton3EAloseE8 2C; $utton.connect3Eclic(edE# lam$da ') &t(.mainBquit388 2CC $$ox.add3$utton8 2CJ $utton.setBfla&s3&t(.A-?B@E7-.5T8 2CI $utton.&ra$Bdefault38 2CR 2CS 'indo'.s o'Ball38 2CD 2J0 def main38) 2J1 &t(.main38 2J2 return 0 2J; 2JC if BBnameBB MM EBBmainBBE) 2JJ AalendarExample38 2JI main38 F.1/. %eleccin de Color El control de seleccin de color es# como ca$e de esperar# un control para seleccionar colores interacti"amente. Este control compuesto permite al usuario seleccionar un color manipulando triples 0GF 30ojo# Terde# -zul8 y +1T 3Tono# 1aturacin# Talor8. Esto se consi&ue ajustando "alores simples con deslizadores o entradas# o aciendo clic en el color deseado en una rueda de tonoUsaturacin y una $arra de "alor. /pcionalmente# la opacidad del color tam$i%n se puede especificar. El control de seleccin de color solo emite una se=al por a ora# EcolorBc an&edE# que se emite siempre que el color actual del control cam$ie# $ien porque el usuario lo cam$ia o porque se especifique expl<citamente a tra"%s del m%todo setBcolor38 . Teamos lo que nos ofrece el control de seleccin de color. El control "iene en dos sa$ores) &t(.Aolor1election y &t(.Aolor1election@ialo&. colorsel M &t(.Aolor1election38 Pro$a$lemente no se use este constructor directamente. 1e crea un control Aolor1election uerfano que a$r<a que emparentar uno mismo. El control Aolor1election ereda del control TFox. colorseldl& M &t(.Aolor1election@ialo&3title8 donde title 3t<tulo8 es una cadena usada para la $arra de t<tulo del di9lo&o. Este es el constructor m9s com2n del selector de color. Area un Aolor1election@ialo&. ]ste consiste en un 7rame que contiene un control Aolor1election# un +1eparator y un +Fox con tres $otones# /(# Aancelar y -yuda. 1e pueden o$tener estos $otones accediendo a los atri$utos ok_button# cancel_button y help_button del Aolor1election@ialo&# 3por ejemplo# colorseldlg.ok_button8. El control Aolor1election es accesi$le usando la "aria$le colorsel)

colorsel M colorseldl&.colorsel El control Aolor1election tiene unos cuantos m%todos que cam$ian sus caracter<sticas o proporcionan acceso a la seleccin de color. colorsel.setB asBopacityBcontrol3has.opacity8 El control de seleccin de color permite ajustar la opacidad de un color 3tam$i%n conocida como el canal alfa8. Esto esta desacti"ado por defecto. 5lamando a este m%todo con has_opacity i&ual T0.E acti"a la opacidad. @e la misma forma# has_opacity i&ual a 7-51E desacti"ar9 la opacidad. colorsel.setBcurrentBcolor3color8 colorsel.setBcurrentBalp a3alpha8 Puedes poner el color actual expl<citamente llamando al m%todo setBcurrentBcolor38 con un Gd(Aolor. 5a opacidad 3canal alfa8 se pone con el m%todo setBcurrentBalp a38.El "alor del canal alfa alpha de$e estar entre 0 3completamente transparente8 y IJI;I 3completamente opaco8. color M colorsel.&etBcurrentBcolor38 alp a M colorsel.&etBcurrentBalp a38 Auando se ten&a que mirar el color actual# t<picamente al reci$ir la se=al EcolorBc an&edE# se pueden usar esos m%todos. El pro&rama de ejemplo colorsel.py demuestra el uso del Aolor1election@ialo&. Este pro&rama muestra una "entana que contiene un 9rea de di$ujo. -l acer clic en ella se a$re un di9lo&o de seleccin de color# y cam$iando el color en dic o di9lo&o se cam$ia el color de fondo. 5a fi&ura 7i&ura D.1;# VEjemplo de @i9lo&o de 1eleccin de AolorW muestra el pro&rama en accin) #igura F.1/. E)e"plo de Bi5logo de %eleccin de Color

El cdi&o fuente de colorsel.py es) 1 2 ; C J I R S D 10 11 12 QPGusrG$inGen" pyt on Q ejemplo colorsel.py import py&t( py&t(.require3N2.0N8 import &t( class Aolor1electionExample) Q manejador de cam$io de Aolor def colorBc an&edBc$3self# 'id&et8) Q /$tenemos el mapa de color del 9rea de di$ujo

1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0

colormap M self.dra'in&area.&etBcolormap38 Q /$tenemos el color actual color M self.colorseldl&.colorsel.&etBcurrentBcolor38 Q 7ijamos el color de fondo de la "entana self.dra'in&area.modifyB$&3&t(.1T-TEB?/04-5# color8 Q manejador de e"entos del 9rea de di$ujo def areaBe"ent3self# 'id&et# e"ent8) andled M &t(.7-51E Q Aompro$amos si se a reci$ido un e"ento de pulsacin de $otn if e"ent.type MM &t(.&d(.F.TT/?BP0E11) andled M &t(.T0.E Q Areamos el di9lo&o de seleccin de color if self.colorseldl& MM ?one) self.colorseldl& M &t(.Aolor1election@ialo&3 E1elect $ac(&round colorE8 Q /$tenemos el control Aolor1election colorsel M self.colorseldl&.colorsel colorsel.setBpre"iousBcolor3self.color8 colorsel.setBcurrentBcolor3self.color8 colorsel.setB asBpalette3&t(.T0.E8 Q 5o conectamos a la se=al EcolorBc an&edE colorsel.connect3EcolorBc an&edE# self.colorBc an&edBc$8 Q 4ostramos el di9lo&o response M self.colorseldl&.run38 if response UU &t(.0E1P/?1EB/K) self.color M colorsel.&etBcurrentBcolor38 else) self.dra'in&area.modifyB$&3&t(.1T-TEB?/04-5# self.color8 self.colorseldl&. ide38 return andled Q manejador de cierre y salida def destroyB'indo'3self# 'id&et# e"ent8) &t(.mainBquit38 return &t(.T0.E def BBinitBB3self8)

I1 self.colorseldl& M ?one I2 Q creacin de la "entana principal# t<tulo y pol<ticas I; 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 IC 'indo'.setBtitle3EAolor selection testE8 IJ 'indo'.setBresiza$le3&t(.T0.E8 II IR Q 5a conectamos a los e"entos EdeleteE y EdestroyE para poder salir IS 'indo'.connect3EdeleteBe"entE# self.destroyB'indo'8 ID R0 Q Areamos un 9rea de di$ujo# fijamos su tama=o y capturamos e"entos de $otn R1 self.dra'in&area M &t(.@ra'in&-rea38 R2 R; self.color M self.dra'in&area.&etBcolormap38.allocBcolor30# IJJ;J# 08 RC RJ self.dra'in&area.setBsizeBrequest3200# 2008 RI self.dra'in&area.setBe"ents3&t(.&d(.F.TT/?BP0E11B4-1K8 RR self.dra'in&area.connect3Ee"entE# self.areaBe"ent8 RS RD Q -=adimos el 9rea de di$ujo a la "entana y mostramos am$os controles S0 'indo'.add3self.dra'in&area8 S1 self.dra'in&area.s o'38 S2 'indo'.s o'38 S; SC def main38) SJ &t(.main38 SI return 0 SR SS if BBnameBB MM EBBmainBBE) SD Aolor1electionExample38 D0 main38 F.12. %electores de #ichero El control de seleccin de fic ero es una forma r9pida y f9cil de mostrar una caja de di9lo&o de 7ic ero. Tiene con $otones /(# Aancelar y -yuda# por lo que es estupendo para a orrase tiempo de pro&ramacin. Para crear una nue"a caja de seleccin de fic ero se usa) filesel M &t(.7ile1election3titleM?one8 Para fijar el nom$re de fic ero# por ejemplo para mostrar un directorio espec<fico# o esta$lecer un fic ero predeterminado# usa este m%todo) filesel.setBfilename3-ilena"e8 Para o$tener el nom$re de fic ero que el usuario a escrito o seleccionado# se usa este m%todo)

filename M filesel.&etBfilename38 Tam$i%n ay referencias a los controles contenidos en el control de seleccin de fic eros. Estos son los atri$utos) filesel.dirBlist Q lista de directorios filesel.fileBlist Q lista de fic eros filesel.selectionBentry Q entrada de seleccin filesel.selectionBtext Q texto de seleccin filesel.mainB"$ox Q caja "ertical principal filesel.o(B$utton Q $otn o( filesel.cancelB$utton Q $otn cancelar filesel. elpB$utton Q $otn ayuda filesel. istoryBpulldo'n Q lista de istoria filesel. istoryBmenu Q men2 de istoria filesel.fileopBdialo& Q di9lo&o filesel.fileopBentry Q entrada filesel.fileopBfile Q fic ero filesel.fileopBcBdir Q cam$io de directorio filesel.fileopBdelBfile Q $orrar fic ero filesel.fileopBrenBfile Q renom$rar fic ero filesel.$uttonBarea Q 9rea de $otones filesel.actionBarea Q 9rea de accin 5o m9s pro$a$le es que se quieran usar los atri$utos ok_button# cancel_button# y help_button para conectar sus se=ales a las retrollamadas. El pro&rama de ejemplo -ilesel.py ilustra el uso del control de seleccin de fic eros. Aomo se puede "er# no ay muc o m9s que decir para crear un control de seleccin de fic eros. -unque en este ejemplo el $otn -yuda aparece en pantalla# no ace nada porque no ay nin&una se=al conectada a %l. 5a fi&ura 7i&ura D.1C# VEjemplo de 1eleccin de 7ic erosW muestra la pantalla resultante) #igura F.12. E)e"plo de %eleccin de #icheros

El cdi&o fuente de filesel.py es) 1 2 ; C J I R S D 10 11 QPGusrG$inGen" pyt on Q ejemplo filesel.py import py&t( py&t(.require3N2.0N8 import &t( class 7ile1electionExample) Q /$tener el nom$re del fic ero seleccionado e imprimirlo a la consola def fileBo(Bsel3self# '8)

12 print E`sE ` self.file'.&etBfilename38 1; 1C def destroy3self# 'id&et8) 1J &t(.mainBquit38 1I 1R def BBinitBB3self8) 1S Q Areamos un nue"o control de seleccin de fic ero 1D self.file' M &t(.7ile1election3E7ile selectionE8 20 21 self.file'.connect3EdestroyE# self.destroy8 22 Q Aonectar o(B$utton al m%todo fileBo(Bsel 2; self.file'.o(B$utton.connect3Eclic(edE# self.fileBo(Bsel8 2C 2J Q Aonectar cancelB$utton para destruir el control 2I self.file'.cancelB$utton.connect3Eclic(edE# 2R lam$da ') self.file'.destroy388 2S 2D Q 7ijamos el nom$re de fic ero# como si fuese un di9lo&o de &uardado# ;0 Q y damos un nom$re por defecto ;1 self.file'.setBfilename3Epen&uin.pn&E8 ;2 ;; self.file'.s o'38 ;C ;J def main38) ;I &t(.main38 ;R return 0 ;S ;D if BBnameBB MM EBBmainBBE) C0 7ile1electionExample38 C1 main38 F.1;. Bi5logo de %eleccin de #uentes El @i9lo&o de 1eleccin de 7uentes permite al usuario seleccionar una fuente de forma interacti"a. El di9lo&o contiene un control 7ont1election y $otones de /K y Aancelar. .n $otn de -plicar tam$i%n est9 disponi$le en el di9lo&o# pero inicialmente est9 oculto. El @i9lo&o de 1eleccin de 7uentes permite al usuario seleccionar una fuente de las fuentes de sistema disponi$les 3las mismas que se o$tienen al usar xls-onts8. 5a fi&ura 7i&ura D.1J# V@i9lo&o de 1eleccin de 7uentesW ilustra un 7ont1election@ialo& ) #igura F.1;. Bi5logo de %eleccin de #uentes

El di9lo&o contiene un conjunto de tres fic as que proporcionan) una interfaz para seleccionar la fuente# el estilo y el tama=o informacin detallada so$re la fuente seleccionada

una interfaz para el mecanismo de filtrado de fuente que restrin&e las fuentes disponi$les para seleccionar 5a funcin para crear un 7ont1election@ialo& es) fontseldl& M &t(.7ont1election@ialo&3title8 El title 3t<tulo8 es una cadena que se usar9 en el texto de la $arra de t<tulo. .na instancia de un @i9lo&o de 1eleccin de 7uentes tiene "arios atri$utos) fontsel mainB"$ox actionBarea o(B$utton applyB$utton cancelB$utton El atri$uto fontsel es una referencia al control de seleccin de fuente. main_vbox es una referencia a la &t(.TFox que contiene el fontsel y el action_area en el di9lo&o. El atri$uto action_area es una referencia a la &t(.+FuttonFox que contiene los $otones /K# -plicar y Aancelar. 5os atri$utos ok_button# cancel_button y apply_button son referencias a los $otones /K# Aancelar y -plicar que se pueden usar para realizar las conexiones a las se=ales de los $otones. 5a referencia apply_button tam$i%n se puede usar para mostrar el $otn -plicar mediante el m%todo s o'38 . 1e puede fijar la fuente inicial que se mostrar9 en el di9lo&o usando el m%todo) fontseldl&.setBfontBname3-ontna"e8 El ar&umento fontname es el nom$re de una fuente de sistema completo o parcialmente especificado. Por ejemplo) fontseldl&.setBfontBname3NUado$eUcourierU$oldUZUZUZUZU120UZUZUZUZUZUZN8 especifica una fuente inicial parcialmente. El nom$re de la fuente seleccionada se puede o$tener con el m%todo) fontBname M fontseldl&.&etBfontBname38 El @i9lo&o de 1eleccin de 7uentes tiene un 9rea de pre"isualizacin que muestra texto usando la fuente seleccionada. El texto que se usa en el 9rea de pre"isualizacin se puede esta$lecer con el m%todo) fontseldl&.setBpre"ie'Btext3text8 El texto de pre"isualizacin se puede o$tener con el m%todo) text M fontseldl&.&etBpre"ie'Btext38 El pro&rama de ejemplo calendar.py usa un di9lo&o de seleccin de fuentes para seleccionar la fuente que se usa para mostrar la informacin del calendario. 5as lineas 10JU

110 definen una retrollamada para o$tener el nom$re de la fuente a partir del @i9lo&o de 1eleccin de 7uentes y lo usa para fijar la fuente para el control del calendario. 5as lineas 112U1;1 definen el m%todo que crea un @i9lo&o de 1eleccin de 7uentes# confi&ura las retrollamadas para los $otones /K y Aancelar y muestra el di9lo&o. Captulo 1G. Controles Contenedores Tabla de contenidos 10.1. 5a Aaja de E"entos 3E"entFox8 10.2. El control -lineador 10.;. Aontenedor 7ijo 37ixed8 10.C. Aontenedor de @isposicin 35ayout8 10.J. 4arcos 37rame8 10.I. 4arcos Proporcionales 3-spect7rame8 10.R. Aontroles de Panel 3+Paned y TPaned8 10.S. Tistas 3Tie'port8 10.D. Tentanas de @esplazamiento 31crolled>indo'8 10.10. Aajas de Fotones 3FuttonFoxes8 10.11. Farra de +erramientas 3Tool$ar8 10.12. 7ic as 3?ote$oo(8 10.1;. Elementos incrusta$les y puntos de conexin 3Plu&s y 1oc(ets8 10.1;.1. Elementos incrusta$les 3Plu&s8 10.1;.2. Puntos de Aonexin 31oc(ets8 1G.1. 7a Ca)a de E0entos 8E0ent=ox9 -l&unos controles GTK no tienen "entanas 6 asociadas# por lo que simplemente se di$ujan encima de sus padres. - causa de esto# no pueden reci$ir e"entos y si se dimensionan incorrectamente# no pueden recortarse por lo que puedes "er partes mal# etc. 1i se necesita m9s de estos controles# la E"entFox 3Aaja de E"entos8 es lo que se necesita. - primera "ista# el control E"entFox puede aparecer completamente in2til. ?o di$uja nada en la pantalla y no responde a nin&2n e"ento. 1in em$ar&o# tiene una funcin U proporciona una "entana 6 a sus controles ijos. Esto es importante ya que muc os controles GTK no tienen una "entana 6 asociada. ?o tener una "entana 6 a orra memoria y mejora el rendimiento# pero tam$i%n tiene incon"enientes. .n control sin "entana 6 no puede reci$ir e"entos# no realiza nin&un recortado so$re sus contenidos y no puede esta$lecer su color de fondo. -unque el nom$re E"entFox enfatiza la funcin de manejador de e"entos# el control tam$i%n se puede usar para recorte. 3y m9s# mira el ejemplo m9s a$ajo8. Para crear un nue"o control E"entFox# se usa) e"entB$ox M &t(.E"entFox38 .n control ijo se puede a=adir a esta event_box) e"entB$ox.add3(idget8 El pro&rama de ejemplo e0entbox.py muestra dos usos de un E"entFox U se crea una

etiqueta y se recorta en una caja peque=a# tiene un fondo "erde y se a confi&urado para que un clic de ratn en la etiqueta a&a que el pro&rama termine. -l redimensionar la "entana se cam$ian cantidades en la etiqueta. 5a fi&ura Figura 1$.1, Ejemp o !e %aja !e E&entos muestra la "entana del pro&rama) #igura 1G.1. E)e"plo de Ca)a de E0entos

El cdi&o fuente de e0entbox.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S QPGusrG$inGen" pyt on Q ejemplo e"ent$ox.py import py&t( py&t(.require3N2.0N8 import &t( class E"entFoxExample) def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBtitle3EE"ent FoxE8 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 'indo'.setB$orderB'idt 3108 Q Areamos una E"entFox y la a=adimos a la "entana principal e"entB$ox M &t(.E"entFox38 'indo'.add3e"entB$ox8 e"entB$ox.s o'38 Q Areamos una etiqueta lar&a la$el M &t(.5a$el3EAlic( ere to quit# quit# quit# quit# quitE8 e"entB$ox.add3la$el8 la$el.s o'38 Q 5a recortamos la$el.setBsizeBrequest3110# 208 Q [ conectamos una accin a la misma e"entB$ox.setBe"ents3&t(.&d(.F.TT/?BP0E11B4-1K8 e"entB$ox.connect3E$uttonBpressBe"entE# lam$da '#e) &t(.mainBquit388 Q 49s cosas para las que se necesita una "entana de 6 ... e"entB$ox.realize38 e"entB$ox.'indo'.setBcursor3&t(.&d(.Aursor3&t(.&d(.+-?@188 Q Poner el fondo en "erde e"entB$ox.modifyB$&3&t(.1T-TEB?/04-5#

;D e"entB$ox.&etBcolormap38.allocBcolor3E&reenE88 C0 C1 'indo'.s o'38 C2 C; def main38) CC &t(.main38 CJ return 0 CI CR if BBnameBB MM EBBmainBBE) CS E"entFoxExample38 CD main38 1G.!. El control 3lineador El control -li&nment 3-lineador8 permite colocar un control dentro de su "entana con una posicin y un tama=o relati"os al tama=o del propio control -li&nment. Por ejemplo# puede ser 2til para centrar un control dentro de la "entana. 1lo ay dos llamadas asociadas al control -li&nment) ali&nment M &t(.-li&nment3xalignM0.0# yalignM0.0# xscaleM0.0# yscaleM0.08 ali&nment.set3xalign# yalign# xscale# yscale8 5a funcin &t(.-li&nment38 crea un nue"o control -li&nment con los par9metros especificados. El m%todo set38 permite alterar los par9metros de alineacin de un control -li&nment existente. 5os cuatro par9metros son n2meros en coma flotante que pueden estar entre 0.0 y 1.0. 5os ar&umentos xalign y yalign afectan a la posicin del control dentro del -li&nment. 5as propiedades de alineacin especifican la fraccin de espacio libre que se colocar9 por encima o a la izquierda del control ijo. 1us "aloren "an de 0.0 3sin espacio libre por encima o a la izquierda del ijo8 a 1.0 3todo espacio libre o a la izquierda del ijo8. ?aturalmente# si las dos propiedades de escala est9n puestas a 1.0# entonces las propiedades de alineacin no tienen efecto# puesto que el control ijo se expandir9 para llenar el espacio disponi$le. 5os ar&umentos xscale e yscale especifican la fraccin de espacio libre a$sor$ido por el control ijo. 5os "alores pueden "ariar desde 0.0 3el ijo no a$sor$e nada8 asta 1.0 3el ijo toma todo el espacio libre. .n control ijo puede a=adirse a este -li&nment usando) ali&nment.add3(idget8 Para un ejemplo del uso de un control -li&nment# consulte el ejemplo del control de Farra de Pro&reso progressbar.py 1G./. Contenedor #i)o 8#ixed9 El contenedor 7ixed 37ijo8 permite situar controles en una posicin fija dentro de su

"entana# relati"a a su esquina superior izquierda. 5a posicin de los controles se puede cam$iar din9micamente. 1lo ay dos llamadas asociadas al control fijo) fixed M &t(.7ixed38 fixed.put3(idget# x# y8 fixed.mo"e3(idget# x# y8 5a funcin &t(.7ixed38 permite crear un nue"o contenedor 7ixed. El m%todo put38 coloca al control en el contenedor fijo en la posicin especificada por x e y. El m%todo mo"e38 te permite mo"er el control especificado a una nue"a posicin. El ejemplo -ixed.py ilustra cmo usar el contenedor 7ixed . 5a fi&ura 7i&ura 10.2# VEjemplo de 7ijoW muestra el resultado) #igura 1G.!. E)e"plo de #i)o

El cdi&o fuente de -ixed.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I QPGusrG$inGen" pyt on Q ejemplo fixed.py import py&t( py&t(.require3N2.0N8 import &t( class 7ixedExample) Q Esta retrollamada mue"e el $otn a una nue"a posicin Q en el contenedor 7ixed. def mo"eB$utton3self# 'id&et8) self.x M 3self.x!;08`;00 self.y M 3self.y!J08`;00 self.fixed.mo"e3'id&et# self.x# self.y8 def BBinitBB3self8) self.x M J0 self.y M J0 Q Areamos una nue"a "entana 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBtitle3E7ixed AontainerE8 Q Aonectamos el e"ento EdestroyE a un manejador de se=ales 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388

2R 2S Q 7ija el &rosor del $orde de "entana 2D 'indo'.setB$orderB'idt 3108 ;0 ;1 Q Areamos un contenedor 7ixed ;2 self.fixed M &t(.7ixed38 ;; 'indo'.add3self.fixed8 ;C self.fixed.s o'38 ;J ;I for i in ran&e31# C8) ;R Q Area un nue"o ton con la etiqueta EPress meE ;S $utton M &t(.Futton3EPress meE8 ;D C0 Q Auando el $otn reci$e la se=al Eclic(edE llamar9 al C1 Q m%todo mo"eB$utton38. C2 $utton.connect3Eclic(edE# self.mo"eB$utton8 C; CC Q Empaquetamos el $otn en la "entana del contenedor fijo CJ self.fixed.put3$utton# iZJ0# iZJ08 CI CR Q El paso final es mostrar el control reci%n creado CS $utton.s o'38 CD J0 Q 4ostramos la "entana J1 'indo'.s o'38 J2 J; def main38) JC Q Entramos en el $ucle de e"entos JJ &t(.main38 JI return 0 JR JS if BBnameBB MM EBBmainBBE) JD 7ixedExample38 I0 main38 1G.2. Contenedor de Bisposicin 87ayout9 El contenedor 5ayout 3@isposicin8 es similar al contenedor 7ixed 37ijo8 excepto en que implementa un 9rea de desplazamiento infinita 3donde infinito es menor que 2i;28. El sistema de "entanas 6 tiene una limitacin que ace uqe las "entanas slo puedan tener ;2RIR p<xeles de anc o o alto. El contenedor 5ayout soluciona esta limitacin aciendo al&unos trucos exticos mediante el uso de &ra"edad de "entana y de $it# para que se ten&a un desplazamiento sua"e incluso cuando se tienen muc os controles en el 9rea de desplazamiento. .n contenedor 5ayout se crea con) layout M &t(.5ayout3had)ust"entM?one# 0ad)ust"entM?one8

Aomo se puede "er# se puede especificar opcionalmente los o$jetos -djustment que el control 5ayout usar9 para su desplazamiento. 1i no se especifican los o$jetos -djustment# se crear9n unos nue"os. 1e pueden a=adir y mo"er controles en el contenedor 5ayout usando los dos m%todos si&uientes) layout.put3child.(idget# x# y8 layout.mo"e3child.(idget# x# y8 El tama=o del contenedor 5ayout se puede esta$lecer y consultar usando los si&uientes m%todos) layout.setBsize3(idth# height8 size M layout.&etBsize38 5os 2ltimos cuatro m%todos para los controles 5ayout 'id&ets son para manipular los controles de ajuste orizontal y "ertical) adj M layout.&etB adjustment38 "adj M layout.&etB"adjustment38 layout.setB adjustment3ad)ust"ent8 layout.setB"adjustment3ad)ust"ent8 El pro&rama de ejemplo layout.py crea tres $otones y los pone en un control disposicin. Auando se ace clic en un $otn# se mue"e a una posicin aleatoria en el control disposicin. 5a fi&ura 7i&ura 10.;# VEjemplo de @isposicinW ilustra la "entana inicial del pro&rama) #igura 1G./. E)e"plo de Bisposicin

El cdi&o fuente de layout.py es) 1 2 ; C J I R S D QPGusrG$inGen" pyt on Q ejemplo layout.py import py&t( py&t(.require3N2.0N8 import &t( import random

10 class 5ayoutExample) 11 def >indo'@eleteE"ent3self# 'id&et# e"ent8) 12 Q de"ol"emos false para que se destruya la "entana 1; return &t(.7-51E 1C 1J def >indo'@estroy3self# 'id&et# Zdata8) 1I Q salimos del $ucle principal 1R &t(.mainBquit38 1S 1D def FuttonAlic(ed3self# $utton8) 20 Q mo"emos el $otn 21 self.layout.mo"e3$utton# random.randint30#J008# 22 random.randint30#J0088 2; 2C def BBinitBB3self8) 2J Q creamos la "entana principal 2I 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 2R 'indo'.setBtitle3E5ayout ExampleE8 2S 'indo'.setBdefaultBsize3;00# ;008 2D 'indo'.connect3EdeleteUe"entE# self.>indo'@eleteE"ent8 ;0 'indo'.connect3EdestroyE# self.>indo'@estroy8 ;1 Q creamos la ta$la y la empaquetamos en la "entana ;2 ta$le M &t(.Ta$le32# 2# &t(.7-51E8 ;; 'indo'.add3ta$le8 ;C Q creamos el control disposicin y lo empaquetamos en la ta$la ;J self.layout M &t(.5ayout3?one# ?one8 ;I self.layout.setBsize3I00# I008 ;R ta$le.attac 3self.layout# 0# 1# 0# 1# &t(.7:55b&t(.E6P-?@# ;S &t(.7:55b&t(.E6P-?@# 0# 08 ;D Q creamos las $arras de desplazamiento y las empaquetamos tam$i%n C0 "1croll$ar M &t(.T1croll$ar3?one8 C1 ta$le.attac 3"1croll$ar# 1# 2# 0# 1# &t(.7:55b&t(.1+0:?K# C2 &t(.7:55b&t(.1+0:?K# 0# 08 C; 1croll$ar M &t(.+1croll$ar3?one8 CC ta$le.attac 3 1croll$ar# 0# 1# 1# 2# &t(.7:55b&t(.1+0:?K# CJ &t(.7:55b&t(.1+0:?K# 0# 08 CI Q indicamos a las $arras de desp. que usen el ajuste del control disposicin CR "-djust M self.layout.&etB"adjustment38 CS "1croll$ar.setBadjustment3"-djust8 CD -djust M self.layout.&etB adjustment38 J0 1croll$ar.setBadjustment3 -djust8 J1 Q creamos ; $otones ylos ponemos en el control disposicin J2 $utton M &t(.Futton3EPress 4eE8 J; $utton.connect3Eclic(edE# self.FuttonAlic(ed8 JC self.layout.put3$utton# 0# 08 JJ $utton M &t(.Futton3EPress 4eE8 JI $utton.connect3Eclic(edE# self.FuttonAlic(ed8 JR self.layout.put3$utton# 100# 08

JS $utton M &t(.Futton3EPress 4eE8 JD $utton.connect3Eclic(edE# self.FuttonAlic(ed8 I0 self.layout.put3$utton# 200# 08 I1 Q mostramos todos los controles I2 'indo'.s o'Ball38 I; IC def main38) IJ Q entramos en el $ucle principal II &t(.main38 IR return 0 IS ID if BBnameBB MM EBBmainBBE) R0 5ayoutExample38 R1 main38 1G.2. Contenedor de Bisposicin 87ayout9 El contenedor 5ayout 3@isposicin8 es similar al contenedor 7ixed 37ijo8 excepto en que implementa un 9rea de desplazamiento infinita 3donde infinito es menor que 2i;28. El sistema de "entanas 6 tiene una limitacin que ace uqe las "entanas slo puedan tener ;2RIR p<xeles de anc o o alto. El contenedor 5ayout soluciona esta limitacin aciendo al&unos trucos exticos mediante el uso de &ra"edad de "entana y de $it# para que se ten&a un desplazamiento sua"e incluso cuando se tienen muc os controles en el 9rea de desplazamiento. .n contenedor 5ayout se crea con) layout M &t(.5ayout3had)ust"entM?one# 0ad)ust"entM?one8 Aomo se puede "er# se puede especificar opcionalmente los o$jetos -djustment que el control 5ayout usar9 para su desplazamiento. 1i no se especifican los o$jetos -djustment# se crear9n unos nue"os. 1e pueden a=adir y mo"er controles en el contenedor 5ayout usando los dos m%todos si&uientes) layout.put3child.(idget# x# y8 layout.mo"e3child.(idget# x# y8 El tama=o del contenedor 5ayout se puede esta$lecer y consultar usando los si&uientes m%todos) layout.setBsize3(idth# height8 size M layout.&etBsize38 5os 2ltimos cuatro m%todos para los controles 5ayout 'id&ets son para manipular los controles de ajuste orizontal y "ertical)

adj M layout.&etB adjustment38 "adj M layout.&etB"adjustment38 layout.setB adjustment3ad)ust"ent8 layout.setB"adjustment3ad)ust"ent8 El pro&rama de ejemplo layout.py crea tres $otones y los pone en un control disposicin. Auando se ace clic en un $otn# se mue"e a una posicin aleatoria en el control disposicin. 5a fi&ura 7i&ura 10.;# VEjemplo de @isposicinW ilustra la "entana inicial del pro&rama) #igura 1G./. E)e"plo de Bisposicin

El cdi&o fuente de layout.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 QPGusrG$inGen" pyt on Q ejemplo layout.py import py&t( py&t(.require3N2.0N8 import &t( import random class 5ayoutExample) def >indo'@eleteE"ent3self# 'id&et# e"ent8) Q de"ol"emos false para que se destruya la "entana return &t(.7-51E def >indo'@estroy3self# 'id&et# Zdata8) Q salimos del $ucle principal &t(.mainBquit38 def FuttonAlic(ed3self# $utton8) Q mo"emos el $otn self.layout.mo"e3$utton# random.randint30#J008# random.randint30#J0088 def BBinitBB3self8) Q creamos la "entana principal 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBtitle3E5ayout ExampleE8 'indo'.setBdefaultBsize3;00# ;008 'indo'.connect3EdeleteUe"entE# self.>indo'@eleteE"ent8 'indo'.connect3EdestroyE# self.>indo'@estroy8

;1 Q creamos la ta$la y la empaquetamos en la "entana ;2 ta$le M &t(.Ta$le32# 2# &t(.7-51E8 ;; 'indo'.add3ta$le8 ;C Q creamos el control disposicin y lo empaquetamos en la ta$la ;J self.layout M &t(.5ayout3?one# ?one8 ;I self.layout.setBsize3I00# I008 ;R ta$le.attac 3self.layout# 0# 1# 0# 1# &t(.7:55b&t(.E6P-?@# ;S &t(.7:55b&t(.E6P-?@# 0# 08 ;D Q creamos las $arras de desplazamiento y las empaquetamos tam$i%n C0 "1croll$ar M &t(.T1croll$ar3?one8 C1 ta$le.attac 3"1croll$ar# 1# 2# 0# 1# &t(.7:55b&t(.1+0:?K# C2 &t(.7:55b&t(.1+0:?K# 0# 08 C; 1croll$ar M &t(.+1croll$ar3?one8 CC ta$le.attac 3 1croll$ar# 0# 1# 1# 2# &t(.7:55b&t(.1+0:?K# CJ &t(.7:55b&t(.1+0:?K# 0# 08 CI Q indicamos a las $arras de desp. que usen el ajuste del control disposicin CR "-djust M self.layout.&etB"adjustment38 CS "1croll$ar.setBadjustment3"-djust8 CD -djust M self.layout.&etB adjustment38 J0 1croll$ar.setBadjustment3 -djust8 J1 Q creamos ; $otones ylos ponemos en el control disposicin J2 $utton M &t(.Futton3EPress 4eE8 J; $utton.connect3Eclic(edE# self.FuttonAlic(ed8 JC self.layout.put3$utton# 0# 08 JJ $utton M &t(.Futton3EPress 4eE8 JI $utton.connect3Eclic(edE# self.FuttonAlic(ed8 JR self.layout.put3$utton# 100# 08 JS $utton M &t(.Futton3EPress 4eE8 JD $utton.connect3Eclic(edE# self.FuttonAlic(ed8 I0 self.layout.put3$utton# 200# 08 I1 Q mostramos todos los controles I2 'indo'.s o'Ball38 I; IC def main38) IJ Q entramos en el $ucle principal II &t(.main38 IR return 0 IS ID if BBnameBB MM EBBmainBBE) R0 5ayoutExample38 R1 main38 1G.>. 'arcos Proporcionales 83spect#ra"e9 El control de marco proporcional es como un control de marco# excepto en que tam$i%n mantiene el cociente de proporcionalidad 3esto es# el cociente del anc o entre el alto8 del control ijo en un determinado "alor# a=adiendo espacio extra si es necesario. Esto es 2til#

por ejemplo# si se quiere pre"isualizar una ima&en m9s &rande. El tama=o de la pre"isualizacin de$er<a "ariar cuando el usuario redimensione la "entana# pero el cociente de proporcionalidad de$e siempre corresponderse al de la ima&en ori&inal. Para crear un nue"o marco proporcional se utiliza)

aspectBframe M &t(.-spect7rame3labelM?one# xalignM0.J# yalignM0.J# ratioM1.0# obey.childMT0 label especifica el texto a mostrar en el t<tulo. xalign e yalign especifican la alineacin como en el control -li&nment. 1i obey_child es T0.E# el cociente de proporcionalidad de un control ijo se corresponder9 con el cociente de proporcionalidad del tama=o ideal que solicite. En caso contrario# se especifica dic o cociente con el ar&umento ratio. Para cam$iar las opciones de un marco proporcional existente# se puede utilizar) aspectBframe.set3xalignM0.0# yalignM0.0# ratioM1.0# obey.childMT0.E8 Aomo ejemplo# el pro&rama aspect-ra"e.py usa un -spect7rame para presentar un 9rea de di$ujo cuyo cociente de proporcionalidad ser9 siempre 2)1# aunque el usuario redimensione la "entana contenedora. 5a fi&ura 7i&ura 10.J# VEjemplo de 4arco ProporcionalW muestra la "entana del pro&rama) #igura 1G.;. E)e"plo de 'arco Proporcional

El cdi&o fuente del pro&rama aspect-ra"e.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; QPGusrG$inGen" pyt on Q ejemplo aspectframe.py import py&t( py&t(.require3N2.0N8 import &t( class -spect7rameExample) def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58\ 'indo'.setBtitle3E-spect 7rameE8 'indo'.connect3EdestroyE# lam$da x) &t(.mainBquit388 'indo'.setB$orderB'idt 3108 Q Areamos un marco proporcional aspectBframe y lo a=adimos a la "entana aspectBframe M &t(.-spect7rame3E2x1E# Q la$el 0.J# Q center x 0.J# Q center y 2# Q xsizeGysize M 2 &t(.7-51E8 Q i&nore c ildNs aspect 'indo'.add3aspectBframe8 aspectBframe.s o'38

2C 2J Q -=adimos un control ijo al marco proporcional 2I dra'in&Barea M &t(.@ra'in&-rea38 2R 2S Q 1olicitamos una "entana 200x200# pero -spect7rame nos de"ol"er9 una 200x100 2D Q puesto que forzamos una proporcin 2x1 ;0 dra'in&Barea.setBsizeBrequest3200# 2008 ;1 aspectBframe.add3dra'in&Barea8 ;2 dra'in&Barea.s o'38 ;; 'indo'.s o'38 ;C ;J def main38) ;I &t(.main38 ;R return 0 ;S ;D if BBnameBB MM EBBmainBBE) C0 -spect7rameExample38 C1 main38 1G.@. Controles de Panel 8&Paned y $Paned9 5os controles de paneles son 2tiles cuando se quiere di"idir un 9rea en dos partes# con el tama=o relati"o de las dos partes controlado por el usuario. 1e di$uja una $arra entre las dos partes con un man&o que el usuario puede arrastrar para cam$iar la relacin. 5a di"isin puede ser orizontal 3+Paned8 o "ertical 3TPaned8. Para crear una nue"a "entana con panel# se ace una llamada a) pane M &t(.+Paned38 o "pane M &t(.TPaned38 @espu%s de crear el control de panel# ay que a=adir ijos a sus dos mitades. Para acer eso# se usan los m%todos) paned.add13child8 paned.add23child8 El m%todo add138 a=ade el control ijo child a la izquierda o arri$a del control de panel. El m%todo add238 a=ade un control ijo child a la derec a o a$ajo del panel. El pro&rama de ejemplo paned.py crea parte de la interfaz de usuario de un pro&rama de correo electrnico ima&inario. .na "entana se di"ide en dos partes "erticalmente# donde la parte de arri$a es una lista de correos electrnicos y la parte de a$ajo es el texto del mensaje electrnico. 5a mayor<a del pro&rama es $astante sencillo. +ay un par de puntos en los que acer incapie) no se puede a=adir texto a un control Text asta que se realiza. Esto podr<a conse&uirse llamando al m%todo realize38 # pero como demostracin de una t%cnica alternati"a# conectamos un manejador para la se=al ErealizeE para a=adir el texto.

-dem9s# necesitamos a=adir la opcin 1+0:?K 3enco&er8 a al&unos de los elementos de la ta$la que contiene la "entana de texto y sus $arras de desplazamiento# para que cuando la parte de a$ajo se a&a m9s peque=a# las secciones correctas se encojan en "ez de que desaparezcan por la parte de a$ajo de la "entana. 5a fi&ura 7i&ura 10.I# VEjemplo de PanelW muestra el resultado de ejecutar el pro&rama) #igura 1G.>. E)e"plo de Panel

El cdi&o fuente del pro&rama paned.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R QPGusrG$inGen" pyt on Q ejemplo paned.py import py&t( py&t(.require3N2.0N8 import &t(# &o$ject class PanedExample) Q Areamos la lista de EmensajesE def createBlist3self8) Q Areamos una "entana# con desplazamiento si es necesario scrolledB'indo' M &t(.1crolled>indo'38 scrolledB'indo'.setBpolicy3&t(.P/5:A[B-.T/4-T:A# &t(.P/5:A[B-.T/4-T:A8 model M &t(.5ist1tore3&o$ject.T[PEB1T0:?G8 treeB"ie' M &t(.TreeTie'3model8 scrolledB'indo'.addB'it B"ie'port 3treeB"ie'8 treeB"ie'.s o'38 Q -=adimos al&unos mensajes a la "entana for i in ran&e3108) ms& M E4essa&e Q`dE ` i iter M model.append38 model.set3iter# 0# ms&8 cell M &t(.Aell0endererText38 column M &t(.TreeTie'Aolumn3E4essa&esE# cell# textM08 treeB"ie'.appendBcolumn3column8 return scrolledB'indo' Q -=adimos texto a nuestro control de texto U esta retrollamada se in"oca Q cuando se realiza nuestra "entana. Podr<amos forzar tam$i%n la realizacin Q mediante &t(.>id&et.realize38# pero primero tendr<a que ser parte Q de una jerarqu<a def insertBtext3self# $uffer8)

;S iter M $uffer.&etBiterBatBoffset308 ;D $uffer.insert3iter# C0 E7rom) pat finder,nasa.&o"anE C1 ETo) mom,nasa.&o"anE C2 E1u$ject) 4ade itPanE C; EanE CC E>e just &ot in t is mornin&. T e 'eat er as $eenanE CJ E&reat U clear $ut cold# and t ere are lots of fun si& ts.anE CI E1ojourner says i. 1ee you soon.anE CR E UPat anE8 CS CD Q Areamos un 9rea de texto desplaza$le que muestra un EmensajeE J0 def createBtext3self8) J1 "ie' M &t(.TextTie'38 J2 $uffer M "ie'.&etB$uffer38 J; scrolledB'indo' M &t(.1crolled>indo'38 JC scrolledB'indo'.setBpolicy3&t(.P/5:A[B-.T/4-T:A# &t(.P/5:A[B-.T/4-T:A8 JJ scrolledB'indo'.add3"ie'8 JI self.insertBtext3$uffer8 JR scrolledB'indo'.s o'Ball38 JS return scrolledB'indo' JD I0 def BBinitBB3self8) I1 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 I2 'indo'.setBtitle3EPaned >indo'sE8 I; 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 IC 'indo'.setB$orderB'idt 3108 IJ 'indo'.setBsizeBrequest3CJ0# C008 II IR Q creamos un control "paned y lo a=adimos a la "entana principal IS "paned M &t(.TPaned38 ID 'indo'.add3"paned8 R0 "paned.s o'38 R1 R2 Q - ora creamos los contenidos de las dos partes de la "entana R; list M self.createBlist38 RC "paned.add13list8 RJ list.s o'38 RI RR text M self.createBtext38 RS "paned.add23text8 RD text.s o'38 S0 'indo'.s o'38 S1 S2 def main38) S; &t(.main38 SC return 0 SJ

SI if BBnameBB MM EBBmainBBE) SR PanedExample38 SS main38 1G.A. $istas 8$ie(port9 Es poco pro$a$le que necesites usar el control Tie'port 3Tista8 directamente. Es muc o m9s pro$a$le que uses el control 1crolled>indo'# el cual usa un Tie'port. .n control de "ista permite colocar un control m9s &rande dentro de %l de tal forma que se pueda "er una parte de %l de una "ez. .sa -djustments para definir el 9rea que se "e. .n Tie'port se crea con la funcin) "ie'port M &t(.Tie'port3had)ust"entM?one# vadjustmentM?one8 Aomo se puede "er se pueden especificar los -djustments orizontal y "ertical que el control usa cuando se crea. Arear9 sus propios ajustes si se le pasa ?one como "alor de los ar&umentos o simplemente no se le pasan ar&umentos. 1e pueden consultar y fijar los ajustes despu%s de que el control se aya creado usando los si&uientes cuatro m%todos) "ie'port.&etB adjustment38 "ie'port.&etB"adjustment38 "ie'port.setB adjustment3ad)ust"ent8 "ie'port.setB"adjustment3ad)ust"ent8 El otro m%todo que se usa para modificar la apariencia es) "ie'port.setBs ado'Btype3type8 5os "alores posi$les para el par9metro type son) 1+-@/>B?/?E Q sin som$ra 1+-@/>B:? Q som$ra acia adentro 1+-@/>B/.T Q som$ra acia afuera 1+-@/>BETA+E@B:? Q som$ra marcada acia adentro 1+-@/>BETA+E@B/.T Q som$ra marcada acia fuera 1G.F. $entanas de Bespla4a"iento 8%crolledIindo(9 5as "entanas de desplazamiento se usan para crear un 9rea de desplazamiento con otro control dentro de ella. 1e puede insertar cualquier tipo de control dentro de una "entana de desplazamiento# y ser9 accesi$le# independientemente del tama=o# usando $arras de desplazamiento. 5a si&uiente funcin se usa para crear una nue"a "entana de desplazamiento.

scrolledB'indo' M &t(.1crolled>indo'3had)ust"entM?one# 0ad)ust"entM?one8 @onde el primer ar&umento es el ajuste para la direccin orizontal# y el se&undo# el ajuste para la direccin "ertical. Aasi siempre se ponen a ?one o no se especifican. scrolledB'indo'.setBpolicy3hscrollbar.policy# 0scrollbar.policy8 Este m%todo especifica la pol<tica a usar con respecto a las $arras de desplazamiento. El primer ar&umento le fija la pol<tica a la $arra de desplazamiento orizontal# y el se&undo# la pol<tica de la $arra de desplazamiento "ertical. 5a pol<tica puede tomar los "alores P/5:A[B-.T/4-T:A o P/5:A[B-5>-[1. P/5:A[B-.T/4-T:A decidir9 autom9ticamente si son necesarias las $arras de desplazamiento# mientras que P/5:A[B-5>-[1 siempre dejar9 "isi$les las $arras de desplazamiento. Tras esto se puede colocar el o$jeto dentro de la "entana de desplazamiento usando el si&uiente m%todo. scrolledB'indo'.addB'it B"ie'port3child8 El pro&rama de ejemplo scrolled(in.py coloca una ta$la con 100 $otones $iestado dentro de una "entana de desplazamiento. 1lo se comentan las partes que pueden ser nue"as. 5a fi&ura 7i&ura 10.R# VEjemplo de Tentana de @esplazamientoW muestra la "entana del pro&rama) #igura 1G.@. E)e"plo de $entana de Bespla4a"iento

El cdi&o fuente de scrolled(in.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D QPGusrG$inGen" pyt on Q ejemplo scrolled'in.py import py&t( py&t(.require3N2.0N8 import &t( class 1crolled>indo'Example) def destroy3self# 'id&et8) &t(.mainBquit38 def BBinitBB3self8) Q Areamos una nue"a "entana de di9lo&o en la que empaquetar Q la "entana de desplazamiento 'indo' M &t(.@ialo&38 'indo'.connect3EdestroyE# self.destroy8 'indo'.setBtitle3E1crolled>indo' exampleE8 'indo'.setB$orderB'idt 308

20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR

'indo'.setBsizeBrequest3;00# ;008 Q creamos una nue"a "entana de desplazamiento scrolledB'indo' M &t(.1crolled>indo'38 scrolledB'indo'.setB$orderB'idt 3108 Q la pol<tica es $ien P/5:A[ -.T/4-T:A# o $ien P/5:A[B-5>-[1. Q P/5:A[B-.T/4-T:A decidir9 autom9ticamente la necesidad de $arras de Q desplazamiento# mientras que P/5:A[B-5>-[1 dejar9 permanentemente las Q $arras. 5a primera es la $arra de desplazamiento orizontal# la se&unda la Q "ertical. scrolledB'indo'.setBpolicy3&t(.P/5:A[B-.T/4-T:A# &t(.P/5:A[B-5>-[18 Q 1e crea la "entana de di9lo&o con una "$ox en ella 'indo'."$ox.pac(Bstart3scrolledB'indo'# &t(.T0.E# &t(.T0.E# 08 scrolledB'indo'.s o'38 Q creamos una ta$la de 10 por 10 casillas ta$le M &t(.Ta$le310# 10# &t(.7-51E8 Q fijamos el espaciado a 10 en x y 10 en y ta$le.setBro'Bspacin&s3108 ta$le.setBcolBspacin&s3108 Q empaquetamos la ta$la en la "entana de desplazamiento scrolledB'indo'.addB'it B"ie'port3ta$le8 ta$le.s o'38 Q esto simplemente crea una trama de $otones $iestado en la ta$la Q para demostrar el uso de la "entana de desplazamiento for i in ran&e3108) for j in ran&e3108) $uffer M E$utton 3`d#`d8E ` 3i# j8 $utton M &t(.To&&leFutton3$uffer8 ta$le.attac 3$utton# i# i!1# j# j!18 $utton.s o'38 Q -=adimos un $otn EcloseE en la parte inferior del di9lo&o $utton M &t(.Futton3EcloseE8 $utton.connectBo$ject3Eclic(edE# self.destroy# 'indo'8 Q ponemos el $otn como posi$le predeterminado $utton.setBfla&s3&t(.A-?B@E7-.5T8 'indo'.actionBarea.pac(Bstart3 $utton# &t(.T0.E# &t(.T0.E# 08 Q Esto lo esta$lece como predeterminado. Pulsando Q EEnterE ar9 que se acti"e este $otn $utton.&ra$Bdefault38

IS $utton.s o'38 ID 'indo'.s o'38 R0 R1 def main38) R2 &t(.main38 R; return 0 RC RJ if BBnameBB MM EBBmainBBE) RI 1crolled>indo'Example38 RR main38 1i se prue$a a cam$iar el tama=o a la "entana se "er9 cmo reaccionan las $arras de desplazamiento. Puede que tam$i%n se quiera usar el m%todo setBsizeBrequest38 para fijar el tama=o por defecto de la "entana o de otros controles. 1G.1G. Ca)as de =otones 8=utton=oxes9 5as FuttonFoxes 3Aajas de Fotones8 proporcionan un sistema f9cil de a&rupar $otones r9pidamente. Tienen en "ariedades orizontales y "erticales. 1e puede crear una nue"a FuttonFox con una de las si&uiente llamadas# que crean una caja orizontal o "ertical# respecti"amente) $uttonB$ox M &t(.+FuttonFox38 "$uttonB$ox M &t(.TFuttonFox38 5os 2nicos m%todos de las cajas de $otones afectan a la disposicin de los $otones. 5a disposicin de los $otones dentro de la caja se esta$lece usando) $uttonB$ox.setBlayout3layout.style8 El ar&umento layout_style puede tomar uno de los si&uientes "alores) F.TT/?F/6B@E7-.5TB1T[5E Q estilo predeterminado F.TT/?F/6B1P0E-@ Q esparcidos F.TT/?F/6BE@GE Q al $orde F.TT/?F/6B1T-0T Q al principio F.TT/?F/6BE?@ Q al final El "alor actual de layout_style se puede consultar usando) layoutBstyle M $uttonB$ox.&etBlayout38 5os $otones se a=aden a la FuttonFox usando el t<pico m%todo de Aontainer 3Aontenedor8) $uttonB$ox.add3(idget8 El pro&rama de ejemplo buttonbox.py ilustra todos los tipos de disposicin de las FuttonFoxes. 5a "entana resultante es)

El cdi&o fuente del pro&rama buttonbox.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC QPGusrG$inGen" pyt on Q ejemplo $utton$ox.py import py&t( py&t(.require3N2.0N8 import &t( class FuttonFoxExample) Q Areamos una Futton Fox con los par9metros especificados def createB$$ox3self# orizontal# title# spacin&# layout8) frame M &t(.7rame3title8 if orizontal) $$ox M &t(.+FuttonFox38 else) $$ox M &t(.TFuttonFox38 $$ox.setB$orderB'idt 3J8 frame.add3$$ox8 Q 7ijamos el aspecto de Futton Fox $$ox.setBlayout3layout8 $$ox.setBspacin&3spacin&8 $utton M &t(.Futton3stoc(M&t(.1T/AKB/K8 $$ox.add3$utton8 $utton M &t(.Futton3stoc(M&t(.1T/AKBA-?AE58 $$ox.add3$utton8 $utton M &t(.Futton3stoc(M&t(.1T/AKB+E5P8 $$ox.add3$utton8 return frame def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBtitle3EFutton FoxesE8 'indo'.connect3EdestroyE# lam$da x) &t(.mainBquit388 'indo'.setB$orderB'idt 3108

CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2

mainB"$ox M &t(.TFox3&t(.7-51E# 08 'indo'.add3mainB"$ox8 frameB orz M &t(.7rame3E+orizontal Futton FoxesE8 mainB"$ox.pac(Bstart3frameB orz# &t(.T0.E# &t(.T0.E# 108 "$ox M &t(.TFox3&t(.7-51E# 08 "$ox.setB$orderB'idt 3108 frameB orz.add3"$ox8 "$ox.pac(Bstart3self.createB$$ox3&t(.T0.E# E1pread 3spacin& C08E# C0# &t(.F.TT/?F/6B1P0E-@8# &t(.T0.E# &t(.T0.E# 08 "$ox.pac(Bstart3self.createB$$ox3&t(.T0.E# EEd&e 3spacin& ;08E# ;0# &t(.F.TT/?F/6BE@GE8# &t(.T0.E# &t(.T0.E# J8 "$ox.pac(Bstart3self.createB$$ox3&t(.T0.E# E1tart 3spacin& 208E# 20# &t(.F.TT/?F/6B1T-0T8# &t(.T0.E# &t(.T0.E# J8 "$ox.pac(Bstart3self.createB$$ox3&t(.T0.E# EEnd 3spacin& 108E# 10# &t(.F.TT/?F/6BE?@8# &t(.T0.E# &t(.T0.E# J8 frameB"ert M &t(.7rame3ETertical Futton FoxesE8 mainB"$ox.pac(Bstart3frameB"ert# &t(.T0.E# &t(.T0.E# 108 $ox M &t(.+Fox3&t(.7-51E# 08 $ox.setB$orderB'idt 3108 frameB"ert.add3 $ox8 $ox.pac(Bstart3self.createB$$ox3&t(.7-51E# E1pread 3spacin& J8E# J# &t(.F.TT/?F/6B1P0E-@8# &t(.T0.E# &t(.T0.E# 08 $ox.pac(Bstart3self.createB$$ox3&t(.7-51E# EEd&e 3spacin& ;08E# ;0# &t(.F.TT/?F/6BE@GE8# &t(.T0.E# &t(.T0.E# J8 $ox.pac(Bstart3self.createB$$ox3&t(.7-51E# E1tart 3spacin& 208E# 20# &t(.F.TT/?F/6B1T-0T8# &t(.T0.E# &t(.T0.E# J8 $ox.pac(Bstart3self.createB$$ox3&t(.7-51E# EEnd 3spacin& 208E# 20# &t(.F.TT/?F/6BE?@8# &t(.T0.E# &t(.T0.E# J8

D; DC 'indo'.s o'Ball38 DJ DI def main38) DR Q Entramos en el $ucle de e"entos DS &t(.main38 DD return 0 100 101 if BBnameBB MM EBBmainBBE) 102 FuttonFoxExample38 10; main38 1G.11. =arra de &erra"ientas 8Toolbar9 5as Tool$ars 3Farras de +erramientas8 se usan normalmente para a&rupar un n2mero de controles y simplificar la personalizacin de su apariencia y disposicin. T<picamente una $arra de erramientas consiste en $otones con iconos# etiquetas y pistas# pero se puede poner cualquier otro control en una $arra de erramientas. 7inalmente# los elementos se pueden colocar orizontal o "erticalmente y se pueden "er los $otones con iconos# texto# o am$os. 5a creacin de una $arra de erramientas se consi&ue 3como uno podr<a sospec ar8 con la si&uiente funcin) tool$ar M &t(.Tool$ar38 @espu%s de crear una $arra de erramientas uno puede a=adir al principio# al final o en otro posicin# items 3textos simples8 o elementos 3cualquier tipo de control8 en la $arra de erramientas. Para descri$ir un item necesitamos un texto# un texto para la pista# un texto pri"ado para la pista# un icono para el $otn y una retrollamada. Por ejemplo# para a=adir al principio o al final un item se pueden usar los si&uientes m%todos) tool$ar.appendBitem3text# tooltip.text# tooltip.pri0ate.text# icon# callback# user.dataM?one8 tool$ar.prependBitem3text# tooltip.text# tooltip.pri0ate.text# icon# callback# user.data8 1i se quiere usar el m%todo insertBitem38# el 2nico par9metro adicional que de$e especificarse# es la posicin en la cual el elemento se de$e insertar. -s<) tool$ar.insertBitem3text# tooltip.text# tooltip.pri0ate.text# icon# callback# user.data# position8 Para a=adir de forma sencilla espacios entre items de la $arra de erramientas se pueden usar los si&uientes m%todos) tool$ar.appendBspace38 tool$ar.prependBspace38

tool$ar.insertBspace3position8 1i es necesario# la orientacin de una $arra de erramientas# su estilo y el ec o de que las pistas est%n disponi$les# se puede cam$iar so$re la marc a usando los si&uientes m%todos) tool$ar.setBorientation3orientation8 tool$ar.setBstyle3style8 tool$ar.setBtooltips3enable8 @onde la orientation puede ser /0:E?T-T:/?B+/0:f/?T-5 u /0:E?T-T:/?BTE0T:A-5. El style se usa para especificar la apariencia de la $arra de erramientas y puede ser T//5F-0B:A/?1 3iconos8# T//5F-0BTE6T 3texto8# o T//5F-0BF/T+ 3am$os8. El ar&umento enable puede ser o T0.E o 7-51E. Para mostrar al&unas otras cosas que se pueden acer con una $arra de erramientas "eamos el si&uiente pro&rama de ejemplo toolbar.py 3interrumpiremos el listado con explicaciones adicionales8) 1 2 ; C J I R S D 10 11 12 1; 1C 1J QPGusrG$inGen" pyt on Q ejemplo tool$ar.py import py&t( py&t(.require3N2.0N8 import &t( class Tool$arExample) Q Este m%todo se conecta al $otn Alose o Q al cierre de la "entana desde el Gestor de Tentanas def deleteBe"ent3self# 'id&et# e"entM?one8) &t(.mainBquit38 return &t(.7-51E

Este principio de$er<a resultar familiar si no es el primer pro&rama PyGTK. ?o o$stante ay una cosa m9s# "amos a importar un $onito di$ujo 6P4 3&t(.xpm8 para que nos sir"a de icono para todos los $otones. 5a linea 10 empieza la clase de ejemplo Tool$arExample y las lineas 12U1C definen el m%todo de retrollamada que finalizar9 el pro&rama. 1I 1R 1S 1D 20 21 22 2; Q es f9cil... cuando se conmuta uno de los $otones# simplemente Q compro$amos cu9l est9 acti"o y cam$iamos el estilo de la $arra de erramientas Q de acuerdo con ello def radioBe"ent3self# 'id&et# tool$ar8) if self.textB$utton.&etBacti"e38) tool$ar.setBstyle3&t(.T//5F-0BTE6T8 elif self.iconB$utton.&etBacti"e38) tool$ar.setBstyle3&t(.T//5F-0B:A/?18

2C 2J 2I 2R 2S 2D ;0 ;1

elif self.$ot B$utton.&etBacti"e38) tool$ar.setBstyle3&t(.T//5F-0BF/T+8 Q incluso m9s f9cil# compro$amos la conmutacin del $otn Q y acti"amosGdesacti"amos las pistas def to&&leBe"ent3self# 'id&et# tool$ar8) tool$ar.setBtooltips3'id&et.&etBacti"e388

5as lineas 1DU;0 son dos m%todos de retrollamada que se llamar9n cuando uno de los $otones de la $arra de erramientas se acti"e. Estas cosas resultan familiares si ya se an usado $otones $iestado 3y $otones de exclusin m2tua8. ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 def BBinitBB3self8) Q -qu< est9 la "entana principal 3un di9lo&o8 y el asa Q necesitamos una $arra de erramientas# un icono con m9scara 3uno para todos Q los $otones8 y un control de icono en el que ponerlo 3aunque crearemos Q un control aparte para cada $otn8 Q creamos una nue"a "entana con su t<tulo y un tama=o adecuado dialo& M &t(.@ialo&38 dialo&.setBtitle3EGTKTool$ar TutorialE8 dialo&.setBsizeBrequest3CJ0# 2J08 dialo&.setBresiza$le3&t(.T0.E8 Q &eneralmente querremos salir si cierran la "entana dialo&.connect3EdeleteBe"entE# self.deleteBe"ent8 Q para que ten&a mejor aspecto ponemos la $arra en la caja con asa Q de manera que se pueda separar de la "entana principal andle$ox M &t(.+andleFox38 dialo&."$ox.pac(Bstart3 andle$ox# &t(.7-51E# &t(.7-51E# J8

5o anterior de$er<a ser com2n a cualquier otra aplicacin PyGTK. :nicializacin de una instancia de Tool$arExample# creacin de la "entana# etc. 1lo ay una cosa que pro$a$lemente necesite m9s explicacin) una caja con man&o 3asa8 3+andleFox8. .na caja con man&o es simplemente otra caja cualquiera que puede usarse para meter controles dentro. 5a diferencia entre ella y las cajas t<picas es que puede despe&arse de la "entana padre 3o# de ec o# la caja con man&o permanece en el padre# pero se reduce a un rect9n&ulo muy peque=o# mientras que todos sus contenidos cam$ian de padre a una nue"a "entana flotante8. ?ormalmente es $ueno tener una $arra de erramientas separa$le# por lo que estos dos controles suelen ir juntos normalmente. J1 J2 J; JC JJ Q la $arra de erramientas ser9 orizontal# con iconos y texto# y Q con espacios de Jpxl entre elementos y# finalmente# Q la insertaremos en la caja con asa tool$ar M &t(.Tool$ar38 tool$ar.setBorientation3&t(./0:E?T-T:/?B+/0:f/?T-58

JI JR JS JD

tool$ar.setBstyle3&t(.T//5F-0BF/T+8 tool$ar.setB$orderB'idt 3J8 andle$ox.add3tool$ar8

Fien# lo que acemos arri$a es una simple inicializacin del control de la $arra de erramientas. I0 I1 I2 I; IC IJ II IR IS ID R0 Q nuestro primer elemento es el $otn gcloseL icon' M &t(.:ma&e38 Q control de icono icon'.setBfromBfile3E&t(.xpmE8 closeB$utton M tool$ar.appendBitem3 EAloseE# Q etiqueta de $otn EAloses t is appE# Q la pista del $otn EPri"ateE# Q informacin pri"ada de la pista icon'# Q control icono self.deleteBe"ent8 Q una se=al tool$ar.appendBspace38 Q espacio tras el elemento

En el cdi&o anterior se puede "er el caso m9s simple) a=adir un $otn a la $arra de erramientas. *usto antes de a=adir el nue"o elemento# tenemos que construir un control de im9&en que ser"ir9 como icono para este elemento\ este paso tiene que repetirse para cada nue"o elemento. *usto despu%s del elemento a=adimos tam$i%n espacio# para que los elementos si&uientes no se toquen unos a otros. Aomo se puede "er# el m%todo appendBitem38 de"uel"e una referencia al control de $otn reci%n creado# para que se pueda tra$ajar con %l de la forma a$itual. R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ Q a ora# a&amos el &rupo de $otones de exclusin... icon' M &t(.:ma&e38 Q control de icono icon'.setBfromBfile3E&t(.xpmE8 iconB$utton M tool$ar.appendBelement3 &t(.T//5F-0BA+:5@B0-@:/F.TT/?# Q type of element ?one# Q control E:conE# Q etiqueta E/nly icons in tool$arE# Q pista EPri"ateE# Q cadena pri"ada de pista icon'# Q icono self.radioBe"ent# Q se=al tool$ar8 Q datos para la se=al tool$ar.appendBspace38 self.iconB$utton M iconB$utton

-qui empezamos a crear un &rupo de $otones de exclusin m2tua. Para acer esto usamos el m%todo appendBelement38 . @e ec o# usando este m%todo# uno puede tam$i%n puede a=adir items normales o incluso espacios 3type M &t(.T//5F-0BA+:5@B1P-AE 3espacio8 o &t(.T//5F-0BA+:5@BF.TT/? 3$otn88. En el ejemplo anterior emos empezado a crear un

&rupo de $otones de exclusin m2tua. Auando se crean otros $otones de exclusin m2tua se necesita una referencia al $otn anterior en el &rupo# para que se pueda construir una lista de $otones f9cilmente 3mira la seccin 0adioFuttons de este tutorial8. Tam$i%n tenemos una referencia al $otn en la instancia de Tool$arExample para acceder a %l m9s tare. SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J Q los si&uientes $otones de exclusin se refieren a los anteriores icon' M &t(.:ma&e38 Q control de icono icon'.setBfromBfile3E&t(.xpmE8 textB$utton M tool$ar.appendBelement3 &t(.T//5F-0BA+:5@B0-@:/F.TT/?# iconB$utton# ETextE# E/nly texts in tool$arE# EPri"ateE# icon'# self.radioBe"ent# tool$ar8 tool$ar.appendBspace38 self.textB$utton M textB$utton icon' M &t(.:ma&e38 Q control de icono icon'.setBfromBfile3E&t(.xpmE8 $ot B$utton M tool$ar.appendBelement3 &t(.T//5F-0BA+:5@B0-@:/F.TT/?# textB$utton# EFot E# E:cons and text in tool$arE# EPri"ateE# icon'# self.radioBe"ent# tool$ar8 tool$ar.appendBspace38 self.$ot B$utton M $ot B$utton $ot B$utton.setBacti"e3&t(.T0.E8

Areamos otros $otones de exclusin m2tua de la misma forma excepto que le pasamos uno de los $otones creados al m%todo appendBelement38 para especificar el &rupo. -l final tenemos que esta$lecer el estado de uno de los $otones manualmente 3si no todos tienen el estado acti"o# impidi%ndonos que los "ayamos intercam$iando8. 11I 11R 11S 11D 120 121 Q aqu< ponemos simplemente un $otn $iestado icon' M &t(.:ma&e38 Q control de icono icon'.setBfromBfile3E&t(.xpmE8 tooltipsB$utton M tool$ar.appendBelement3 &t(.T//5F-0BA+:5@BT/GG5EF.TT/?# ?one#

122 12; 12C 12J 12I 12R 12S 12D 1;0

ETooltipsE# ETool$ar 'it or 'it out tipsE# EPri"ateE# icon'# self.to&&leBe"ent# tool$ar8 tool$ar.appendBspace38 tooltipsB$utton.setBacti"e3&t(.T0.E8 an creado $otones de

.n $otn $iestado se puede crear de la forma o$"ia 3si ya se exclusin m2tua al&una "ez8. 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S

Q para empaquetar un control en la $arra# solamente tenemos Q crearlo y a=adirlo con una pista apropiada entry M &t(.Entry38 tool$ar.appendB'id&et3entry# ET is is just an entryE# EPri"ateE8 Q $ien# no est9 creada dentro de la $arra# as< que tenemos que mostrarla entry.s o'38

Aomo se puede "er# a=adir cualquier tipo de control a una $arra de erramientas es f9cil. 5a 2nica cosa que se tiene que recordar es que este control de$e mostrarse manualmente 3al contrario que los elementos# que se mostrar9n de &olpe con la $arra de erramientas8. 1;D Q Oya est9P 4ostremos todo. 1C0 tool$ar.s o'38 1C1 andle$ox.s o'38 1C2 dialo&.s o'38 1C; 1CC def main38) 1CJ Q nos quedamos en &t(Bmain y Oesperamos que empiece la di"ersinP 1CI &t(.main38 1CR return 0 1CS 1CD if BBnameBB MM EBBmainBBE) 1J0 Tool$arExample38 1J1 main38 5a linea 1C2 termina la definicin de la clase Tool$arExample. 5as lineas 1CCU1CR definen la funcin main38 que simplemente llama a la funcin &t(.main38 para iniciar el $ucle de procesamiento de e"entos. 5as lineas 1CDU1J1 crean una instancia de Tool$arExample y lue&o entran en el $ucle de procesamiento de e"entos. -s< termina el tutorial de la $arra de erramientas. Por supuesto# para apreciarla en su m9ximo esplendor se necesita tam$i%n el icono 6P4# &t(.xpm. 5a fi&ura 7i&ura 10.S# VEjemplo de Farra de +erramientasW muestar la "entana resultante) #igura 1G.A. E)e"plo de =arra de &erra"ientas

1G.1!. #ichas 8 otebook9 El control ?oteFoo( 37ic as8 es una coleccin de Ep9&inasE que se solapan unas con otras. Aada p9&ina contiene informacin diferente y slo una es "isi$le a un tiempo. Este control se a ec o muy popular 2ltimamente en la pro&ramacin de interfaces &r9ficas de usuario# y es una $uena manera de mostrar $loques de informacin similar que &uardan una separacin en la pantalla. 5a primera funcin que se necesita sa$er# como pro$a$lemente se adi"ine# se usa para crear un nue"o control de fic as. note$oo( M &t(.?ote$oo(38 .na "ez que se an creado las fic as# ay unos cuantos m%todos que manipulan el control. Te9moslos uno a uno. El primero que trataremos especifica cmo colocar los indicadores de p9&ina. Estos indicadores o Epesta=asE como se las conoce# se pueden colocar de cuatro maneras) arri$a# a$ajo# izquierda o derec a. note$oo(.setBta$Bpos3pos8 pos ser9 uno de las si&uientes# que son $astante descripti"as) P/1B5E7T Q izquierda P/1B0:G+T Q derec a P/1BT/P Q arri$a P/1BF/TT/4 Q a$ajo P/1BT/P es el "alor predeterminado. 5o si&uiente que trataremos ser9 cmo a=adir p9&inas a las fic as. +ay tres formas de a=adir p9&inas a un ?oteFoo(. Teamos las dos primeras# ya que son $astante similares. note$oo(.appendBpa&e3child# tab.label8 note$oo(.prependBpa&e3child# tab.label8 Estos m%todos a=aden p9&inas a las fic as insert9ndolas al final 3append8# o al principio 3prepend8. child es el control que se colocar9 dentro de la p9&ina en cuestin# y tab_label es el t<tulo para la p9&ina que se est9 a=adiendo. El control child de$e crearse por separado# y normalmente es un conjunto de opciones de confi&uracin dentro de otro control contenedor# tal como una ta$la. El 2ltimo m%todo para a=adir una p9&ina a las fic as contiene todas las propiedades de los otros dos# y adem9s permite especificar en qu% posicin se insertar9 la p9&ina en las fic as. note$oo(.insertBpa&e3child# tab.label# position8

5os par9metros son los mismos que en append38 y prepend38 excepto en que contiene un par9metro extra# position. Este par9metro se usa para especificar en qu% lu&ar la p9&ina se insertar9\ la primera p9&ina est9 en la posicin cero. - ora que sa$emos cmo a=adir una p9&ina# "eamos cmo podemos $orrar una p9&ina de las fic as. note$oo(.remo"eBpa&e3page.nu"8 Este m%todo $orra la p9&ina especificada por page_num de las fic as contenidas en la "aria$le notebook. Para sa$er cu9l es la p9&ina actual de las fic as utiliza el m%todo) pa&e M note$oo(.&etBcurrentBpa&e38 5os prximos dos m%todos son simples llamadas para mo"er la p9&ina acia adelante o acia atr9s. 1implemente se utilizan en el control de fic as so$re el que se quiera operar. note$oo(.nextBpa&e38 note$oo(.pre"Bpa&e38 ota Auando el notebook tiene como p9&ina actual la 2ltima p9&ina# y se llama a nextBpa&e38 # no ocurre nada. @e forma an9lo&a# si el notebook est9 en la primera p9&ina# y se llama a pre"Bpa&e38# no pasa nada. Este m%todo fija la p9&ina Eacti"aE. 1i se quiere que las fic as comiencen con la p9&ina J acti"a# se usar9 este m%todo. 1i no se usa# el comportamiento predeterminado de las fic as es mostrar la primera p9&ina. note$oo(.setBcurrentBpa&e3page.nu"8 5os si&uientes dos m%todos a=aden o $orran las pesta=as y el $orde respecti"amente. note$oo(.setBs o'Bta$s3sho(.tabs8 note$oo(.setBs o'B$order3sho(.border8 El si&uiente m%todo es 2til cuando se tiene un &ran n2mero de p9&inas# y las pesta=as no ca$en en la p9&ina. Permite desplazarse por las pesta=as usando dos $otones de flec as. note$oo(.setBscrolla$le3scrollable8 show_tabs 3mostrar pesta=as8# show_border 3mostrar $order8 y scrollable 3desplaza$le8 pueden ser T0.E o 7-51E. - ora "eamos un ejemplo. El pro&rama notebook.py crea una "entana con unas fic as y seis $otones. 5as fic as contienen 11 p9&inas# a=adidas de tres formas diferentes# al final# en medio y al principio. 5os $otones permiten rotar la posicin de las pesta=as# a=adir o

$orrar las pesta=as y el $orde# $orrar una p9&ina# cam$iar las p9&inas acia delante y acia atr9s# y salir del pro&rama. 5a fi&ura Figura 1$.9, Ejemp o !e Fic'as muestra la "entana del pro&rama) #igura 1G.F. E)e"plo de #ichas

El cdi&o fuente de notebook.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D QPGusrG$inGen" pyt on Q ejemplo note$oo(.py import py&t( py&t(.require3N2.0N8 import &t( class ?ote$oo(Example) Q Este m%todo rota la posicin de las pesta=as def rotateB$oo(3self# $utton# note$oo(8) note$oo(.setBta$Bpos33note$oo(.&etBta$Bpos38!18 `C8 Q -=adirGEliminar las pesta=as de p9&ina y los $ordes def ta$s$orderB$oo(3self# $utton# note$oo(8) t"al M &t(.7-51E $"al M &t(.7-51E if self.s o'Bta$s MM &t(.7-51E) t"al M &t(.T0.E if self.s o'B$order MM &t(.7-51E) $"al M &t(.T0.E note$oo(.setBs o'Bta$s3t"al8 self.s o'Bta$s M t"al note$oo(.setBs o'B$order3$"al8 self.s o'B$order M $"al Q Eliminar una p9&ina de las fic as def remo"eB$oo(3self# $utton# note$oo(8) pa&e M note$oo(.&etBcurrentBpa&e38 note$oo(.remo"eBpa&e3pa&e8 Q ?eed to refres t e 'id&et UU Q T is forces t e 'id&et to redra' itself. note$oo(.queueBdra'Barea30#0#U1#U18 def delete3self# 'id&et# e"entM?one8) &t(.mainBquit38 return &t(.7-51E

C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR

def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.connect3EdeleteBe"entE# self.delete8 'indo'.setB$orderB'idt 3108 ta$le M &t(.Ta$le3;#I#&t(.7-51E8 'indo'.add3ta$le8 Q Arear unas nue"as fic as# definir la posicin de las pesta=as note$oo( M &t(.?ote$oo(38 note$oo(.setBta$Bpos3&t(.P/1BT/P8 ta$le.attac 3note$oo(# 0#I#0#18 note$oo(.s o'38 self.s o'Bta$s M &t(.T0.E self.s o'B$order M &t(.T0.E Q -=adimos unas cuantas p9&inas a las fic as for i in ran&e3J8) $ufferf M E-ppend 7rame `dE ` 3i!18 $ufferl M EPa&e `dE ` 3i!18 frame M &t(.7rame3$ufferf8 frame.setB$orderB'idt 3108 frame.setBsizeBrequest3100# RJ8 frame.s o'38 la$el M &t(.5a$el3$ufferf8 frame.add3la$el8 la$el.s o'38 la$el M &t(.5a$el3$ufferl8 note$oo(.appendBpa&e3frame# la$el8 Q - ora a=adimos una p9&ina en un punto determinado c ec($utton M &t(.A ec(Futton3EA ec( me pleasePE8 c ec($utton.setBsizeBrequest3100# RJ8 c ec($utton.s o' 38 la$el M &t(.5a$el3E-dd pa&eE8 note$oo(.insertBpa&e3c ec($utton# la$el# 28 Q 7inalmente a=adimos una p9&ina delante for i in ran&e3J8) $ufferf M EPrepend 7rame `dE ` 3i!18 $ufferl M EPPa&e `dE ` 3i!18 frame M &t(.7rame3$ufferf8 frame.setB$orderB'idt 3108

SS frame.setBsizeBrequest3100# RJ8 SD frame.s o'38 D0 D1 la$el M &t(.5a$el3$ufferf8 D2 frame.add3la$el8 D; la$el.s o'38 DC DJ la$el M &t(.5a$el3$ufferl8 DI note$oo(.prependBpa&e3frame# la$el8 DR DS Q Esta$lecer en qu% p9&ina empezamos 3p9&ina C8 DD note$oo(.setBcurrentBpa&e3;8 100 101 Q Areamos unos cuantos $otones 102 $utton M &t(.Futton3EcloseE8 10; $utton.connect3Eclic(edE# self.delete8 10C ta$le.attac 3$utton# 0#1#1#28 10J $utton.s o'38 10I 10R $utton M &t(.Futton3Enext pa&eE8 10S $utton.connect3Eclic(edE# lam$da ') note$oo(.nextBpa&e388 10D ta$le.attac 3$utton# 1#2#1#28 110 $utton.s o'38 111 112 $utton M &t(.Futton3Epre" pa&eE8 11; $utton.connect3Eclic(edE# lam$da ') note$oo(.pre"Bpa&e388 11C ta$le.attac 3$utton# 2#;#1#28 11J $utton.s o'38 11I 11R $utton M &t(.Futton3Eta$ positionE8 11S $utton.connect3Eclic(edE# self.rotateB$oo(# note$oo(8 11D ta$le.attac 3$utton# ;#C#1#28 120 $utton.s o'38 121 122 $utton M &t(.Futton3Eta$sG$order onGoffE8 12; $utton.connect3Eclic(edE# self.ta$s$orderB$oo(# note$oo(8 12C ta$le.attac 3$utton# C#J#1#28 12J $utton.s o'38 12I 12R $utton M &t(.Futton3Eremo"e pa&eE8 12S $utton.connect3Eclic(edE# self.remo"eB$oo(# note$oo(8 12D ta$le.attac 3$utton# J#I#1#28 1;0 $utton.s o'38 1;1 1;2 ta$le.s o'38 1;; 'indo'.s o'38 1;C 1;J def main38)

1;I &t(.main38 1;R return 0 1;S 1;D if BBnameBB MM EBBmainBBE) 1C0 ?ote$oo(Example38 1C1 main38 Espero que esto ayude en el camino para crear fic as en los pro&ramas PyGTK. 1G.1/. Ele"entos incrustables y puntos de conexin 8Plugs y %ockets9 5os Plu&s y los 1oc(ets cooperan para em$e$er la interfaz de un proceso en otro proceso. Esto tam$i%n se puede lo&rar con el uso de Fono$o. 1G.1/.1. Ele"entos incrustables 8Plugs9 .n Plu& encapsula una interfaz de usuario aportada por una aplicacin de forma que se puede em$e$er en la interfaz de otra aplicacin. 5a se=al Eem$eddedE alerta a la aplicacin em$e$ida que a sido em$e$ida en la interfaz de usuario de la otra aplicacin. .n Plu& se crea con la si&uiente funcin) plu& M &t(.Plu&3soc(etBid8 que crea un nue"o Plu& y lo em$e$e en el 1oc(et identificado por socket_id. 1i socket_id es 05# el elemento conecta$le queda EdesconectadoE y puede ser conectado m9s tarde a un 1oc(et utilizando el m%todo de 1oc(et addBid38. El m%todo de Plu&) id M plu&.&etBid38 de"uel"e el identificador de "entana 3'indo' :@8 de un Plu&# que se puede usar para em$e$erlo en un 1oc(et utilizando el m%todo de 1oc(et addBid38. El pro&rama de ejemplo plug.py ilustra el uso de un elemento conecta$le Plu&) 1 2 ; C J I R S D 10 11 12 1; QPGusrG$inGpyt on import py&t( py&t(.require3N2.0N8 import &t(#sys >id M 05 if len3sys.ar&"8 MM 2) >id M lon&3sys.ar&"^1_8 plu& M &t(.Plu&3>id8 print EPlu& :@ME# plu&.&etBid38

1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1

def em$edBe"ent3'id&et8) print E: 3E#'id&et#E8 a"e just $een em$eddedPE plu&.connect3Eem$eddedE# em$edBe"ent8 entry M &t(.Entry38 entry.setBtext3E elloE8 def entryBpoint3'id&et8) print E[ouN"e c an&ed my text to N`sNE ` 'id&et.&etBtext38 entry.connect3Ec an&edE# entryBpoint8 plu&.connect3EdestroyE# &t(.mainquit8 plu&.add3entry8 plu&.s o'Ball38 &t(.mainloop38

El pro&rama se in"oca as<) plu&.py ^'indo':@_ donde windowID es el :@ 3identificador8 de un 1oc(et al que conectar el Plu&. 1G.1/.!. Puntos de Conexin 8%ockets9 .n 1oc(et proporciona el control que permite em$e$er un control incrusta$le Plu& desde otra aplicacin a la propia interfaz de forma transparente. .na aplicacin crea un control 1oc(et# pasa el :@ de "entana de ese control a otra aplicacin# que lue&o crea un Plu& utilizando ese :@ de "entana como par9metro. Aualquier control contenido en el elemento Plu& aparece dentro de la "entana de la primera aplicacin. El identificador 3:@8 de "entana del 1oc(et se o$tiene utilizando el m%todo de 1oc(et &etBid38. -ntes de usar este m%todo el 1oc(et de$e estar realizado y a=adido a su control padre. ota 1i se le pasa el :@ de "entana del 1oc(et a otro proceso que "a a crear un elemento Plu& en el 1oc(et# es preciso ase&urarse de que el control 1oc(et no se "a a destruir asta que se crea el elemento Plu&. Auando se notifica a GTK! que la "entana em$e$ida a sido destru<da# entonces tam$i%n se encar&a de destruir el 1oc(et. Por tanto# se de$e pre"er la posi$ilidad de que los soc(ets se destruyan en cualquier momento mientras el $ucle de e"entos principal est9 en ejecucin. 5a destruccin de un 1oc(et pro"ocar9 tam$i%n la destruccin de un Plu& em$e$ido en %l. 5a comunicacin entre un 1oc(et y un Plu& se ace se&2n el protocolo 6Em$ed. Este

protocolo tam$i%n se a implementado en otros tool(its como Ht# lo que permite el mismo ni"el de inte&racin al inte&rar un control de Ht en GTK! o "ice"ersa. Areacin de un nue"o 1oc(et "ac<o) soc(et M &t(.1oc(et38 El 1oc(et de$e estar contenido en una "entana ra<z antes de la in"ocacin del m%todo addBid38) soc(et.addBid3'indo'Bid8 que a=ade un cliente 6E4FE@# tal como un Plu&# al 1oc(et. El cliente puede estar en el mismo proceso o en uno diferente. Para em$e$er un Plu& en un 1oc(et se puede# $ien crear el Plu& con) plu& M &t(.Plu&3058 y lue&o pasar el n2mero de"uelto por el m%todo de Plu& &etBid38 al m%todo de 1oc(et addBid38) soc(et.addBid3plu&8 # o $ien se puede in"ocar el m%todo de 1oc(et &etBid38) 'indo'Bid M soc(et.&etBid38 para o$tener el identificador de "entana 3:@8 del soc(et# y lue&o crear el plu& con) plu& M &t(.Plu&3'indo'Bid8 El 1oc(et de$e a$er sido a=adido ya a una "entana ra<z antes de que se pueda acer esta llamada. El pro&rama de ejemplo socket.py ilustra el uso de un 1oc(et) 1 2 ; C J I R S D 10 11 12 1; 1C 1J QPGusrG$inGpyt on import strin& import py&t( py&t(.require3N2.0N8 import &t(#sys 'indo' M &t(.>indo'38 'indo'.s o'38 soc(et M &t(.1oc(et38 soc(et.s o'38 'indo'.add3soc(et8

1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R

print E1oc(et :@ME# soc(et.&etBid38 'indo'.connect3EdestroyE# &t(.mainquit8 def plu&&edBe"ent3'id&et8) print E: 3E#'id&et#E8 a"e just ad a plu& insertedPE soc(et.connect3Eplu&UaddedE# plu&&edBe"ent8 if len3sys.ar&"8 MM 2) soc(et.addBid3lon&3sys.ar&"^1_88 &t(.mainloop38

Para ejecutar el ejemplo se puede usar plug.py antes) K pyt on plu&.py Plu& :@M 20DR1J22 y copiar el identificador :@ al primer al&umento de socket.py) K pyt on soc(et.py 20DR1J22 1oc(et :@M CS2;CJ2; : 3 g&t(.Plu& o$ject 3Gt(Plu&8 at 0x;00SddRSL 8 a"e just $een em$dedP : 3 g&t(.1oc(et o$ject 3Gt(1oc(et8 at 0x;00Sddf0L 8 a"e just ad a plu& insertedP / se puede ejecutar socket.py) K pyt on soc(et.py 1oc(et :@M 20DR1JCR y despu%s) plug.py# copiando el identificador :@ de "entana) K pyt on plu&.py 20DR1JCR : 3 g&t(.1oc(et o$ject 3Gt(1oc(et8 at 0x;00Sddf0L 8 a"e just ad a plu& insertedP Plu& :@M CS2;CCDS Captulo 11. Control 'en? Tabla de contenidos 11.1. Areacin 4anual de 4en2s 11.2. Ejemplo de 4en2 4anual 11.;. .so de la 7actoria de Elementos 11.C. Ejemplo de 7actoria de Elementos U :tem7actory +ay dos formas de crear men2s) la forma f9cil y la dificil. Aada una tiene sus usos# pero normalmente se puede usar el :temfactory 37actoria de Elementos8 3la forma f9cil8. 5a forma Edif<cilE consiste en crear los men2s usando llamadas directamente# mientras que de

la forma f9cil se acen llamadas a Gt(:tem7actory. Esto 2ltimo es muc o m9s simple# pero cada enfoque tiene sus "entajas y des"entajas. 5a :temfactory es muc o m9s f9cil de usar# y m9s f9cil de a=adir men2s# aunque escri$ir unas cuantas funciones auxiliares para crear men2s usando el m%todo manual puede ser m9s "entajoso de cara a la usa$ilidad. Por ejemplo# con :temfactory# no es posi$le a=adir im9&enes o el car9cter NGN a los men2s. 11.1. Creacin 'anual de 'en?s 1i&uiendo la tradicin docente# "eremos primero la forma dif<cil. )8 +ay tres controles in"olucrados en la creacin de una $arra de men2s y de su$men2s) un elemento de men2# que es lo que el usuario "a a seleccionar# por ejemplo# EGuardarE un men2# que actua como contenedor para elementos de men2# y una $arra de men2# que sir"e de contenedor para cada uno de los men2s indi"iduales. Esto es al&o complicado por el ec o de que los controles de elementos de men2 se usan para dos cosas distintas. 1on tanto los controles que se colocan en el men2# y el control que se coloca en la $arra de men2# que# cuando se selecciona# acti"a el men2. Teamos las funciones que se usan para crear men2s y $arras de men2s. 5a primera funcin se usa para crear una nue"a $arra de men2) menuB$ar M &t(.4enuFar38 Esta funcin $astante autoexplicati"a crea una nue"a $arra de men2s. 1e puede usar el m%todo &t(.Aontainer add38 para meter la $arra de men2s en una "entana# o los m%todos pac( de &t(.Fox para meterlo en una caja U i&ual que los $otones. menu M &t(.4enu38 Esta funcin de"uel"e una referencia a un nue"o men2\ nunca se mostrar9 3con el m%todo s o'38 8# es slo un contenedor para elementos de men2s. Esto se aclarar9 m9s cuando se "ea el ejemplo que aparece m9s a$ajo. 5a si&uiente funcin se usa para crear elementos de men2s que se colocan en el men2 3y la $arra de men2s8) menuBitem M &t(.4enu:tem3labelM?one8 El par9metro label# si existe# se analizar9 $uscando caracteres mnemnicos. Esta llamada se usa para crear los elementos de men2 que se "an a "isualizar. @e$e recordarse la diferenciar entre un Emen2E como el que se crea con la funcin &t(.4enu38 y un Eelemento de men2E como el que se crea con &t(.4enu:tem38 . El elemento de men2 ser9 en realidad un $otn con una accin asociada# mientras que un men2 ser9 un contenedor que contiene elementos de men2. .na "ez se a creado un elemento de men2 es preciso meterlo en un men2. Esto se

consi&ue con el m%todo append38 . Para poder sa$er cu9ndo el usuario selecciona un elemento# se necesita conectarlo a la se=al Eacti"ateE de la forma a$itual. Por tanto# si se quiere crear un men2 est9ndar -rc i"o# con las opciones -$rir# Guardar# y 1alir# el cdi&o ser<a al&o asi como) fileBmenu M &t(.4enu38 Q ?o necesitamos mostrar los men2s

Q Areamos los elementos de men2 openBitem M &t(.4enu:tem3E-$rirE8 sa"eBitem M &t(.4enu:tem3EGuardarE8 quitBitem M &t(.4enu:tem3E1alirE8 Q 5os a=adimos al men2 fileBmenu.append3openBitem8 fileBmenu.append3sa"eBitem8 fileBmenu.append3quitBitem8 Q 1e conectan las funciones de retrollamada a la se=al Eacti"ateE openBitem.connectBo$ject3Eacti"ateE# menuitemBresponse# Efile.openE8 sa"eBitem.connectBo$ject3Eacti"ateE# menuitemBresponse# Efile.sa"eE8 Q se conecta el elemento quit a nuestra funcin de salida quitBitem.connectBo$ject 3Eacti"ateE# destroy# Efile.quitE8 Q 4ostramos los elementos de men2 openBitem.s o'38 sa"eBitem.s o'38 quitBitem.s o'38 En este punto tenemos nuestro men2. - ora es necesario crear una $arra de men2 y un elemento de men2 para la entrada -rc i"o# al que a=adiremos nuestro men2. El cdi&o es el si&uiente) menuB$ar M &t(.4enuFar38 'indo'.add3menuB$ar8 menuB$ar.s o'38 fileBitem M &t(.4enu:tem3E-rc i"oE8 fileBitem.s o'38 - ora necesitamos asociar el men2 con file_item. Esto se ace con el m%todo) menuBitem.setBsu$menu3sub"enu8 Por tanto# nuestro ejemplo continuar<a as<) menuBitem.setBsu$menu3fileBmenu8 5o 2nico que nos queda es a=adir el men2 a la $arra de men2s# lo cual se consi&ue con el

m%todo) menuB$ar.append3child8 que en nuestro caso es as<) menuB$ar.append3fileBitem8 1i queremos el men2 justificado a la derec a en la $arra de men2s# como suelen ser los men2s de ayuda# podemos usar el si&uiente m%todo 3de nue"o en file_item en nuestro ejemplo8 antes de a=adirlo a la $arra de men2s. menuBitem.setBri& tBjustified3ri& tBjustified8 -qui tenemos un resumen de los pasos necesarios para crear una $arra de men2s con men2s en ella) 1e crea un nue"o men2 con &t(.4enu38 1e acen "arias llamadas a &t(.4enu:tem38# una para cada elemento que se quiera tener en el men2. [ se usa el m%todo append38 para poner cada uno de estos elementos en el men2. 1e crea un elemento de men2 usando &t(.4enu:tem38. Este ser9 la raiz del men2# el texto que aparezca en %l estar9 en la propia $arra de men2s. 1e usa el m%todo setBsu$menu38 para a=adir el men2 al elemento raiz del men2 3el creado en el paso anterior8. 1e crea una nue"a $arra de men2s con &t(.4enuFar38. Este paso se 2nicamente una "ez al crear una serie de men2s en una $arra de men2s. 1e usa el m%todo append38 para poner el men2 raiz en la $arra de men2s. 5a creacin de un men2 emer&ente es pr9cticamente i&ual. 5a diferencia es que el men2 no se "isualiza Eautom9ticamenteE por una $arra de men2s# sino expl<citamente llamando al m%todo popup38 desde un e"ento de pulsacin de $otn# por ejemplo. 1e an de se&uir estos pasos) 1e crea una retrollamada que maneje el e"ento con el si&uiente formato) def andler3'id&et# e"ent8) y usar9 el e"ento para sa$er donde mostrar el men2. En el manejador del e"ento# si el e"ento es una pulsacin de $otn# se trata el e"ento como un e"ento de $otn 3realmente lo es8 y se usa como en el cdi&o de ejemplo para pasar informacin al m%todo popup38 . 1e enlaza el manejador del e"ento al control con) 'id&et.connectBo$ject3Ee"entE# andler# menu8 donde 'id&et es el control al que se est9 conectando# andler es la funcin manejadora# y menu es un men2 creado con &t(.4enu38. Esto puede ser un men2 ace

que tam$i%n est9 en una $arra de men2s# tal como se muestra en el cdi&o de ejemplo. 11.!. E)e"plo de 'en? 'anual Esto es m9s o menos lo que ace falta. Teamos el pro&rama de ejemplo "enu.py para ayudarnos a clarificar los conceptos. 5a fi&ura 7i&ura 11.1# VEjemplo de 4en2W muestra la "entana del pro&rama) #igura 11.1. E)e"plo de 'en?

El cdi&o fuente de "enu.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C QPGusrG$inGen" pyt on Q ejemplo menu.py import py&t( py&t(.require3N2.0N8 import &t( class 4enuExample) def BBinitBB3self8) Q create a ne' 'indo' 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBsizeBrequest3200# 1008 'indo'.setBtitle3EGTK 4enu TestE8 'indo'.connect3EdeleteBe"entE# lam$da '#e) &t(.mainBquit388 Q 1e inicia el control men2# y se a de recordar que OO?.?AQ se de$e mostrar con s o'38 este controlPP Q Este es el men2 que contiene los elementos de men2# el que Q se desple&ar9 al pulsar en E0oot 4enuE en la aplicacin menu M &t(.4enu38 Q @espu%s un peque=o $ucle construye tres entradas de men2 para Q EtestUmenuE. /$s%r"ese la llamada a &t(BmenuBappend. -qu< "amos Q a=adiendo una lista de elementos de men2 a nuestro men2. ?ormalmente tam$i%n Q interceptar<amos la se=al Eclic(edE para cada uno de los elementos de men2 y Q se esta$lecer<a una retrollamada para ellas# pero se omiten aqu< para a orrar espacio for i in ran&e3;8) Q Aopiar los nom$res a $uf $uf M ETestUundermenu U `dE ` i Q Arear un nue"o elemento de men2 con nom$re... menuBitems M &t(.4enu:tem3$uf8

;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2

Q ...y lo a=adimos al men2 menu.append3menuBitems8 Q +acemos al&o interesante cuando se selecciona el elemento de men2 menuBitems.connect3Eacti"ateE# self.menuitemBresponse# $uf8 Q 4ostramos el control menuBitems.s o'38 Q Este es el men2 ra<z# y ser9 la etiqueta mostrada en la $arra de men2 Q ?o tendr9 un manejador de se=al asociado# puesto que 2nicamente Q muestra el resto del men2 al pulsarlo. rootBmenu M &t(.4enu:tem3E0oot 4enuE8 rootBmenu.s o'38 Q - ora especificamos que queremos que nuestro recien creado EmenuE sea el Q men2 del men2 ra<z Eroot menuE rootBmenu.setBsu$menu3menu8 Q .na "$ox para poner un men2 y un $otn en %l) "$ox M &t(.TFox3&t(.7-51E# 08 'indo'.add3"$ox8 "$ox.s o'38 Q Areamos una $arra de men2 para los men2s# que a=adimos a la "entana principal menuB$ar M &t(.4enuFar38 "$ox.pac(Bstart3menuB$ar# &t(.7-51E# &t(.7-51E# 28 menuB$ar.s o'38 Q Areamos un $otn al que a=adir el men2 emer&ente $utton M &t(.Futton3Epress meE8 $utton.connectBo$ject3Ee"entE# self.$uttonBpress# menu8 "$ox.pac(Bend3$utton# &t(.T0.E# &t(.T0.E# 28 $utton.s o'38 Q [ finalmente a=adimos el elemento de men2 a la $arra de men2. Este es el Q elemento de men2 ra<z del que emos estado a$lando M8 menuB$ar.append 3rootBmenu8 Q siempres mostramos la "entana como 2ltimo paso# de manera que se di$uja todo Q de una "ez. 'indo'.s o'38 Q 0espondemos a una pulsacin de $otn con un men2 pasado como control E'id&etE Q Q ?tese que el ar&umento E'id&etE es el men2 pasado# ?/ Q el $otn que fue pulsado.

S; def $uttonBpress3self# 'id&et# e"ent8) SC if e"ent.type MM &t(.&d(.F.TT/?BP0E11) SJ 'id&et.popup3?one# ?one# ?one# e"ent.$utton# e"ent.time8 SI Q ?otificamos al cdi&o de llamada que emos manejado este e"ento. SR Q 5a cola aca$a aqu<. SS return &t(.T0.E SD Q ?otificamos al cdi&o de llamada que no manejamos este e"ento. 5a cola contin2a. D0 return &t(.7-51E D1 D2 Q :mprimimos una cadena cuando se selecciona un elemento de men2 D; def menuitemBresponse3self# 'id&et# strin&8) DC print E`sE ` strin& DJ DI def main38) DR &t(.main38 DS return 0 DD 100 if BBnameBB MM EBBmainBBE) 101 4enuExample38 102 main38 Tam$i%n se puede acer un elemento de men2 insensi$le y# usando una ta$la de atajos 3aceleradores8# conectar teclas a retrollamadas de men2s. 11./. :so de la #actoria de Ele"entos - ora que conocemos la forma dif<cil# as< es como se &t(.:tem7actory. 11.2. E)e"plo de #actoria de Ele"entos J Ite"#actory El pro&rama de ejemplo ite"-actory.py usa la &t(.:tem7actory. 5a fi&ura 7i&ura 11.2# VEjemplo de 7actoria de ElementosW muestra la "entana del pro&rama) #igura 11.!. E)e"plo de #actoria de Ele"entos ar<a usando las llamadas a

El cdi&o fuente de ite"-actory.py es) 1 2 ; C J I R S D QPGusrG$inGen" pyt on Q ejemplo itemfactory.py import &t( py&t(.require3N2.0N8 import &t( class :tem7actoryExample)

10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR

Q 0etrollamada $9sica o$li&atoria def printB ello3self# '# data8) print E+ello# >orldPE Q Esta es la estructura de la 7actoria de Elementos usada para &enerar nue"os men2s Q :tem 1) 5a ruta del men2. 5a letra despu%s del su$rayado indica Q una tecla de atajo cuando el men2 se a$ra Q :tem 2) 5a tecla de atajo para el elemento Q :tem ;) 5a retrollamada Q :tem C) 5a accin de retrollamada. Esto cam$ia los par9metros con Q los que la retrollamada es llamada. El "alor predeterminado es 0 Q :tem J) El tipo de elemento# usado para definir el tipo al que pertenece el elemento Q -qui est9n los posi$les "alores Q Q Q Q Q Q Q Q Q Q Q ?.55 UL Eg:temLE EE UL Eg:temLE EgTitleLE UL crear un elemento de t<tulo Eg:temLE UL crear un elemento simple EgA ec(:temLE UL crear un elemento de acti"acin EgTo&&le:temLE UL crear un $otn $iestado Eg0adio:temLE UL crear un $otn de exclusin m2tua gpat L UL ruta de un elemento de exclusin m2tua Eg1eparatorLE UL crear un separador EgFranc LE UL crear un contenedor de nue"os elementos Eg5astFranc LE UL crear una rama justificada a la derec a

def &etBmainBmenu3self# 'indo'8) accelB&roup M &t(.-ccelGroup38 Q Esta funcin inicializa la factor<a de elementos. Q Param 1) El tipo del men2 U puede ser 4enuFar# 4enu# Q u /ption4enu. Q Param 2) 5a ruta o camino del men2. Q Param ;) .na referencia a un -ccelGroup. 5a factoria de elementos esta$lece la Q ta$la de aceleradores 3atajos8 al &enerar los men2s. itemBfactory M &t(.:tem7actory3&t(.4enuFar# EgmainLE# accelB&roup8 Q Este m%todo &enera los elementos de men2. Pasa a la factor<a de elementos la lista Q de los elementos de men2 itemBfactory.createBitems3self.menuBitems8 Q -=adir el nue"o &rupo de aceleradores a la "entana. 'indo'.addBaccelB&roup3accelB&roup8 Q es necesario mantener una referencia a itemBfactory para e"itar su destruccin self.itemBfactory M itemBfactory Q 7inalmente# se de"uel"e la $arra de men2 creada por la factor<a de elementos. return itemBfactory.&etB'id&et3EgmainLE8

JS JD def BBinitBB3self8) I0 self.menuBitems M 3 I1 3 EGB7ileE# ?one# ?one# 0# EgFranc LE 8# I2 3 EG7ileGB?e'E# EgcontrolL?E# self.printB ello# 0# ?one 8# I; 3 EG7ileGB/penE# EgcontrolL/E# self.printB ello# 0# ?one 8# IC 3 EG7ileGB1a"eE# EgcontrolL1E# self.printB ello# 0# ?one 8# IJ 3 EG7ileG1a"e B-sE# ?one# ?one# 0# ?one 8# II 3 EG7ileGsep1E# ?one# ?one# 0# Eg1eparatorLE 8# IR 3 EG7ileGHuitE# EgcontrolLHE# &t(.mainquit# 0# ?one 8# IS 3 EGB/ptionsE# ?one# ?one# 0# EgFranc LE 8# ID 3 EG/ptionsGTestE# ?one# ?one# 0# ?one 8# R0 3 EGB+elpE# ?one# ?one# 0# Eg5astFranc LE 8# R1 3 EGB+elpG-$outE# ?one# ?one# 0# ?one 8# R2 8 R; 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 RC 'indo'.connect3EdestroyE# &t(.mainquit# E>4 destroyE8 RJ 'indo'.setBtitle3E:tem 7actoryE8 RI 'indo'.setBsizeBrequest3;00# 2008 RR RS mainB"$ox M &t(.TFox3&t(.7-51E# 18 RD mainB"$ox.setB$orderB'idt 318 S0 'indo'.add3mainB"$ox8 S1 mainB"$ox.s o'38 S2 S; menu$ar M self.&etBmainBmenu3'indo'8 SC SJ mainB"$ox.pac(Bstart3menu$ar# &t(.7-51E# &t(.T0.E# 08 SI menu$ar.s o'38 SR 'indo'.s o'38 SS SD def main38) D0 &t(.main38 D1 return 0 D2 D; if BBnameBB MM EBBmainBBE) DC :tem7actoryExample38 DJ main38 Por a ora esto es slo un ejemplo. 49s adelante aparecer9 una explicacin y muc os comentarios. Captulo 1!. Krea de Bibu)o Tabla de contenidos 12.1. Aontexto Gr9fico 12.2. 4%todos de @i$ujo

El control @ra'in&-rea 3erea de @i$ujo8 proporciona un lienzo en el que poder di$ujar de forma sencilla aciendo uso de los m%todos de la clase &t(.&d(.@ra'a$le 3Edi$uja$leE8. .n control @ra'in&-rea en realidad encapsula un elemento del tipo &t(.&d(.>indo' 3"entana8# que es una su$clase de &t(.&d(.@ra'a$le 3al i&ual que &t(.&d(.Pixmap8. Para crear un erea de @i$ujo se utiliza la funcin) dra'in&Barea M &t(.@ra'in&-rea38 5os elementos @ra'in&-rea 3erea de @i$ujo8 se crean inicialmente con un tama=o de 30#08# por lo que es necesario usar el si&uiente m%todo para poder acer "isi$le el erea de @i$ujo 3drawing_area8 asi&n9ndole un anc o y una altura distintas de cero) dra'in&Barea.setBsizeBrequest3(idth# height8 width y height especifican respecti"amente el anc o y alto del 9rea de di$ujo 3@ra'in&-rea8. Para di$ujar en este control es necesario acceder a su di$uja$le 3&t(.&d(.@ra'a$le8 asociado# en este caso una "entana 3&t(.&d(.>indo'8# utilizando su atri$uto 'indo') dra'a$le M dra'in&Barea.'indo' ota Para poder acceder a la "entana 3&t(.&d(.>indo'8 asociada al 9rea de di$ujo 3@ra'in&-rea8 y poder di$ujar en ella el erea de @i$ujo de$e a$er sido instanciada 3lo que da lu&ar a que &enere una se=al ErealizeE8. 1!.1. Contexto Gr5-ico +ay disponi$les "arios m%todos que nos facilitan el di$ujo en un 9rea de di$ujo 3en su &t(.&d(.@ra'a$le8. Todos ellos precisan un contexto &r9fico 3&t(.&d(.GA8 que al$er&a la informacin necesaria para lle"ar a ca$o el di$ujado. Para ello# un contexto &r9fico 3&t(.&d(.GA8 dispone de los si&uientes atri$utos)) $ac(&round Q fondo capBstyle Q estilo de fin de linea clipBmas( Q m9scara de recorte clipBxBori&in Q ori&en x del rect9n&ulo de recorte clipByBori&in Q ori&en y del rect9n&ulo de recorte fill Q relleno font Q fuente fore&round Q color de frente 3primer plano8 function Q funcin &rap icsBexposures Q exposiciones &r9ficas joinBstyle Q estilo de unin de l<neas lineBstyle Q estilo de linea lineB'idt Q anc o de linea stipple Q patrn de relleno su$B'indo' Q su$"entana

tile Q t<tulo tsBxBori&in Q ori&en x tsByBori&in Q ori&en y background 3fondo8 especifica el &t(.&d(.Aolor utilizado para di$ujar el fondo. foreground 3frente8 especifica el &t(.&d(.Aolor que se usa para di$ujar el color de primer plano. Para crear un &t(.&d(.Aolor que represente un color dado se emplea el m%todo allocBcolor38 de la clase &t(.&d(.Aolormap 34apa de Aolor8. Pre"iamente a la creacin de un color se de$e disponer de un mapa de color asociado a un control 3'id&et8. Para ello se de$e acer uso del si&uiente m%todo) colormap M 'id&et.&etBcolormap38 - la ora de especificar un &t(.&d(.Aolor tenemos "arias opciones. Por un lado se puede indicar el color deseado utilizando una cadena de texto 3tales como EredE 3rojo8# Eoran&eE 3naranja8 o Ena"ajo ' iteE 3$lanco na"ajo8 de entre las que se definen en el arc i"o r&$.txt de 6 >indo'\ o# por otro lado# se puede indicar un triplete de n2meros enteros# situados dentro del ran&o de "alores 0 a IJJ;J# que indican la cantidad de rojo 3red8# "erde 3&reen8 y azul 3$lue8 cuya mezcla produce el color deseado. -dem9s se pueden especificar otras propiedades que especifican si el color es modifica$le 3propiedad 'ritea$le8# de manera que es posi$le modificar su "alor despu%s pero no se puede compartir\o si se de$e seleccionar el color m9s parecido entre los disponi$les cuando no sea posi$le representar el color exacto 3propiedad $estBmatc 8. El m%todo allocBcolor38 se define as<) color M colormap.allocBcolor3red# green# blue# (riteableM7-51E# best."atchMT0.E8 color M colormap.allocBcolor3spec# (riteableM7-51E# best."atchMT0.E8 Ejemplos de uso de esta funcin) na"ajo' ite M colormap.alloc3Nna"ajo ' iteN8 cyan M colormap.alloc30# IJJ;J# IJJ;J8 cap_style especifica el estilo con el que se di$ujan los extremos de las l<neas que no est9n conectadas a otras l<neas. 5os diferentes estilos disponi$les son) i&ual que A-PBF.TT para lineas con anc o distinto de cero. En el caso de l<neas de anc o cero no se di$uja el punto final de la linea. los extremos de las lineas se di$ujan como cuadrados que se extienden A-PBF.TT asta las coordenadas del punto final. los extremos de las lineas se di$ujan como semic<rculos de di9metro A-PB0/.?@ i&ual al &rosor de la linea y cuyo centro se sit2a en el punto final. A-PBP0/*EAT:? los extremos de las lineas son di$ujados como cuadrados que se G prolon&an medio &rosor m9s all9 del punto final. A-PB?/TB5-1T

clip_mask especifica un mapa de p<xeles 3&t(.&d(.Pixmap8 que se usar9 para recorte del di$ujo contenido en el 9rea de di$ujo 3drawing_area8.

acer el

clip_x_origin y clip_y_origin especifican los "alores de las coordenadas x e y correspondientes al ori&en del rect9n&ulo de recorte tomando como referencia la esquina superior izquierda del 9rea de di$ujo 3drawing_area8. fill especifica el estilo de relleno usado en el di$ujo. 5os estilos de relleno que se encuentran disponi$les son) di$uja utilizando el color de primer plano 3fore&round8. di$uja usando un patrn en cuadr<cula. di$uja usando un patrn de mapa de $its. 5os p<xeles correspondientes a los $its acti"ados 3a uno8 del mapa de $its se di$ujan usando el color de primer 1T:PP5E@ plano 3fore&raund8 y aquellos correspondientes a los $its que no est9n acti"ados se dejan intactos. di$uja usando un patrn de mapa de $its. 5os p<xeles correspondientes a los /P-H.EB1T:P $its del mapa de $its que est9n acti"ados 3a uno8 se di$ujan con el color de P5E@ primer plano\ aquellos correspondientes a los $its que no est9n acti"ados se di$ujan con el color de fondo. font es la &t(.&d(.7ont 37uente8 que se usa cmo fuente predeterminada para di$ujar texto. ota El uso del atri$uto font est9 o$soleto. function especifica una funcin usada para com$inar los "alores de los $its de los p<xeles de ori&en con los "alores de los $its de los p<xeles de destino y producir un pixel transformado. 5os 1I posi$les "alores de este par9metro corresponden a las ta$las de "erdad posi$les de tama=o 2x2. 1in em$ar&o# solamente al&unos de estos "alores tienen utilidad en la pr9ctica. -s<# en el caso de im9&enes a color es frecuentel el uso de A/P[# 6/0 e :?TE0T y en el de mapas de $its tam$i%n son a$ituales -?@ y /0. 5os "alores posi$les de function son) A/P[ Q Aopiar :?TE0T Q :n"ertir 6/0 Q / exclusi"o A5E-0 Q 5impiar -?@ Q[ -?@B0ETE01E Q [ al re"%s -?@B:?TE0T Q [ in"ertida ?//P Q ?ada /0 Q/ EH.:T Q equi"alencia /0B0ETE01E Q / al re"%s A/P[B:?TE0T Q Aopiar in"ertido /0B:?TE0T Q / in"ertido ?-?@ Q ?oU[ 1ET Q 7ijar 1/5:@ T:5E@

graphics_exposures especifica si las exposiciones &r9ficas est9n acti"adas 3T0.E8 o desacti"adas 37-51E8. Auando graphics_exposures tiene el "alor T0.E un fallo al copiar un p<xel en una operacin de di$ujo &enera un e"ento expose y en el caso de que la copia ten&a %xito se &enerar9 un e"ento noexpose. join_style especifica el estilo de unin que se usa en los encuentros de lineas en 9n&ulo. 5os estilos disponi$les son) */:?B4:TE0 los lados de cada linea se extienden para unirse en 9n&ulo. */:?B0/.? los lados de las dos lineas se unen con un arco de c<rculo. @ los lados de las dos lineas se unen en c afl9n# una linea recta que forma el */:?BFETE5 mismo 9n&ulo con cada una de las l<neas. line_style especifica el estilo con el que se di$uja una linea. 5os estilos disponi$les son) 5:?EB1/5:@ las lineas se di$ujan EslidasE 3l<nea continua8. 5:?EB/?B/77B se di$ujan los se&mentos impares\ los se&mentos pares no se di$ujan 3l<nea @-1+ discont<nua8. los se&mentos impares son normales. 5os se&mentos pares se di$ujan con 5:?EB@/.F5E el color de fondo si el estilo de relleno es 1/5:@# o con el color de fondo B@-1+ aplicado a la m9scara del patrn si el estilo de relleno es 1T:PP5E@. line_width especifica el anc o con el que se di$ujan las l<neas. stipple especifica el &t(.&d(.Pixmap que se usar9 como patrn cuando el relleno est% puesto a 1T:PP5E@ o a /P-H.EB1T:PP5E@. sub_window especifica el modo de di$ujo de una "entana 3&t(.&d(.>indo'8 que tiene "entanas ijas 3&t(.&d(.>indo's8. 5os "alores posi$les de este par9metro son) slo se di$uja en la propia "entana pero no en sus "entanas ijas. :?A5.@EB:?7E0:/01 di$uja en la "entana y en sus "entanas ijas. tile especifica el &t(.&d(.Pixmap que se usar9 para di$ujo cuadriculado cuando el relleno 3fill8 est% puesto a T:5E@. A5:PBF[BA+:5@0E? ts_x_origin y ts_y_origin especifican las posiciones iniciales 3el ori&en8 de los mapas de $its de patrn y de di$ujo cuadriculado. .n Aontexto Gr9fico nue"o se crea mediante una llamada al m%todo &t(.&d(.@ra'a$le ne'B&c38 ) &c M dra'a$le.ne'B&c3-oregroundM?one# backgroundM?one# -ontM?one# -unctionMU1# -illMU1# tileM?one# stippleM?one# clip."askM?one# sub(indo(."odeMU1# ts.x.originMU1# ts.y.originMU1# clip.x.originMU1# clip.y.originMU1# graphics.exposuresMU1# line.(idthMU1# line.styleMU1# cap.styleMU1 )oin.styleMU18 Para poder crear un nue"o Aontexto Gr9fico usando este m%todo es preciso que el control

3correspondiente a dra'a$le8 sea) una "entana 3&t(.&d(.>indo'8 ya realizada 3realized8# o $ien) un mapa de p<xeles 3&t(.&d(.Pixmap8 asociado a una "entana 3&t(.&d(.>indo'8 ya realizada. 5os di"ersos atri$utos del Aontexto Gr9fico tienen los "alores por defecto si no se fijan en el m%todo ne'B&c38. 1i se desea esta$lecer el "alor de los atri$utos de los contextos &r9ficos mediante el m%todo ne'B&c38 resulta muy pr9ctico el uso de ar&umentos con nom$re de Pyt on. Tam$i%n se pueden esta$lecer los atri$utos indi"iduales de un &t(.&d(.GA asis&nando "alores a los atri$utos correspondientes. Estos son al&unos ejemplos de ello) &c.capBstyle M A-PBF.TT &c.lineB'idt M 10 &c.fill M 1/5@ &c.fore&round M micolor o usando los si&uientes m%todos) &c.setBfore&round3color8 &c.setB$ac(&round3color8 &c.setBfunction3function8 &c.setBfill3fill8 &c.setBtile3tile8 &c.setBstipple3stipple8 &c.setBtsBori&in3x# y8 &c.setBclipBori&in3x# y8 &c.setBclipBmas(3mas(8 &c.setBclipBrectan&le3rectan&le8 &c.setBsu$'indo'3mode8 &c.setBexposures3exposures8 &c.setBlineBattri$utes3lineB'idt # lineBstyle# capBstyle# joinBstyle8 El patrn de trazos que se usa cuando el par9metro de estilo de linea 3 line_style8 es 5:?EB/?B/77B@-1+ o 5:?EB@/.F5EB@-1+ se puede fijar aciendo uso del si&uiente m%todo) &c.setBdas es3offset# das Blist8 donde offset 3desplazamiento8 es el <ndice del "alor del trazo inicial en dash_list y dash_list 3lista de trazos8 es una lista o tupla que contiene los n2meros de p<xeles que di$ujar o saltar para formar los trazos. ]stos se di$ujan empezando con el n2mero de p<xeles en la posicin de desplazamiento3offset8\ despu%s# el si&uiente n2mero de p<xeles no se di$uja# y# lue&o# se di$uja el si&uiente n2mero de p<xeles\\ y as< se contin2a recorriendo todos los n2meros de la lista de trazos y empezando otra "ez cuando se lle&a a su final. Por ejemplo# si la lista de trazos es 32# C# S# 1I8 y el desplazamiento es 1# los trazos se di$ujar9n as<) di$uja C p<xeles# salta S p<xeles# di$uja 1I p<xeles# salta 2 p<xeles# di$uja C p<xeles# y as< sucesi"amente.

Es posi$le acer una copia de un &t(.&d(.GA existente utilizando el m%todo) &c.copy3src.gc8 5os atri$utos de gc ser9n los mismos que los de src_gc. 1!.!. 'Ctodos de Bibu)o +ay un conjunto &eneral de m%todos que se pueden usar para di$ujar en el 9rea de di$ujo. Estos m%todos de di$ujo funcionan en cualquier &t(.&d(.@ra'a$le 3@i$uja$le8# que es una &t(.&d(.>indo' 3Tentana8 o un &t(.&d(.Pixmap 34apa de P<xeles8. 5os m%todos de di$ujo son) dra'a$le.dra'Bpoint3gc# x# y8 Q di$ujaBpunto gc es el Aontexto Gr9fico que se usar9 para acer el di$ujo. x e y son las coordenadas del punto. dra'a$le.dra'Bline3gc# x1# y1# x!# y!8 Q di$uja linea gc es el Aontexto Gr9fico. x e y especifican el punto de inicio de la linea. x! e y! especifican el punto final de la linea. dra'a$le.dra'Brectan&le3gc# -illed# x# y# (idth# height8 Q di$uja rect9n&ulo gc es el Aontexto Gr9fico. filled es un "alor $ooleano que indica si el rect9n&ulo de$e ser rellenado con el color de primer plano 3"alor T0.E8 o no 3"alor 7-51E8. x e y son las coordenadas de la esquina superior izquierda del rect9n&ulo. width y height son el anc o y el alto del rect9n&ulo. dra'a$le.dra'Barc3gc# -illed# x# y# (idth# height# angle1# angle!8 Q di$uja arco gc es el Aontexto Gr9fico. filled es un "alor $ooleano que indica si el arco de$e ser rellenado con el color de primer plano 3"alor T0.E8 o no 3"alor 7-51E8. x e y son las coordenadas de la esquina superior izquierda del rect9n&ulo que $ordea al arco. width y height son el anc o y el alto del rect9n&ulo que $ordea al arco. angle es el 9n&ulo inicial del arco# relati"o a la posicin de las ; en punto del reloj# en el sentido contrario de las a&ujas del reloj# en sesenta y cuatroa"os de &rado. angle! es el 9n&ulo final del arco# relati"o a angle # en sesenta y cuatroa"os de &rado en el sentido de las a&ujas del reloj. dra'a$le.dra'Bpoly&on3gc# -illed# points8 Q di$uja pol<&ono gc es el Aontexto Gr9fico.

filled es un "alor $ooleano que especifica si el pol<&ono de$e ser rellenado con el color de primer plano o3"alor T0.E8 o no 3"alor 7-51E8. points es una lista de los puntos que se "an a di$ujar como un pol<&ono conectado# escrita como una lista de tuplas con las coordenadas# como por ejemplo) ^ 30#08# 32#J8# 3;#R8# 3C#118 _. dra'a$le.dra'Bstrin&3-ont# gc# x# y# string8 Q di$uja cadena dra'a$le.dra'Btext3-ont# gc# x# y# string8 Q di$uja texto font es la &t(.&d(.7ont 3fuente8 que se usar9 para pintar la cadena. gc es el Aontexto Gr9fico. x e y son las coordenadas del punto donde se empezar9 a di$ujar la cadena# es decir# la l<nea $ase izquierda. string es la cadena de caracteres a di$ujar. ota -m$os m%todos dra'Bstrin&38 y dra'Btext38 est9n o$soletos U en su lu&ar se de$e usar un pan&o.5ayout con el m%todo dra'Blayout38 . dra'a$le.dra'Blayout3gc# x# y# layout8 Q di$uja disposicin gc es el Aontexto Gr9fico. x e y son las coordenadas del punto desde el que se empieza a di$ujar la disposicin. layout es el pan&o.5ayout que se "a a di$ujar. dra'a$le.dra'Bdra'a$le3gc# src# xsrc# ysrc# xdest# ydest# (idth# height8 Q di$uja di$uja$le gc es el Aontexto Gr9fico. src es el di$uja$le de or<&en. xsrc e ysrc son las coordenadas de la esquina superior izquierda del rect9n&ulo en el di$uja$le de or<&en. xdest e ydest son las coordenadas de la esquina superior izquierda en el 9rea de di$ujo. width y height son el anc o y el alto del 9rea del di$uja$le de ori&en que ser9 copiada al di$uja$le 3drawable8. 1i width o height es U1 entonces se usar9 el anc o o el alto total del di$uja$le. dra'a$le.dra'Bima&e3gc# i"age# xsrc# ysrc# xdest# ydest# (idth# height8 Q di$uja ima&en gc es el Aontexto Gr9fico. image es la ima&en de ori&en. xsrc e ysrc son las coordenadas de la esquina superior izquierda del rect9n&ulo en el di$uja$le ori&en.

xdest e ydest son las coordenadas de la esquina superior izquierda del rect9n&ulo en el 9rea de di$ujo. width y height son el anc o y el alto del 9rea del di$uja$le ori&en que se copiar9 en el di$uja$le 3drawable8 destino. 1i width o height es U1 entonces se usar9 el anc o o el alto total de la ima&en. dra'a$le.dra'Bpoints3gc# points8 Q di$uja puntos gc es el Aontexto Gr9fico. points es una lista o tupla de pares de coordenadas en tuplas# por ejemplo ^ 30#08# 32#J8# 3;#R8# 3C#118 _# que representa la lista de los puntos que se de$en di$ujar. dra'a$le.dra'Bse&ments3gc# segs8 Q di$uja se&mentos gc es el Aontexto Gr9fico. segs es una lista o tupla de tuplas que representan las coordenadas de los puntos iniciales y finales de los se&mentos que se quiere di$ujar# tal como) ^ 30#0# 1#J8# 32#J# 1#R8# 3;#R# 1#118# 3C#11# 1#1;8 _ . dra'a$le.dra'Blines3gc# points8 Q di$uja lineas gc es el Aontexto Gr9fico. points es una lista o tupla de pares de coordenadas en tuplas# como por ejemplo ^ 30#08# 32#J8# 3;#R8# 3C#118 _# que representa la lista de de los puntos que se "an a conectar con l<neas. dra'a$le.dra'Br&$Bima&e3gc# x# y# (idth# height# dith# rgb.bu-# ro(stride8 Q di$uja ima&en r&$

dra'a$le.dra'Br&$B;2Bima&e3gc# x# y# (idth# height# dith# bu-# ro(stride8 Q di$uja ima&en r&$ ;2

dra'a$le.dra'B&rayBima&e3gc# x# y# (idth# height# dith# bu-# ro(stride8 Q di$uja ima&en en esca gc es el Aontexto Gr9fico. x e y son las coordenadas de la esquina superior izquierda del rect9n&ulo que $ordea la ima&en. width y height son el anc o y el alto del rect9n&ulo que $ordea la ima&en. dith es el uno de los m%todos de mezclado que se explican a continuacin) Para el m%todo dra'Br&$Bima&e38 # rgb_buf es el conjunto de los datos de la ima&en 0GF codificado en una cadena como una secuencia de tripletes de p<xeles 0GF de S $its. Para el m%todo dra'Br&$B;2Bima&e38 # buf es el conjunto de los datos de la ima&en 0GF codificado en una cadena como una secuencia de tripletes de p<xeles 0GF de S $its con relleno de S $its 3C caracteres por cada p<xel 0GF8. Para el m%todo dra'B&rayBima&e38 # buf es el conjunto de datos de la ima&en codificado en una cadena como p<xeles de S $its. rowstride es el n2mero de caracteres desde el principio de una fila asta el principio de la si&uiente en la ima&en. rowstride normalmente tiene un "alor por defecto de ; Z anc o 3width8 en el m%todo dra'Br&$Bima&e38 \ C Z anc o 3width8para el m%todo

dra'Br&$B;2Bima&e38\ y el anc o 3width8 para el m%todo dra'B&rayBima&e38 . 1i rowstride es 0 entonces la linea se repetir9 un n2mero de "eces i&ual al alto. 5os modos de mezclado 3dither8 son) 0GFB@:T+E0B?/?E Q ?unca se ace mezclado

0GFB@:T+E0B?/04-5 Q 1e ace mezclado cuando se usen S $its por p<xel 3o menos8 slamente. 0GFB@:T+E0B4-6 Q 1e ace mezclado cuando se usen 1I $its por p<xel o menos.

El pro&rama de ejemplo dra(ingarea.py muestra el uso de la mayor<a de los m%todos de un 9rea de di$ujo 3@ra'in&-rea8. Tam$i%n inserta el 9rea de di$ujo 3@ra'in&-rea8 en el interior de una "entana con $arras de desplazamiento 31crolled>indo'8 y a=ade los controles de desplazamiento orizontal y "ertical 30uler8. 5a fi&ura 7i&ura 12.1# VEjemplo de erea de @i$ujoW muestra la "entana resultante) #igura 1!.1. E)e"plo de Krea de Bibu)o

El cdi&o fuente de dra(ingarea.py est9 a$ajo y usa el mapa de p<xeles &t(.xpm ) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I QPGusrG$inGen" pyt on Q example dra'in&area.py import py&t( py&t(.require3N2.0N8 import &t( import operator import time import strin& class @ra'in&-reaExample) def BBinitBB3self8) 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 'indo'.setBtitle3EEjemplo de erea de @i$ujoE8 'indo'.connect3EdestroyE# lam$da ') &t(.mainBquit388 self.area M &t(.@ra'in&-rea38 self.area.setBsizeBrequest3C00# ;008 self.pan&olayout M self.area.createBpan&oBlayout3EE8 self.s' M &t(.1crolled>indo'38 self.s'.addB'it B"ie'port3self.area8 self.ta$le M &t(.Ta$le32#28 self. ruler M &t(.+0uler38 self."ruler M &t(.T0uler38 self. ruler.setBran&e30# C00# 0# C008 self."ruler.setBran&e30# ;00# 0# ;008

2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC

self.ta$le.attac 3self. ruler# 1# 2# 0# 1# yoptionsM08 self.ta$le.attac 3self."ruler# 0# 1# 1# 2# xoptionsM08 self.ta$le.attac 3self.s'# 1# 2# 1# 28 'indo'.add3self.ta$le8 self.area.setBe"ents3&t(.&d(.P/:?TE0B4/T:/?B4-1K b &t(.&d(.P/:?TE0B4/T:/?B+:?TB4-1K 8 self.area.connect3EexposeUe"entE# self.areaBexposeBc$8 def motionBnotify3ruler# e"ent8) return ruler.emit3EmotionBnotifyBe"entE# e"ent8 self.area.connectBo$ject3EmotionBnotifyBe"entE# motionBnotify# self. ruler8 self.area.connectBo$ject3EmotionBnotifyBe"entE# motionBnotify# self."ruler8 self. adj M self.s'.&etB adjustment38 self."adj M self.s'.&etB"adjustment38 def "alBc$3adj# ruler# oriz8) if oriz) span M self.s'.&etBallocation38^;_ else) span M self.s'.&etBallocation38^2_ l#u#p#m M ruler.&etBran&e38 " M adj."alue ruler.setBran&e3"# "!span# p# m8 ' ile &t(.e"entsBpendin&38) &t(.mainBiteration38 self. adj.connect3N"alueUc an&edN# "alBc$# self. ruler# True8 self."adj.connect3N"alueUc an&edN# "alBc$# self."ruler# 7alse8 def sizeBallocateBc$3'id# allocation8) x# y# '# M allocation l#u#p#m M self. ruler.&etBran&e38 m M max3m# '8 self. ruler.setBran&e3l# l!'# p# m8 l#u#p#m M self."ruler.&etBran&e38 m M max3m# 8 self."ruler.setBran&e3l# l! # p# m8 self.s'.connect3NsizeUallocateN# sizeBallocateBc$8 self.area.s o'38 self. ruler.s o'38 self."ruler.s o'38 self.s'.s o'38 self.ta$le.s o'38 'indo'.s o'38 def areaBexposeBc$3self# area# e"ent8) self.style M self.area.&etBstyle38 self.&c M self.style.f&B&c^&t(.1T-TEB?/04-5_ self.dra'Bpoint310#108 self.dra'Bpoints3110# 108

RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122

self.dra'Bline3210# 108 self.dra'Blines3;10# 108 self.dra'Bse&ments310# 1008 self.dra'Brectan&les3110# 1008 self.dra'Barcs3210# 1008 self.dra'Bpixmap3;10# 1008 self.dra'Bpoly&on310# 2008 self.dra'Br&$Bima&e3110# 2008 return &t(.T0.E def dra'Bpoint3self# x# y8) self.area.'indo'.dra'Bpoint3self.&c# x!;0# y!;08 self.pan&olayout.setBtext3EPuntoE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!J0# self.pan&olayout8 return def dra'Bpoints3self# x# y8) points M ^3x!10#y!108# 3x!10#y8# 3x!C0#y!;08# 3x!;0#y!108# 3x!J0#y!108_ self.area.'indo'.dra'Bpoints3self.&c# points8 self.pan&olayout.setBtext3EPuntosE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!J0# self.pan&olayout8 return def dra'Bline3self# x# y8) self.area.'indo'.dra'Bline3self.&c# x!10# y!10# x!20# y!;08 self.pan&olayout.setBtext3E5<neaE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!J0# self.pan&olayout8 return def dra'Blines3self# x# y8) points M ^3x!10#y!108# 3x!10#y8# 3x!C0#y!;08# 3x!;0#y!108# 3x!J0#y!108_ self.area.'indo'.dra'Blines3self.&c# points8 self.pan&olayout.setBtext3E5<neasE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!J0# self.pan&olayout8 return def dra'Bse&ments3self# x# y8) se&ments M 33x!20#y!10# x!20#y!R08# 3x!I0#y!10# x!I0#y!R08# 3x!10#y!;0 # x!R0#y!;08# 3x!10# y!J0 # x!R0# y!J088 self.area.'indo'.dra'Bse&ments3self.&c# se&ments8 self.pan&olayout.setBtext3E1e&mentosE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!S0# self.pan&olayout8 return def dra'Brectan&les3self# x# y8) self.area.'indo'.dra'Brectan&le3self.&c# &t(.7-51E# x# y# S0# R08

12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2 1C; 1CC 1CJ 1CI 1CR 1CS 1CD 1J0 1J1 1J2 1J; 1JC 1JJ 1JI 1JR 1JS 1JD 1I0 1I1 1I2 1I; 1IC 1IJ 1II 1IR 1IS 1ID 1R0

self.area.'indo'.dra'Brectan&le3self.&c# &t(.T0.E# x!10# y!10# 20# 208 self.area.'indo'.dra'Brectan&le3self.&c# &t(.T0.E# x!J0# y!10# 20# 208 self.area.'indo'.dra'Brectan&le3self.&c# &t(.T0.E# x!20# y!J0# C0# 108 self.pan&olayout.setBtext3E0ect9n&ulosE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!S0# self.pan&olayout8 return def dra'Barcs3self# x# y8) self.area.'indo'.dra'Barc3self.&c# &t(.7-51E# x!10# y# R0# R0# 0# ;I0ZIC8 self.area.'indo'.dra'Barc3self.&c# &t(.T0.E# x!;0# y!20# 10# 10# 0# ;I0ZIC8 self.area.'indo'.dra'Barc3self.&c# &t(.T0.E# x!J0# y!20# 10# 10# 0# ;I0ZIC8 self.area.'indo'.dra'Barc3self.&c# &t(.T0.E# x!;0# y!10# ;0# J0# 210ZIC# 120ZIC8 self.pan&olayout.setBtext3E-rcosE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!S0# self.pan&olayout8 return def dra'Bpixmap3self# x# y8) pixmap# mas( M &t(.&d(.pixmapBcreateBfromBxpm3 self.area.'indo'# self.style.$&^&t(.1T-TEB?/04-5_# E&t(.xpmE8 self.area.'indo'.dra'Bdra'a$le3self.&c# pixmap# 0# 0# x!1J# y!2J# U1# U18 self.pan&olayout.setBtext3E4apa de P<xelesE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!S0# self.pan&olayout8 return def dra'Bpoly&on3self# x# y8) points M ^3x!10#y!I08# 3x!10#y!208# 3x!C0#y!R08# 3x!;0#y!;08# 3x!J0#y!C08_ self.area.'indo'.dra'Bpoly&on3self.&c# &t(.T0.E# points8 self.pan&olayout.setBtext3EPol<&onoE8 self.area.'indo'.dra'Blayout3self.&c# x!J# y!S0# self.pan&olayout8 return def dra'Br&$Bima&e3self# x# y8) $ M S0Z;ZS0Z^Na0N_ for i in ran&e3S08) for j in ran&e3S08) $^;ZS0Zi!;Zj_ M c r32JJU;Zi8 $^;ZS0Zi!;Zj!1_ M c r32JJU;Za$s3iUj88 $^;ZS0Zi!;Zj!2_ M c r32JJU;Zj8 $uff M strin&.join3$# NN8 self.area.'indo'.dra'Br&$Bima&e3self.&c# x# y# S0# S0# &t(.&d(.0GFB@:T+E0B?/?E# $uff# S0Z;8

1R1 self.pan&olayout.setBtext3E:ma&en 0GFE8 1R2 self.area.'indo'.dra'Blayout3self.&c# x!J# y!S0# self.pan&olayout8 1R; return 1RC 1RJ def main38) 1RI &t(.main38 1RR return 0 1RS 1RD if BBnameBB MM EBBmainBBE) 1S0 @ra'in&-reaExample38 1S1 main38 Captulo 1/. Control de $ista de Texto Tabla de contenidos 1;.1. Perspecti"a &eneral de la Tista de Texto 1;.2. Tistas de Texto 1;.;. Fuffers de Texto 1;.;.1. :nformacin de estado de un Fuffer de Texto 1;.;.2. Areacin de :teradores de Texto 1;.;.;. :nsercin# /$tencin y Eliminacin de Texto 1;.;.C. 4arcas de Texto 3Text4ar(8 1;.;.J. Areacin y .so de Etiquetas de Texto 1;.;.I. :nsercin de :m9&enes y Aontroles 1;.C. :teradores de Texto 1;.C.1. -tri$utos de los :teradores de Texto 1;.C.2. -tri$utos de Texto de un :terador de Texto 1;.C.;. Aopiar un :terador de Texto 1;.C.C. 0ecuperar Texto y /$jetos 1;.C.J. Aompro$ar Aondiciones en un :terador de Texto 1;.C.I. Aompro$ar la posicin en un Texto 1;.C.R. 4o"imiento a tra"%s del Texto 1;.C.S. 4o"erse a una Posicin @eterminada 1;.C.D. F2squeda en el Texto 1;.J. 4arcas de Texto 1;.I. Etiquetas de Texto y Ta$las de Etiquetas 1;.I.1. Etiquetas de Texto 1;.I.2. Ta$las de Etiquetas de Texto 1;.R. .n ejemplo de Tista de Texto 1/.1. Perspecti0a general de la $ista de Texto El control TextTie' y sus o$jetos asociados 3TextFuffers# Text4ar(s# Text:ters# TextTa&s y TextTa&Ta$les8 proporcionan un potente marco para la edicin de textos multil<nea. .n TextFuffer 3Fuffer de Texto8 contiene el texto que se "isualizar9 en uno o m9s controles TextTie' 3Tista de Texto8

En GTK! 2.0 el texto se codifica en .T7US de modo que la codificacin de un caracter puede estar compuesta por "arios $ytes. @entro de un TextFuffer es necesario diferenciar entre contadores de car9cteres 3llamados desplazamientos8 y contadores de $ytes 3llamados <ndices8. 5os Text:ters 3:teradores de Texto8 proporcionan una representacin ef<mera de la posicin entre dos car9cteres dentro de un TextFuffer . 5os Text:ters son "9lidos asta que el n2mero de caracteres en el TextFuffer cam$ia\ Por ejemplo# siempre que se inserten o se $orren car9cteres en el TextFuffer todos los Text:ters se in"alidan. 5os Text:ters son la principal forma de especificar localizaciones en un TextFuffer para manipular texto. 5os Text4ar(s 34arcas de Texto8 se proporcionan para permitir almacenar posiciones en un TextFuffer que se mantienen entre modificaciones del $uffer. .na marca es cmo un Text:ter 3representa una posicin entre dos car9cteres en un TextFuffer8 pero si el texto alrededor de la marca se $orra# la marca permanece donde esta$a el texto $orrado. @e la misma forma# si se inseta texto en la marca# la marca aca$a $ien a la izquierda o $ien a la derec a del texto insertado# dependiendo de la &ra"edad de la marca U &ra"edad a la derec a deja la marca a la derec a del texto insertado mientras que &ra"edad a la izquierda deja la marca a la izquierda. 5as Text4ar(s se pueden asociar a un nom$re o dejarlas annimas si no se les da un nom$re. Aada TextFuffer tiene dos marcas predefinidas llamadas insert 3insertar8 y selection_bound 3l<mite de seleccin8. Estas marcas se refieren al punto de insercin y al l<mite de la seleccin 3la seleccin est9 entre las marcas insert y selection_bound8. 5as TextTa&s 3Etiquetas de Texto8 son o$jetos que especifican un conjunto de atri$utos que se pueden aplicar a un ran&o de texto en un TextFuffer. Aada TextFuffer tiene una TextTa&Ta$le 3Ta$la de Etiquetas de Texto8 que contiene las etiquetas disponi$les en ese $uffer. 5as TextTa&Ta$les se pueden compartir entre TextFuffers para ofrecer consistencia. 5os TextTa&s normalmente se usan para cam$iar la apariencia de un ran&o de texto pero tam$i%n pueden usarse para e"itar que un ran&o de texto sea editado. 1/.!. $istas de Texto 1lo ay una funcin para crear un control TextTie' 3Tista de Texto8. text"ie' M &t(.TextTie'3bu--erM?one8 Auando se crea una TextTie' tam$i%n se crear9 un TextFuffer 3Fuffer de Texto8 asociado y una TextTa&Ta$le 3Ta$la de Etiquetas de Texto8 de forma predeterminada. 1i quieres usar un TextFuffer ya existente en una "ista de texto TextTie' puedes especificarlo en el m%todo anterior. Para cam$iar el TextFuffer que usa una TextTie' usa el si&uiente m%todo) text"ie'.setB$uffer3bu--er8 .sa el si&uiente m%todo para o$tener una referencia al TextFuffer a partir de una TextTie') $uffer M text"ie'.&etB$uffer38 .n control de TextTie' no tiene $arras de desplazamiento para ajustar la "ista en caso de que el texto sea m9s &rande que la "entana. Para incluir $arras de desplazamiento# es necesario incluir la TextTie' en una 1crolled>indo' 3Tentana de @esplazamiento8.

.na TextTie' se puede usar para permitir la edicin de un cuerpo de texto# o para mostrar "arias l<neas de un texto de slo lectura al usuario o usuaria. Para cam$iar entre estos modos de operacin se utiliza el m%todo) text"ie'.setBedita$le3setting8 El ar&umento setting puede ser T0.E o 7-51E y especifica si se permite la edicin del contenido del control TextTie'. El modo de edicin de la TextTie' se puede cam$iar por zonas de texto dentro del TextFuffer usando TextTa&s. Puedes o$tener el modo actual de edicin usando el m%todo) settin& M text"ie'.&etBedita$le38 Auando la TextTie' no es edita$le pro$a$lemente se de$er<a ocultar el cursor usando el m%todo) text"ie'.setBcursorB"isi$le3setting8 El ar&umento setting puede ser T0.E o 7-51E y especifica si el cursor de$e ser "isi$le. 5a TextTie' puede ajustar las l<neas de texto que son demasiado lar&as para que quepan en una 2nica l<nea de la "entana. El comportamiento predeterminado es no ajustar las l<neas. Es posi$le cam$iarlo usando el m%todo) text"ie'.setB'rapBmode3(rap."ode8 Este m%todo te permite especificar que el texto de$e ajustarse en los l<mites de pala$ras o caracteres. El ar&umento word_wrap puede ser) &t(.>0-PB?/?E Q sin ajuste &t(.>0-PBA+-0 Q ajuste por caracteres &t(.>0-PB>/0@ Q ajuste por pala$ras 5a justificacin predetermianda del texto en una TextTie' se puede esta$lecer y o$tener usando los m%todos) text"ie'.setBjustification3)usti-ication8 justification M text"ie'.&etBjustification38 donde justification puede ser) &t(.*.1T:7[B5E7T Q justificacin a la izquierda &t(.*.1T:7[B0:G+T Q justificacin a la derec a &t(.*.1T:7[BAE?TE0 Q justificacin al centro ota 5a justificaci"n ser9 *.1T:7[B5E7T si el wrap_mode 3modo de ajuste8 es >0-PB?/?E. 5as etiquetas asociadas con un TextFuffer pueden cam$iar la justificacin predeterminada.

1e pueden modificar y "er otros atri$utos predeterminados en una TextTie'# tales como el mar&en izquierdo# el mar&en derec o# las ta$ulaciones y la indentacin de p9rrafos# usando los si&uientes m%todos) Q mar&en izquierdo text"ie'.setBleftBmar&in3le-t."argin8 leftBmar&in M text"ie'.&etBleftBmar&in38 Q mar&en derec o text"ie'.setBri& tBmar&in3right."argin8 ri& tBmar&in M text"ie'.&etBri& tBmar&in38 Q indentacin text"ie'.setBindent3indent8 indent M text"ie'.&etBindent38 Qespacio anterior de l<nea 3en p<xeles8 text"ie'.setBpixelsBa$o"eBlines3pixels.abo0e.line8 pixelsBa$o"eBline M text"ie'.&etBpixelsBa$o"eBlines38 Qespacio posterior de l<nea 3en p<xeles8 text"ie'.setBpixelsB$elo'Blines3pixels.belo(.line8 pixelsB$elo'Bline M text"ie'.&etBpixelsB$elo'Blines38 Q p<xeles en ajuste text"ie'.setBpixelsBinsideB'rap3pixels.inside.(rap8 pixelsBinsideB'rap M text"ie'.&etBpixelsBinsideB'rap38 Q ta$ulaciones text"ie'.setBta$s3tabs8 ta$s M text"ie'.&etBta$s38 left_margin# right_margin# indent# pixels_above_lines# pixels_below_lines y pixels_inside_wrap se especifican en p<xeles. 5os "alores predeterminados de estos par9metros se pueden modificar con etiquetas asociadas a un TextFuffer. tabs es un pan&o.Ta$-rray. El pro&rama de ejemplo text0ie(Jbasic.py ilustra el uso $9sico del control TextTie') #igura 1/.1. E)e"plo b5sico de $ista de Texto

El cdi&o fuente del pro&rama es) 1 QPGusrG$inGen" pyt on 2 ; Q example text"ie'U$asic.py C J import py&t(

I py&t(.require3N2.0N8 R import &t( S D class TextTie'Example) 10 def to&&leBedita$le3self# c ec($utton# text"ie'8) 11 text"ie'.setBedita$le3c ec($utton.&etBacti"e388 12 1; def to&&leBcursorB"isi$le3self# c ec($utton# text"ie'8) 1C text"ie'.setBcursorB"isi$le3c ec($utton.&etBacti"e388 1J 1I def to&&leBleftBmar&in3self# c ec($utton# text"ie'8) 1R if c ec($utton.&etBacti"e38) 1S text"ie'.setBleftBmar&in3J08 1D else) 20 text"ie'.setBleftBmar&in308 21 22 def to&&leBri& tBmar&in3self# c ec($utton# text"ie'8) 2; if c ec($utton.&etBacti"e38) 2C text"ie'.setBri& tBmar&in3J08 2J else) 2I text"ie'.setBri& tBmar&in308 2R 2S def ne'B'rapBmode3self# radio$utton# text"ie'# "al8) 2D if radio$utton.&etBacti"e38) ;0 text"ie'.setB'rapBmode3"al8 ;1 ;2 def ne'Bjustification3self# radio$utton# text"ie'# "al8) ;; if radio$utton.&etBacti"e38) ;C text"ie'.setBjustification3"al8 ;J ;I def closeBapplication3self# 'id&et8) ;R &t(.mainBquit38 ;S ;D def BBinitBB3self8) C0 'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 C1 'indo'.setBresiza$le3&t(.T0.E8 C2 'indo'.connect3EdestroyE# self.closeBapplication8 C; 'indo'.setBtitle3ETextTie' >id&et Fasic ExampleE8 CC 'indo'.setB$orderB'idt 308 CJ CI $ox1 M &t(.TFox3&t(.7-51E# 08 CR 'indo'.add3$ox18 CS $ox1.s o'38 CD J0 $ox2 M &t(.TFox3&t(.7-51E# 108 J1 $ox2.setB$orderB'idt 3108 J2 $ox1.pac(Bstart3$ox2# &t(.T0.E# &t(.T0.E# 08 J; $ox2.s o'38

JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101

s' M &t(.1crolled>indo'38 s'.setBpolicy3&t(.P/5:A[B-.T/4-T:A# &t(.P/5:A[B-.T/4-T:A8 text"ie' M &t(.TextTie'38 text$uffer M text"ie'.&etB$uffer38 s'.add3text"ie'8 s'.s o'38 text"ie'.s o'38 $ox2.pac(Bstart3s'8 Q 5oad t e file text"ie'U$asic.py into t e text 'indo' infile M open3Etext"ie'U$asic.pyE# ErE8 if infile) strin& M infile.read38 infile.close38 text$uffer.setBtext3strin&8 $ox M &t(.+FuttonFox38 $ox2.pac(Bstart3 $ox# &t(.7-51E# &t(.7-51E# 08 $ox.s o'38 "$ox M &t(.TFox38 "$ox.s o'38 $ox.pac(Bstart3"$ox# &t(.7-51E# &t(.7-51E# 08 Q c ec( $utton to to&&le edita$le mode c ec( M &t(.A ec(Futton3EEdita$leE8 "$ox.pac(Bstart3c ec(# &t(.7-51E# &t(.7-51E# 08 c ec(.connect3Eto&&ledE# self.to&&leBedita$le# text"ie'8 c ec(.setBacti"e3&t(.T0.E8 c ec(.s o'38 Q c ec( $utton to to&&le cursor "isi$lity c ec( M &t(.A ec(Futton3EAursor Tisi$leE8 "$ox.pac(Bstart3c ec(# &t(.7-51E# &t(.7-51E# 08 c ec(.connect3Eto&&ledE# self.to&&leBcursorB"isi$le# text"ie'8 c ec(.setBacti"e3&t(.T0.E8 c ec(.s o'38 Q c ec( $utton to to&&le left mar&in c ec( M &t(.A ec(Futton3E5eft 4ar&inE8 "$ox.pac(Bstart3c ec(# &t(.7-51E# &t(.7-51E# 08 c ec(.connect3Eto&&ledE# self.to&&leBleftBmar&in# text"ie'8 c ec(.setBacti"e3&t(.7-51E8 c ec(.s o'38 Q c ec( $utton to to&&le ri& t mar&in c ec( M &t(.A ec(Futton3E0i& t 4ar&inE8 "$ox.pac(Bstart3c ec(# &t(.7-51E# &t(.7-51E# 08 c ec(.connect3Eto&&ledE# self.to&&leBri& tBmar&in# text"ie'8 c ec(.setBacti"e3&t(.7-51E8

102 10; 10C 10J 10I 10R 10S 10D 110 111 112 11; 11C 11J 11I 11R 11S 11D 120 121 122 12; 12C 12J 12I 12R 12S 12D 1;0 1;1 1;2 1;; 1;C 1;J 1;I 1;R 1;S 1;D 1C0 1C1 1C2 1C; 1CC 1CJ 1CI 1CR 1CS 1CD

c ec(.s o'38 Q radio $uttons to specify 'rap mode "$ox M &t(.TFox38 "$ox.s o'38 $ox.pac(Bstart3"$ox# &t(.7-51E# &t(.7-51E# 08 radio M &t(.0adioFutton3?one# E>0-PBB?/?EE8 "$ox.pac(Bstart3radio# &t(.7-51E# &t(.T0.E# 08 radio.connect3Eto&&ledE# self.ne'B'rapBmode# text"ie'# &t(.>0-PB?/?E8 radio.setBacti"e3&t(.T0.E8 radio.s o'38 radio M &t(.0adioFutton3radio# E>0-PBBA+-0E8 "$ox.pac(Bstart3radio# &t(.7-51E# &t(.T0.E# 08 radio.connect3Eto&&ledE# self.ne'B'rapBmode# text"ie'# &t(.>0-PBA+-08 radio.s o'38 radio M &t(.0adioFutton3radio# E>0-PBB>/0@E8 "$ox.pac(Bstart3radio# &t(.7-51E# &t(.T0.E# 08 radio.connect3Eto&&ledE# self.ne'B'rapBmode# text"ie'# &t(.>0-PB>/0@8 radio.s o'38 Q radio $uttons to specify justification "$ox M &t(.TFox38 "$ox.s o'38 $ox.pac(Bstart3"$ox# &t(.7-51E# &t(.7-51E# 08 radio M &t(.0adioFutton3?one# E*.1T:7[BB5E7TE8 "$ox.pac(Bstart3radio# &t(.7-51E# &t(.T0.E# 08 radio.connect3Eto&&ledE# self.ne'Bjustification# text"ie'# &t(.*.1T:7[B5E7T8 radio.setBacti"e3&t(.T0.E8 radio.s o'38 radio M &t(.0adioFutton3radio# E*.1T:7[BB0:G+TE8 "$ox.pac(Bstart3radio# &t(.7-51E# &t(.T0.E# 08 radio.connect3Eto&&ledE# self.ne'Bjustification# text"ie'# &t(.*.1T:7[B0:G+T8 radio.s o'38 radio M &t(.0adioFutton3radio# E*.1T:7[BBAE?TE0E8 "$ox.pac(Bstart3radio# &t(.7-51E# &t(.T0.E# 08 radio.connect3Eto&&ledE# self.ne'Bjustification# text"ie'# &t(.*.1T:7[BAE?TE08 radio.s o'38 separator M &t(.+1eparator38 $ox1.pac(Bstart3separator# &t(.7-51E# &t(.T0.E# 08 separator.s o'38 $ox2 M &t(.TFox3&t(.7-51E# 108 $ox2.setB$orderB'idt 3108 $ox1.pac(Bstart3$ox2# &t(.7-51E# &t(.T0.E# 08 $ox2.s o'38

1J0 1J1 $utton M &t(.Futton3EcloseE8 1J2 $utton.connect3Eclic(edE# self.closeBapplication8 1J; $ox2.pac(Bstart3$utton# &t(.T0.E# &t(.T0.E# 08 1JC $utton.setBfla&s3&t(.A-?B@E7-.5T8 1JJ $utton.&ra$Bdefault38 1JI $utton.s o'38 1JR 'indo'.s o'38 1JS 1JD def main38) 1I0 &t(.main38 1I1 return 0 1I2 1I; if BBnameBB MM EBBmainBBE) 1IC TextTie'Example38 1IJ main38 5as l<neas 10U;C definen las retrollamadas para los $otones de exclusin m2tua y los $otones de acti"acin que se usan para cam$iar los atri$utos predeterminados de la TextTie'. 5as l<neas JJUI; crean una 1crolled>indo' que conten&a la TextTie'. 5a 1crolled>indo' se empaqueta en una TFox con los $otones que se crean en las l<neas R2U 1C0. El TextFuffer asociado con la TextTie' se rellena con el contenido del arc i"o fuente en las l<neas ICUR0. 1/./. =u--ers de Texto El TextFuffer 3Fuffer de Texto8 es el componente principal del sistema de edicin de texto de PyGTK. Aontiene el texto# las TextTa& 3Etiquetas de Texto8 en una TextTa&Ta$le 3Ta$la de Etiquetas de Texto8 y las Text4ar( 34arcas de Texto8 que juntos descri$en cmo de$e "isualizarse el texto y permiten la modificacin del texto de forma interacti"a. Aomo ya se dijo en la seccin anterior# un TextFuffer est9 asociado con una o m9s TextTie' 3Tistas de Texto8# que muestran el contenido del TextFuffer. .n TextFuffer se puede crear autom9ticamente cuando se crea una TextTie' o se puede crear con la funcin) text$uffer M TextFuffer3tablaM?one8 donde tabla es una TextTa&Ta$le. 1i no se especifica tabla 3o si es ?one8 se crear9 una TextTa&Ta$le para el Fuffer de Texto. Existen numerosos m%todos que se pueden usar para) insertar y $orrar texto en un $uffer crear# $orrar y manipular marcas manipular el cursor y la seleccin crear# aplicar y $orrar etiquetas especificar y manipular Text:ter 3:teradores de Texto8 o$tener informacin de estado

1/./.1. In-or"acin de estado de un =u--er de Texto 1e puede conocer el n2mero de l<neas en un textbuffer usando el m%todo) lineBcount M text$uffer.&etBlineBcount38 @e manera an9lo&a es posi$le sa$er el n2mero de caracteres en el textbuffer usando) c arBcount M text$uffer.&etBc arBcount38 Auando el contenido del textbuffer cam$ia la $andera de modificacin del $uffer de texto se acti"a. El estado de la $andera de modificacin se puede consultar usando el m%todo) modified M text$uffer.&etBmodified38 1i el pro&rama &uarda el contenido del $uffer de texto el si&uiente m%todo se puede usar para reiniciar la $andera de modificacin) text$uffer.setBmodified3setting8 1/./.!. Creacin de Iteradores de Texto .n Text:ter se usa para especificar una localizacin dentro de un TextFuffer entre dos caracteres. 5os m%todos de TextFuffer que manipulan texto usan :teradores de Texto Text:ter para especificar dnde se aplicar9 el m%todo. 5os :teradores de Texto Text:ter tienen un &ran n2mero de m%todos que se descri$en en la seccin Text:ter. 5os m%todos $9sicos del TextFuffer que se usan para crear Text:ters son) iter M text$uffer.&etBiterBatBoffset3char.o--set8 iter M text$ufferB&etBiterBatBline3line.nu"ber8 iter M text$uffer.&etBiterBatBlineBoffset3line.nu"ber# line.o--set8 iter M text$uffer.&etBiterBatBmar(3"ark8 &etBiterBatBoffset38 crea un iterador que se situa despu%s de tantos caracteres como di&a el ar&umento char_offset a partir del comienzo del $uffer de texto. &etBiterBatBline38 crea un iterador que est9 justo antes del primer caracter en la l<nea que di&a el par9metro line_number. &etBiterBatBlineBoffset38 crea un iterador que est9 justo detr9s del car9cter especificado por el par9metro line_offset en la l<nea especificada por el par9metro line_number. &etBiterBatBmar(38 crea un iterador que est9 en la misma posicin que la marca especificada por el par9metro mark. 5os si&uientes m%todos crean uno o m9s iteradores en localizaciones espec<ficas del $uffer de texto) startiter M text$uffer.&etBstartBiter38

enditer M text$ufferB&etBendBiter38 startiter# enditer M text$uffer.&etB$ounds38 start# end M text$uffer.&etBselectionB$ounds38 &etBstartBiter38 crea un iterador que est9 justo antes del primer caracter en el $uffer de texto. &etBendBiter38 crea un iterador que est9 justo despu%s del 2ltimo caracter en el $uffer de texto. &etB$ounds38 crea una tupla de dos iteradores que est9n justo antes del primer caracter y justo detr9s del 2ltimo caracter del $uffer de texto respecti"amente. &etBselectionB$ounds38 crea una tupla de dos iteradores que est9n en las mismas posiciones que las marcas insert y selection_bound en el $uffer de texto. 1/././. InsercinD Ebtencin y Eli"inacin de Texto El texto de un TextFuffer se puede fijar con el m%todo) text$uffer.setBtext3text8 Este m%todo reemplaza el contenido actual del $uffer de texto con el texto text que se le pasa como par9metro. El m%todo m9s &eneral para insertar caracteres en un $uffer de texto es) text$uffer.insert3iter# text8 el cual inserta el texto text en la posicin del $uffer de texto especificada por el iterador iter. 1i quieres simular la insercin de texto que producir<a un usuario interacti"o usa este m%todo) result M text$uffer.insertBinteracti"e3iter# text# de-ault.editable8 el cual inserta el texto text en la posicin del $uffer de texto especificada por el iterador iter pero slo si la posicin es edita$le 3es decir# no tiene una etiqueta que especifique que el texto no es edita$le8 y el ar&umento default_editable es T0.E. El resultado indica si el texto fue insertado o no. El ar&umento default_editable indica si es edita$le o no cuando el texto no tiene una etiqueta que lo especifique\ default_editable normalmente se determina llamando al m%todo &etBedita$le38 de TextTie'. /tros m%todos que insertan texto son) text$uffer.insertBatBcursor3text8

result M text$uffer.insertBatBcursorBinteracti"e3text# de-ault.editable8 text$uffer.insertBran&e3iter# start# end8 result M text$uffer.insertBran&eBinteracti"e3iter# start# end# de-ault.editable8 insertBatBcursor38 es una funcin auxiliar que inserta el texto en la posicin actual del cursor 3se=alada por insert8. insertBran&e38 copia el texto# pix$uffers y etiquetas entre start y end de un TextFuffer 3si las etiquetas pertenecen a otro $uffer de texto la ta$la de etiquetas de$e ser la misma8 y los inserta en el $uffer de texto en la posicin especificada por iter. 5as "ersiones interacti"as de estos m%todos funcionan de la misma forma excepto que slo insertar9n el texto si las posiciones son edita$les. 7inalmente# el texto se puede insertar y asociar a etiquetas al mismo tiempo usando los m%todos) text$uffer.insertB'it Bta&s3iter# text# ta&1# ta&2# ...8 text$uffer.insertB'it Bta&sB$yBname3iter# text# ta&name1# ta&name2# ...8 insertB'it Bta&s38 inserta el texto text en el $uffer de texto en la posicin especificada por iter y le aplica las etiquetas especificadas. insertB'it Bta&sB$yBname38 ace lo mismo pero te permite especificar las etiquetas por su nom$re. El texto de un $uffer de texto se puede $orrar usando los m%todos) text$uffer.delete3start# end8 result M text$uffer.deleteBinteracti"e3start# end# de-ault.editable8 delete38 $orra el texto entre los iteradores Text:ter start y end en el $uffer de texto. deleteBinteracti"e38 $orra todo el texto edita$le 3determinado por las etiquetas de texto aplica$les y el ar&umento default_editable8 entre start y end. Puedes o$tener una copia del texto de un $uffer de texto usando los m%todos) text M text$uffer.&etBtext3start# end# include.hidden.charsMT0.E8 text M text$uffer.&etBslice3start# end# include.hidden.charsMT0.E8 &etBtext38 de"uel"e una copia del texto en el $uffer de texto entre start y end\ si el ar&umento include_hidden_chars es 7-51E el texto que no se "isualice no se de"uel"e. 5os caracteres que representan im9&enes incrustadas o controles# son excluidos. &etBslice38 es i&ual que &etBtext38 excepto que el texto que de"uel"e incluye un car9cter 0x777A por cada im9&ene incrustada o control.

1/./.2. 'arcas de Texto 8Text'ark9 5as Text4ar(s 34arcas de Texto8 son similares a los Text:ter ya que tam$i%n especifican posiciones en un TextFuffer entre dos caracteres. 1in em$ar&o# las 4arcas de Texto Text4ar( mantienen su posicin aunque el $uffer cam$ie. 5os m%todos de las 4arcas de Texto Text4ar( se descri$ir9n en la seccin Text4ar(. .n $uffer de texto contiene de serie dos marcas predeterminadas) la marca insert 3insertar8 y la marca selection_bound 3l<mite de la seleccin8. 5a marca insert es la posicin predeterminada de insercin del texto y la marca selection_bound com$inada con la marca insert define un ran&o de seleccin. 5as marcas predeterminadas de serie se pueden o$tener con los m%todos) insertmar( M text$uffer.&etBinsert38 selectionB$oundmar( M text$uffer.&etBselectionB$ound38 5as marcas insert y selection_bound se pueden colocar simult9neamente en una posicin usando el m%todo) text$uffer.placeBcursor3(here8 donde where es un iterador de texto que especifica la posicin. El m%todo placeBcursor38 es necesario para e"itar crear una seleccin temporal si las marcas se mo"ieran indi"idualmente. 5as Text4ar(s se crean usando el m%todo) mar( M text$uffer.createBmar(3"ark.na"e# (here# le-t.gra0ityM7-51E8 donde mark_name es el nom$re que se le asi&na a la marca 3puede ser ?one para crear una marca annima8# where es el iterador de texto que especifica la posicin de la marca en el $uffer de texto y left_gravity indica dnde se pondr9 la marca cuando se inserte texto en la marca 3a la izquierda si es T0.E o a la derec a si es 7-51E8. 1e puede mo"er una marca en el $uffer de texto usando los m%todos) text$uffer.mo"eBmar(3"ark# (here8 text$uffer.mo"eBmar(B$yBname3na"e# (here8 mark especifica la marca que se "a a mo"er. name especifica el nom$re de la marca que se "a a mo"er. where es un iterador de texto qeu especifica la nue"a posicin. .na marca se puede $orrar de un $uffer de texto usando los m%todos) text$uffer.deleteBmar(3"ark8 text$uffer.deleteBmar(B$yBname3na"e8 1e puede recuperar una marca a partir de su nom$re con el m%todo) mar( M text$uffer.&etBmar(3na"e8

1/./.;. Creacin y :so de Eti6uetas de Texto 5as TextTa&s 3Etiquetas de Texto8 contienen uno o m9s atri$utos 3por ejemplo# colores de frente y de fondo# fuentes de texto# edita$ilidad8 que se pueden aplicar a uno o m9s ran&os de texto en un $uffer de texto. 5os atri$utos que se pueden especificar mediante propiedades de una TextTa& se descri$ir9n en la seccin TextTa&. .na TextTa& se puede crear con atri$utos e instalada en la TextTa&Ta$le 3Ta$la de Etiquetas de Texto8 de un TextFuffer 3Fuffer de Texto8 usando el si&uiente m%todo) ta& M text$uffer.createBta&3nameM?one# attr1M"al1# attr2M"al2# ...8 donde name es una cadena de texto que especifica el nom$re de la etiqueta o ?one si la etiqueta es una etiqueta annima y los pares de cla"eU"alor especifican los atri$utos que tendr9 la etiqueta. 4ira la seccin TextTa& para o$tener m9s informacin acerca de qu% atri$utos se pueden esta$lecer mediante las propiedades de una TextTa&. .na etiqueta se puede aplicar a un ran&o de texto en un $uffer de texto usando los m%todos) text$uffer.applyBta&3tag# start# end8 text$uffer.applyBta&B$yBname3na"e# start# end8 tag es la etiqueta que se "a a aplicar al texto. name es el nom$re de la etiqueta a aplicar. start 3comienzo8 y end 3final8 son los iteradores de texto que especifican el ran&o de texto que ser9 afectado por la etiqueta. 1e puede $orrar una etiqueta de un ran&o de texto usando los m%todos) text$uffer.remo"eBta&3tag# start# end8 text$uffer.remo"eBta&B$yBname3na"e# start# end8 1e pueden $orrar todas las etiquetas de un ran&o de texto usando el m%todo) text$uffer.remo"eBallBta&s3start# end8 1/./.>. Insercin de I"5genes y Controles -dem9s de texto# un TextFuffer puede contener im9&enes y un punto de anclaje para controles. 1e puede a=adir un control a una TextTie' en un punto de anclaje. 1e puede a=adir un control diferente en cada TextTie' que ten&a un $uffer con un punto de anclaje. 1e puede insertar un pix$uf con el si&uiente m%todo) text$uffer.insertBpix$uf3iter# pixbu-8 donde iter especifica la posicin en el textbuffer donde insertar el pixbuf. 5a ima&en

contar9 como un caracter y ser9 representada en lo que de"uel"e &etBslice38 3pero no en lo que de"uel"e &etBtext38 8 como el caracter .nicode E0x777AE. 1e puede insertar un control GTK! en una TextTie' en una posicin del $uffer especificada por un TextA ild-nc or 3-nclaje de +ijo del Texto8. El TextA ild-nc or contar9 como un car9cter representado por E0x777AE de manera similar a un pix$uf. El TextA ild-nc or se puede crear e insertar en el $uffer usando este m%todo) anc or M textB$uffer.createBc ildBanc or3iter8 donde iter es la posicin del anclaje. Tam$i%n se puede crear e insertar un TextA ild-nc or con dos operaciones por separado) anc or M &t(.TextA ild-nc or38 textB$uffer.insertBc ildBanc or3iter# anchor8 @espu%s se puede a=adir el control al TextTie' en la posicin del anclaje usando el m%todo) textB"ie'.addBc ildBatBanc or3child# anchor8 1e puede o$tener la lista de controles en una posicin especifica del $uffer usando el m%todo) 'id&etBlist M anc or.&etB'id&ets38 Tam$i%n se puede a=adir un control al TextTie' usando el m%todo) textB"ie'.addBc ildBinB'indo'3child# (hich.(indo(# xpos# ypos8 donde el control child se coloca en la "entana which_window en la posicin especificada por xpos e ypos. El par9metro which_window indica en cu9l de las "entanas que componen el control TextTie' se colocar9 el control) &t(.TE6TB>:?@/>BT/P Q "entana superior del texto &t(.TE6TB>:?@/>BF/TT/4 Q "entana inferior del texto &t(.TE6TB>:?@/>B5E7T Q "entana izquierda del texto &t(.TE6TB>:?@/>B0:G+T Q "entana derec a del texto &t(.TE6TB>:?@/>BTE6T Q "entana de texto del texto &t(.TE6TB>:?@/>B>:@GET Q "entana de control del texto 1/.2. Iteradores de Texto 5os :teradores de Texto Text:ter representan una posicin entre dos caracteres en un TextFuffer. 5os Text:ters se crean normalmente usando un m%todo de la clase TextFuffer. 5os Text:ters se in"alidan cuando el n2mero de caracteres de un TextFuffer cam$ia 3excepto para el Text:ter que se usa para insercin o $orrado8. :nsertar o $orrar pix$uffers o anclajes tam$i%n in"alida un Text:ter.

+ay un &ran n2mero de m%todos asociados con un o$jeto Text:ter. 1e a&rupan en las si&uientes secciones se&2n realicen funciones similares. 1/.2.1. 3tributos de los Iteradores de Texto El TextFuffer que contiene el Text:ter se puede recuperar usando el m%todo) $uffer M iter.&etB$uffer38 5os si&uientes m%todos se pueden usar para o$tener la posicin del Text:ter en el TextFuffer) offset M iter.&etBoffset38 lineBnum$er M iter.&etBline38 Q de"uel"e el desplazamiento en el $uffer del iterador Q de"uel"e el n2mero de l<nea del iterador

lineBoffset M iter.&etBlineBoffset38 Q de"uel"e el desplazamiento en la l<nea numc ars M iter.&etBc arsBinBline38 Q de"uel"e el n2mero de caracteres en la l<nea 1/.2.!. 3tributos de Texto de un Iterador de Texto El o$jeto Pan&o5an&ua&e que se usa en una determinada posicin del iterador en el TextFuffer se o$tiene llamando al m%todo) lan&ua&e M iter.&etBlan&ua&e38 +ay otro m%todo m9s &eneral para o$tener los atri$utos de texto en una posicin de un Text:ter ) result M iter.&etBattri$utes30alues8 donde result indica si el par9metro values 3un o$jeto de la clase Text-ttri$utes 8 fue modificado. El par9metro values se o$tiene usando el si&uiente m%todo de la clase TextTie' ) "alues M text"ie'.&etBdefaultBattri$utes38 5os si&uientes atri$utos se pueden o$tener a partir de un o$jeto de la clase Text-ttri$utes 3no est9 implementado en PyGTK gM1.DD.1J8) $&Bcolor f&Bcolor $&Bstipple f&Bstipple rise underline stri(et rou& color de fondo color de frente $itmap de patrn de fondo $itmap de patrn de frente desplazamiento del texto so$re la l<nea $ase estilo de su$rayado indica si el texto aparece tac ado

dra'B$& justification direction font fontBscale leftBmar&in ri& tBmar&in pixelsBa$o"eBlines pixelsB$elo'Blines pixelsBinsideB'rap ta$s 'rapBmode lan&ua&e in"isi$le $&BfullB ei& t edita$le realized pad1 pad2 pad; padC

T0.E si al&unas marcas afectan al di$ujado del fondo estilo de la justificacin la direccin del texto Pan&o7ont@escription en uso escala de la fuente en uso posicin del m9r&en izquierdo posicin del m9r&en derec o espacio en p<xeles so$re una l<nea espacio en p<xeles de$ajo de una l<nea espacio en p<xeles entre l<neas solapadas Pan&oTa$-rray en uso modo de ajuste en uso Pan&o5an&ua&e en uso si el texto es in"isi$le 3sin implementar en GTK! 2.08 si el fondo est9 ocupando el alto completo de l<nea si el texto es edita$le si el texto est9 realizado

1/.2./. Copiar un Iterador de Texto 1e puede duplicar un Text:ter usando el m%todo) iterBcopy M iter.copy38 1/.2.2. ,ecuperar Texto y Eb)etos 1e pueden o$tener "arias cantidades de texto y o$jetos de un TextFuffer usando los si&uientes m%todos TextFuffer ) c ar M iter.&etBc ar38 text M start.&etBslice3end8 text M start.&etBtext3end8 pix$uf M iter.&etBpix$uf38 anc or M iter.&etBc ildBanc or38 Q de"uel"e un caracter o 0 si se a lle&ado al final del $uffer Q de"uel"e el texto entre los iteradores de principio y fin Q de"uel"e el texto entre los iteradores de principio y fin Q de"uel"e el pix$uf en esa posicin 3o ?one8 Q de"uel"e el anclaje 3o ?one8

mar(Blist M iter.&etBmar(s38 ta&Blist M iter.&etBto&&ledBta&s38 ta&Blist M iter.&etBta&s38

Q de"uel"e una lista de marcas

Q de"uel"e una lista de etiquetas que est9n acti"adas o desacti"a

Q de"uel"e una lista de etiquetas por prioridades

1/.2.;. Co"probar Condiciones en un Iterador de Texto 5as condiciones de marcado de en la posicin de un iterador Text:ter se pueden compro$ar usando los si&uientes m%todos) result M iter.$e&insBta&3tagM?one8 result M iter.endsBta&3tagM?one8 Q T0.E si la etiqueta est9 acti"ada en el iterador Q T0.E si la etiqueta est9 desacti"ada en el iterador

result M iter.to&&lesBta&3tagM?one8 Q T0.E si la etiqueta est9 acti"a o desacti"ada en el iterador result M iter. asBta&3tag8 Q T0.E si existe la etiqueta en el iterador

Estos m%todos de"uel"en T0.E si la marca que representa el par9metro tag satisface la condicin en las posicin del iterador iter. En los tres primeros m%todos# si la marca representada por el par9metro tag es ?one entonces el resultado es T0.E si cualquier etiqueta satisface la condicin dada en la posicin del iterador iter. 5os si&uientes m%todos indican si el texto en la posicin del iterador Text:ter es edita$le o permite insercin de texto) result M iter.edita$le38 result M iter.canBinsert3de-ault.editability8 El m%todo edita$le38 indica si el iter est9 en un ran&o edita$le de texto mientras que el m%todo canBinsert38 indica si el texto se puede insertar en el iterador iter considerando la edita$ilidad predeterminada de la TextTie'# el TextFuffer y las etiquetas aplica$les. 5a edita$ilidad predeterminada default_editability se o$tiene con el m%todo) defaultBedita$ility M text"ie'.&etBedita$le38 5a equi"alencia de dos iteradores Text:ter se puede determinar con el m%todo) areBequal M l s.equal3rhs8 @os iteradores Text:ter se pueden comparar con el m%todo) result M l s.compare3rhs8 result ser9) U1 si lhs es menor que rhs\ 0 si lhs es i&ual que rhs\ y# 1 si lhs es mayor que rhs. Para determinar si un iterador Text:ter est9 situado entre otros dos iteradores Text:ter se usa el m%todo)

result M iter.inBran&e3start# end8 El result ser9 T0.E si iter est9 entre start y end. -tencin) start y end de$en estar en orden ascendente. Esto se puede &arantizar con el m%todo) first.order3second8 que reordenar9 los desplazamientos de los iteradores Text:ter para que first est% antes que second. 1/.2.>. Co"probar la posicin en un Texto 5a posicin de un Text:ter con respecto al texto en un TextFuffer se puede determinar con los si&uientes m%todos) result M iter.startsB'ord38 result M iter.endsB'ord38 result M iter.insideB'ord38 Q empieza pala$ra Q termina pala$ra Q dentro de pala$ra

result M iter.startsBsentence38 Q empieza frase result M iter.endsBsentence38 Q termina frase result M iter.insideBsentence38 Q dentro de frase result M startsBline38 result M iter.endsBline38 Q empieza l<nea Q termina l<nea

result ser9 T0.E si el Text:ter est9 en la posicin dada. Estos m%todos son autoexplicati"os. 5a definicin de los elementos de texto y sus l<mites se determina por el len&uaje usado en el iterador Text:ter. /$s%r"ese que una l<nea es una coleccin de frases similar a un p9rrafo. 5os si&uientes m%todos se pueden usar para determinar si un Text:ter est9 al principio o al final de un TextFuffer) result M iter.isBstart38 result M iter.isBend38 result es T0.E si el iterador Text:ter est9 al principio o al final del TextFuffer. [a que un TextFuffer puede contener m2ltiples caracteres que se "isualizan en la pr9ctica como una 2nica posicin del cursor 3por ejemplo la com$inacin de retorno de carro y nue"a l<nea o una letra con un s<m$olo de acento8 es posi$le que un Text:ter pueda estar en una posicin que no corresponde con una posicin de cursor. El si&uiente m%todo indica si un iterador Text:ter est9 en una posicin del cursor)

result M iter.isBcursorBposition38 1/.2.@. 'o0i"iento a tra0Cs del Texto 5os Text:ters se pueden mo"er por un TextFuffer en saltos de "arias unidades de texto. 5a definicin de las unidades de texto se esta$lece en el o$jeto Pan&o5an&ua&e que se use en la posicin del Text:ter . 5os m%todos $9sicos son) result M iter.for'ardBc ar38 result M iter.$ac('ardBc ar38 result M iter.for'ardB'ordBend38 result M iter.$ac('ardB'ordBstart38 result M iter.for'ardBsentenceBend38 result M iter.$ac('ardBsentenceBstart38 result M iter.for'ardBline38 result M iter.$ac('ardBline38 result M iter.for'ardBtoBlineBend38 result M iter.for'ardBcursorBposition38 result M iter.$ac('ardBcursorBposition38 Q a"anzar un caracter Q retroceder un caracter Q a"anzar asta el final de la pala$ra Q retroceder al principio de la pala$ra Q a"anzar al final de la frase Q retroceder al principio de la frase

Q a"anzar al principio de la l<nea Q retroceder al principio de la l<nea Q a"anzar al final de la l<nea Q a"anzar una posicin del cursor Q retroceder una posicin del cursor

result es T0.E si el Text:ter se mo"i y 7-51E si el Text:ter est9 al principio o al final del TextFuffer. Todos estos m%todos 3excepto for'ardBtoBlineBend388 tienen m%todos equi"alentes que reci$en una cantidad 3que puede ser positi"a o ne&ati"a8 para mo"er el Text:ter en un salto de m2ltiples unidades de texto) result M iter.for'ardBc ars3count8 result M iter.$ac('ardBc ars3count8 result M iter.for'ardB'ordBends3count8 result M iter.$ac('ardB'ordBstarts3count8 result M iter.for'ardBsentenceBends3count8 result M iter.$ac('ardBsentenceBstarts3count8

result M iter.for'ardBlines3count8 result M iter.$ac('ardBlines3count8 result M iter.for'ardBcursorBpositions3count8 result M iter.$ac('ardBcursorBpositions3count8 1/.2.A. 'o0erse a una Posicin Beter"inada .n iterador Text:ter se puede mo"er a una posicin espec<fica en el TextFuffer aciendo uso de los si&uientes m%todos) iter.setBoffset3char.o--set8 iter.setBline3line.nu"ber8 iter.setBlineBoffset3char.on.line8 iter.for'ardBtoBend38 Q mo"erse al desplazamiento de caracteres espec<fico Q mo"erse al principio de la l<nea dada como par9metro Q mo"erse al caracter especificado en la l<nea actual Q mo"erse al final del $uffer

-dem9s# un iterador Text:ter se puede mo"er a una posicin donde una etiqueta est% acti"ada o desacti"ada usando los m%todos) result M iter.for'ardBtoBta&Bto&&le3tag8 result M iter.$ac('ardBtoBta&Btao&&le3tag8 result es T0.E si el Text:ter se mo"i a la nue"a posicin donde exista la etiqueta tag. 1i la etiqueta tag es ?one entonces el iterador Text:ter se mo"er9 a la si&uiente posicin donde exista una etiqueta. 1/.2.F. =?s6ueda en el Texto .na $2squeda de una cadena de texto en un TextFuffer se m%todos) ace con los si&uientes

matc Bstart# matc Bend M iter.for'ardBsearc 3str# -lags# li"itM?one8 Q $2squeda acia adelante matc Bstart# matc Bend M iter.$ac('ardBsearc 3str# -lags# li"itM?one8 Q $2squeda acia atr9s El "alor de retorno es una tupla que contiene los iteradores Text:ter que indican la posicin del primer caracter que coincide con la $2squeda y la posicin del primer caracter despu%s de la coincidencia. str es la cadena a $uscar. El par9metro flags modifica las condiciones de la $2squeda y puede tomar los si&uientes "alores) &t(.TE6TB1E-0A+BT:1:F5EB/?5[ Q se i&noran los caracteres in"isi$les

&t(.TE6TB1E-0A+BTE6TB/?5[

Q se i&noran los pix$uffers y los anclajes de ijos

limit es un par9metro opcional que limita el ran&o de la $2squeda. 1/.;. 'arcas de Texto .na Text4ar( 34arca de Texto8 indica una posicin en un TextFuffer entre dos caracteres que se mantiene aunque se modifique el $uffer. 5as Text4ar(s se crean# se mue"en y se $orran usando los m%todos del TextFuffer que se descri$en en la seccin TextFuffer . .n TextFuffer tiene dos marcas incluidas de serie llamadas) insert y selection_bound que se refieren al punto de insercin y el l<mite de la seleccin 3puede que se refieran a la misma posicin8. El nom$re de una Text4ar( se puede o$tener usando el m%todo) name M textmar(.&etBname38 Por defecto las marcas que no son insert no son "isi$les 3esa marca se muestra como una $arra "ertical8. 5a "isi$ilidad de una marca se puede acti"ar y o$tener usando los m%todos) settin& M textmar(.&etB"isi$le38 textmar(.setB"isi$le3setting8 donde setting es T0.E si la marca es "isi$le. El TextFuffer que contiene una Text4ar( se puede recuperar usando el m%todo) $uffer M textmar(.&etB$uffer38 Puedes determinar si una Text4ar( a sido $orrada usando el m%todo) settin& M textmar(.&etBdeleted38 5a &ra"edad izquierda de una Text4ar( se puede recuperar usando el m%todo) settin& M textmar(.&etBleftB&ra"ity38 5a &ra"edad izquierda de una Text4ar( indica donde aca$ar9 la marca despu%s de una insercin. 1i la &ra"edad izquierda es T0.E la marca se pondr9 a la izquierda de la insercin\ si es 7-51E# a la derec a de la insercin. 1/.>. Eti6uetas de Texto y Tablas de Eti6uetas 5as etiquetas de texto TextTa&s especifican atri$utos que se pueden aplicar a un ran&o de texto en un $uffer de texto. Aada $uffer de texto TextFuffer tiene una ta$la de etiquetas de texto TextTa&Ta$le que contiene las etiquetas de texto TextTa&s que se pueden aplicar dentro del $uffer TextFuffer. 5as ta$las de etiquetas de texto TextTa&Ta$le se pueden usar en m9s de un $uffer de texto para ofrecer estilos de texto consistentes.

1/.>.1. Eti6uetas de Texto 5as TextTa&s 3Etiquetas de Texto8 pueden tener nom$re o ser annimas. .na TextTa& se crea usando la funcin) ta& M &t(.TextTa&3na"eM?one8 1i el name 3nom$re8 no se especifica o si es ?one la tag 3etiqueta8 ser9 annima. 5as TextTa&s tam$i%n se pueden crear usando el m%todo de TextFuffer createBta&38 que tam$i%n te permite especificar los atri$utos y a=ade la etiqueta a la ta$la de etiquetas del $uffer 3"e9se la su$seccin TextFuffer8. 5os atri$utos que pueden aparecer en una TextTa& son) name $ac(&round fore&round $ac(&roundU&d( fore&roundU&d( $ac(&roundUstipple fore&roundUstipple font fontUdesc family style "ariant 'ei& t stretc size sizeUpoints 5ectura Escritura Escritura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura 5ectura Escritura G ?om$re de la etiqueta de texto. ?one si es annima. Aolor de fondo como una cadena de texto Aolor de frente como una cadena de texto G G Aolor de fondo como un Gd(Aolor Aolor de frente como un Gd(Aolor

G Fitmap a usar como una m9scara cuando se di$uje el texto de fondo G Fitmap a usar como una m9scara cuando se di$uje el texto de frente G @escripcin de la fuente como una cadena de texto# por ejemplo# E1ans :talic 12E G @escripcin de la feunte como un o$jeto Pan&o7ont@escription G ?om$re de la familia de la fuente# por ejemplo# 1ans# +el"etica# Times# 4onospace G Estilo de la fuente como un Pan&o1tyle# por ejemplo# pan&o.1T[5EB:T-5:A. G Tariante de la fuente como un Pan&oTariant# por ejemplo# pan&o.T-0:-?TB14-55BA-P1. Peso de la fuente como un entero# mira los "alores 5ectura G predefinidos en Pan&o>ei& t\ por ejemplo# Escritura pan&o.>E:G+TBF/5@. 5ectura G Estrec amiento de la fuente como un Pan&o1tretc # por Escritura ejemplo# pan&o.1T0ETA+BA/?@E?1E@. 5ectura G Tama=o de fuente en unidades Pan&o. Escritura 5ectura G Tama=o de fuente en puntos Escritura

Tama=o de fuente como un factor de escala relati"o al tama=o de fuente predeterminado. Esta propiedad se 5ectura G scale adapta a los cam$ios en el tema# etc# por tanto se Escritura recomienda su uso. Pan&o tiene al&unos "alores predefinidos tales como pan&o.1A-5EB6B5-0GE. 5ectura G pixelsUa$o"eUlines P<xeles de espacio $lanco por encima de los p9rrafos Escritura 5ectura G pixelsU$elo'Ulines P<xeles de espacio $lanco por de$ajo de los p9rrafos Escritura 5ectura G pixelsUinsideU'rap P<xeles de espacio $lanco entre las l<neas de un p9rrafo Escritura 5ectura G edita$le 1i el texto puede modificarse por el usuario Escritura 5ectura G 1i las l<neas no se ajustan# se ajustan en limites de 'rapUmode Escritura pala$ra o se ajustan en limites de caracteres 5ectura G justification *ustificacin izquierda# derec a o central Escritura 5ectura G @ireccin del Texto# por ejemplo# derec a a izquierda o direction Escritura izquierda a derec a 5ectura G leftUmar&in -nc o del m9r&en izquierdo en p<xeles Escritura 5ectura G indent Aantidad de indentado para los p9rrafos# en p<xeles Escritura 5ectura G stri(et rou& 1i ay que tac ar el texto Escritura 5ectura G ri& tUmar&in -nc o del m9r&en derec o en p<xeles Escritura 5ectura G underline Estilo de su$rayado para este texto Escritura 5ectura G @esplazamiento del texto por encima de la l<nea $ase rise Escritura 3por de$ajo de la l<nea $ase si es ne&ati"o8 en p<xeles $ac(&roundUfullU 5ectura G 1i el color de fondo rellena la altura completa de la l<nea o ei& t Escritura slo la altura de los caracteres marcados El idioma en el que est9 el texto# como un cdi&o :1/. 5ectura G Pan&o puede usar esto como una ayuda para "isualizar el lan&ua&e Escritura texto. 1i no entiendes este par9metro# pro$a$lemente no lo necesitas. 5ectura G ta$s Ta$ulaciones personalizadas para el texto Escritura 5ectura G in"isi$le 1i el texto est9 oculto. ?o implementado en GTK 2.0 Escritura 1e pueden esta$lecer los atri$utos con este m%todo)

ta&.setBproperty3name# "alue8 @onde name es una cadena de texto que contiene el nom$re de la propiedad y value es el "alor que se le "a a poner. @e la misma forma# el "alor de un atri$uto se puede recuperar con el m%todo) "alue M ta&.&etBproperty3name8 [a que la etiqueta no tiene un "alor para cada atri$uto $ooleanas que indican si el atri$uto a sido esta$lecido) ay una serie de propiedades

$ac(&roundUset 5ectura G Escritura fore&roundUset 5ectura G Escritura $ac(&roundUstippleUset 5ectura G Escritura fore&roundUstippleUset 5ectura G Escritura familyUset 5ectura G Escritura styleUset 5ectura G Escritura "ariantUset 5ectura G Escritura 'ei& tUset 5ectura G Escritura stretc Uset 5ectura G Escritura sizeUset 5ectura G Escritura scaleUset 5ectura G Escritura pixelsUa$o"eUlinesUset 5ectura G Escritura pixelsU$elo'UlinesUset 5ectura G Escritura pixelsUinsideU'rapUset 5ectura G Escritura edita$leUset 5ectura G Escritura 'rapUmodeUset 5ectura G Escritura justificationUset 5ectura G Escritura directionUset 5ectura G Escritura leftUmar&inUset 5ectura G Escritura indentUset 5ectura G Escritura stri(et rou& Uset 5ectura G Escritura ri& tUmar&inUset 5ectura G Escritura underlineUset 5ectura G Escritura riseUset 5ectura G Escritura $ac(&roundUfullU ei& tUset 5ectura G Escritura lan&ua&eUset 5ectura G Escritura ta$sUset 5ectura G Escritura in"isi$leUset 5ectura G Escritura Por tanto# para o$tener el atri$uto de una etiqueta# primero tienes que compro$ar si el

atri$uto a sido esta$lecido en la etiqueta. Por ejemplo# para o$tener un "alor correcto de justificacin tienes que acer al&o as< como) if ta&.&etBproperty3EjustificationUsetE8) justification M ta&.&etBproperty3EjustificationE8 5a prioridad predeterminada de una etiqueta es el orden en el que se a=ade a la TextTa&Ta$le. 5as etiquetas con prioridad m9s alta tienen preferencia si ay m2ltiples etiquetas para esta$lecer el mismo atri$uto para un ran&o de texto. 5a prioridad se puede o$tener y fijar con los m%todos) priority M ta&.&etBpriority38 ta&.setBpriority3priority8 5a prioridad de una etiqueta de$e estar entre 0 y uno menos del tama=o de la TextTa&Ta$le. 1/.>.!. Tablas de Eti6uetas de Texto .na TextTa&Ta$le 3Ta$la de Etiquetas de Texto8 se crea al crear un TextFuffer . Tam$i%n se puede crear una TextTa&Ta$le con la funcin) ta$le M TextTa&Ta$le38 1e puede a=adir una TextTa& 3Etiqueta de Texto8 a una TextTa&Ta$le usando el m%todo) ta$le.add3tag8 5a etiqueta tag no puede estar ya en la ta$la y no puede tener el mismo nom$re que otra etiqueta en la ta$la. Es posi$le $uscar una etiqueta en una ta$la con el m%todo) ta& M ta$le.loo(up3na"e8 Este m%todo de"uel"e la etiqueta tag en la ta$la que ten&a el nom$re name o ?one si no ay nin&una etiqueta con ese nom$re. 1e puede $orrar una TextTa& de una TextTa&Ta$le con el m%todo) ta$le.remo"e3tag8 El tama=o de la TextTa&Ta$le se puede consultar con el m%todo) size M ta$le.&etBsize38 1/.@. :n e)e"plo de $ista de Texto El pro&rama de ejemplo testtext.py 3que se deri"a del pro&rama testtext.c incluido en la distri$ucin GTK! 2.0.x8 demuestra el uso del control TextTie' y sus o$jetos asociados) TextFuffers# Text:ters# Text4ar(s# TextTa&s# TextTa&Ta$les. 5a fi&ura 7i&ura 1;.2# VEjemplo de

Tista de TextoW ilustra su funcionamiento) #igura 1/.!. E)e"plo de $ista de Texto

El pro&rama testtext.py define unas cuantas clases adem9s de la clase principal TestText) 5a clase Fuffer # en las l<neas DDUCDI# es una su$clase de la clase &t(.TextFuffer. Proporciona las capacidades de edicin del $uffer que usan los o$jetos Tie'. 5a clase Tie' # l<neas CDSU112I# es una su$clase de la clase &t(.>indo' y contiene un o$jeto &t(.TextTie' que usa un o$jeto Fuffer en lu&ar de un o$jeto &t(.TextFuffer. Proporciona una "entana y "isualiza los contenidos de un o$jeto Fuffer adem9s de una $arra de men2. 5a clase 7ile1el # l<neas R;UDR# es una su$clase de la clase &t(.7ile1election que proporciona una seleccin de fic eros para los contenidos de la clase Fuffer . 5a clase 1tac( proporciona o$jetos de pilas simples. 5a "entana de ciclo de color se implementa usando etiquetas de texto que se aplican a una seccin del texto en un $uffer. 5as l<neas 10DU11J 3en el m%todo BBinitBB38 8 crean estas etiquetas y las l<neas RI;URSC 3en el m%todo doBapplyBcolors38 8 aplican las etiquetas de colores a una seccin del texto de dos en dos caracteres. 5as lienas 202U2;D proporcionan los m%todos 3colorBcycleBtimeout38# setBcolors38 y cycleBcolors388 que producen el ciclo de color cuando est9 acti"ado. El ciclo de color se acti"a esta$leciendo 3l<nea 2208 la propiedad foreground_gdk de las etiquetas indi"iduales color_tags 3que tam$i%n esta$lecen la propiedad foreground_set 8. El ciclo de color se desacti"a poniendo la propiedad foreground_set a 7-51E 3l<nea 2228. 5os colores se cam$ian periodicamente al desplazar el tono del color 3 start_hue 3line 2;R88 .n nue"o Fuffer se rellena con un contenido de ejemplo cuando se selecciona el men2 TestULExample 3el m%todo fillBexampleB$uffer38 en las l<neas ;02U;R28. El $uffer de ejemplo contiene texto de "arios colores# estilos# idiomas y pix$uffers. El m%todo initBta&s38 3l<neas 2I0U;008 esta$lece una "ariedad de TextTa&s para usarlas con el texto de ejemplo. 5a se=al de e"ento de estas etiquetas se conecta al m%todo ta&Be"entB andler38 3l<neas 2C1U2JI8 para ilustrar la captura de los e"entos de $otn y mo"imiento. El modo de ajuste del control TextTie' est9 puesto a >0-PB>/0@ 3l<nea JS08 y las "entanas de $orde del TextTie' se "isualizan al esta$lecer su tama=o en las l<neas JSRUJSS y las l<neas JDIUJDR. 5as "entanas del $orde derec o e izquierdo se usan para mostrar los n2meros de l<nea y las "entanas de $orde superior e inferior muestran las posiciones de ta$ulacin cuando se utilizan ta$ulaciones personalizadas. 5as "entanas de $orde se actualizan cuando se reci$e la se=al EexposeUe"entE en el TextTie' 3l<neas JD0 y JDD8 El m%todo lineBnum$ersBexpose38 3l<neas 10RDU111I8 determina si las "entanas de $orde izquierdo o derec o tienen un e"ento de exposicin y# si es as<# calculan el tama=o del 9rea de exposicin. Entonces# la localizacin del principio de la l<nea y el n2mero de l<nea para cada l<nea en el 9rea de exposicin se calcula en el m%todo &etBlines38 3l<neas 10JRU10RR8. 5os n2meros de l<nea se di$ujan en la "entana de $orde en la posicin 3transformada por la l<nea 110D8. 5as posiciones personalizadas de ta$ulacin se "isualizan en las "entanas de $orde

superior e inferior de una forma similar 3l<neas 101;U10JJ8. 1lo se "isualizan cuando el cursor se mue"e dentro de un ran&o de texto que tiene el atri$uto de ta$ulaciones propias. Esto se detecta manejando la se=al Emar(UsetE en el m%todo cursorBsetB andler38 3l<neas DDDU10118 e in"alidando las "entanas de $orde superior e inferior si la marca a acti"ar es la marca insert. 5os controles m"iles se a=aden al o$jeto Tie' con el m%todo doBaddBc ildren38 3l<neas SD2USDD8 el cual llama al m%todo addBmo"a$leBc ildren38 3l<neas SRCUSD08. 5os ijos son &t(.5a$els 3Etiquetas8 que pueden arrastrarse por las "entanas que forman parte de un control TextTie' . @e la misma forma# los controles se a=aden a las "entanas del TextTie' de una Tie' y el Fuffer usando el m%todo doBaddBfocusBc ildren38 3l<neas D01UDCD8. Tabla de contenidos 1C.1. :ntroduccin 1C.2. 5a :nterfaz y -lmac%n de @atos Tree4odel 1C.2.1. :ntroduccin 1C.2.2. Areacin de /$jetos Tree1tore 39r$ol8 y 5ist1tore 3lista8 1C.2.;. Amo referirse a las filas de un modelo Tree4odel 1C.2.C. -dicin de filas 1C.2.J. Eliminacin de 7ilas 1C.2.I. Gestin de los datos de las filas 1C.2.R. 1oporte del protocolo de Pyt on 1C.2.S. 1e=ales de Tree4odel 1C.2.D. /rdenacin de filas de modelos Tree4odel 1C.;. TreeTie's 3Tistas de 9r$ol8 1C.;.1. Areacin de un TreeTie' 3"ista de 9r$ol8 1C.;.2. /$tencin y esta$lecimiento del 4odelo de un TreeTie' 1C.;.;. @efinicin de las propiedades de un TreeTie' 1C.C. Tisualizadores de Aelda 3Aell0enderer8 1C.C.1. :ntroduccin 1C.C.2. Tipos de Tisualizadores Aell0enderer 1C.C.;. Propiedade de un Aell0enderer 1C.C.C. -tri$utos de un Aell0enderer 1C.C.J. 7uncin de @atos de Aelda 1C.C.I. Etiquetas de 4arcado en Aell0endererText 1C.C.R. Aeldas de Texto Edita$les 1C.C.S. Aeldas Fiestado -cti"a$les 1C.C.D. Pro&rama de Ejemplo de Aelda Edita$le and -cti"a$le 1C.J. TreeTie'Aolumns 3columnas de "ista de 9r$ol8 1C.J.1. Areacin de TreeTie'Aolumns 3columnas de "ista de 9r$ol8 1C.J.2. Gestin de los Aell0enderers 3:nt%rpretes de celda8 1C.I. 4anipulacin de TreeTie's 1C.I.1. Gestin de las Aolumnas 1C.I.2. Expansin y Aontraccin de 7ilas +ijas 1C.R. 1e=ales de TreeTie' 1C.S. 1elecciones Tree1elections 1C.S.1. /$tencin de Tree1election

1C.S.2. 4odos de una seleccin Tree1election 1C.S.;. /$tencin de la 1eleccin 1C.S.C. .so de una 7uncin de Tree1election 1C.S.J. 1eleccin y @eseleccin de 7ilas 1C.D. -rrastra y 1oltar en TreeTie' 1C.D.1. 0eordenacin mediante -rrastrar y 1oltar 1C.D.2. -rrastar y 1oltar Externo 1C.D.;. Ejemplo de -rrastrar y 1oltar en TreeTie' 1C.10. Tree4odel1ort y Tree4odel7ilter 1C.10.1. Tree4odel1ort 34odelo de er$ol /rdenado8 1C.10.2. Tree4odel7ilter 34odelo de 9r$ol filtrado8 1C.11. El 4odelo de er$ol Gen%rico 3GenericTree4odel8 1C.11.1. Tisin &eneral de GenericTree4ode 1C.11.2. 5a :nterfaz GenericTree4odel 1C.11.;. -dicin y Eliminacin de 7ilas 1C.11.C. Gestin de 4emoria 1C.11.J. /tras :nterfaces 1C.11.I. .tilizacin de GenericTree4odel 1C.12. El Tisualizador de Aelda Gen%rico 3GenericAell0enderer8 El control TreeTie' 3control de "ista de 9r$ol8 muestra listas y 9r$oles de m2ltiples columnas. 1ustituye los anti&uos controles 5ist# A5ist# Tree y ATree por un conjunto de o$jetos muc o m9s potente y flexi$le que utilizan el patrn 4odeloUTistaUAontrolador 34TA8 para proporcionar las si&uientes funcionalidades) dos modelos predefinidos) uno para listas y otro para 9r$oles las m2ltiples "istas de un modelo son autom9ticamente actualizadas cuando se producen cam$ios en %ste "isualizacin selecti"a de los datos del modelo uso de datos del modelo para personalizar la "isualizacin del control en cada fila o$jetos de representacin de datos predefinidos para mostrar texto# im9&enes y datos $ooleanos modelos acumula$les para o$tener "istas ordenadas o filtradas del modelo de datos su$yacente columnas que permiten su reordenacin y redimensionado ordenacin autom9tica aciendo clic( en los enca$ezados de las columnas soporte para arrastrar y soltar soporte para modelos personalizados escritos totalmente en Pyt on soporte para int%rpretes de celdas 3cell renderers8 personalizados escritos completamente en Pyt on /$"iamente# todas estas posi$ilidades conlle"an el coste de un conjunto de o$jetos e interfaces si&nificati"amente m9s complejo y que puede lle&ar a parecer intimidatorio inicialmente. En el resto del cap<tulo exploraremos los o$jetos e interfaces de la "ista de 9r$ol 3TreeTie'8 para comprender sus usos a$ituales. 5os usos m9s esot%ricos tendr9n que ser in"esti&ados por el lector. Aomenzaremos con una r9pida "isin &eneral de o$jetos e interfaces para posteriormente $ucear en la interfaz de Tree4odel y en las clases predefinidas 5ist1tore y Tree1tore.

12.1. Introduccin El control TreeTie' 3"ista de 9r$ol8 es el o$jeto de interfaz de usuario que muestra los datos almacenados en un o$jeto que implemente la interfaz Tree4odel. En PyGTK 2.0 se proporcionan dos clases $ase para modelos de 9r$ol.) Tree1tore 3almac%n de datos en 9r$ol8# que proporcionan almacenamiento para datos jer9rquicos# or&aniz9ndolos como filas de un 9r$ol y con los datos en columnas. Aada fila del 9r$ol puede tener cero o m9s filas ijas# aunque todas las filas de$en tener el mismo n2mero de columnas. 5ist1tore 3almac%n de datos en lista8# que proporciona almacenamiento para datos ta$ulares# con una or&anizacin en filas y columnas# de una manera similar a la ta$la de una $ase de datos relacional. .n 5ist1tore 3almac%n de datos en lista8 realmente consiste en una "ersin simplificada de un Tree1tore 3almac%n de datos en 9r$ol8# cuyas filas no tienen descendientes. 7ue creada para proporcionar una interfaz m9s sencilla 3y presuntamente m9s eficiente8 a un modelo de datos tan com2n. [# estos dos modelos adicionales se superponen 3o se interponen8 a los modelos $ase) Tree4odel1ort# que proporciona un modelo en el que los datos del modelo de 9r$ol su$yacente se mantienen ordenados. [# Tree4odel7ilter# que proporciona un modelo que contiene un su$conjunto de los datos del modelo su$yacente. Este modelo 2nicamente est9 disponi$le desde la "ersin de PyGTK 2.C y posteriores. .n TreeTie' 3"ista de 9r$ol8 muestra todas las filas que contiene un Tree4odel# pero permite mostrar selecti"amente al&unas de las columnas. Tam$i%n es posi$le presentar las columnas en un orden diferente al de almacenamiento en el Tree4odel. .n TreeTie' usa o$jetos del tipo TreeTie'Aolumn 3columnas de "ista de 9r$ol8 para or&anizar la "isualizacin de los datos en columnas. Aada TreeTie'Aolumn muestra una columna con un enca$ezado opcional que puede contener los datos de di"ersas columnas de un Tree4odel. 5os o$jetos TreeTie'Aolumn se empaquetan 3de forma semejante a los contenedores +Fox8 con o$jetos Aell0enderer 3int%rpretes de celda8# para &enerar la "isualizacin de los datos asociados situados en una fila y columna de un Tree4odel. Existen tres clases de Aell0enderer predefinidas) Aell0endererPix$uf# que muestra una ima&en del tipo pix$uf en las celdas de un TreeTie'Aolumn. Aell0endererText# que muestra una cadena en las celdas de un TreeTie'Aolumn. 1i es necesario con"ierte los datos de la columna a cadenas de texto. Por ejemplo# si se mostrase una columna de datos consistente en n2meros en coma flotante# el Aell0endererText los con"ertir<a en cadenas de texto antes de mostrarlos. Aell0endererTo&&le# que muestra un "alor $ooleano como un $otn conmuta$le en las celdas de un TreeTie'Aolumn. .na TreeTie'Aolumn puede contener "arios o$jetos Aell0enderer para proporcionar una columna que# por ejemplo# pueda contener una ima&en y un texto juntos. 7inalmente# los o$jetos Tree:ter 3iterador de 9r$ol8# Tree0o'0eference 3referencia de fila de 9r$ol8 y Tree1election 3seleccin de 9r$ol8 proporcionan un puntero transitorio a la fila de un Tree4odel# un puntero persistente a la fila de un Tree4odel y un o$jeto que &estiona una seleccin en una TreeTie'.

5a "isualizacin de un TreeTie' se compone de las si&uientes operaciones &enerales 3aunque no necesariamente en este orden8) 1e crea un o$jeto de modelo de 9r$ol 3Tree4odel8# &eneralmente un 5ist1tore o un Tree1tore con una o m9s columnas de un tipo de datos determinado. El modelo de 9r$ol puede entonces llenarse con una o m9s filas de datos. 1e crea un control TreeTie' y se asocia al modelo de 9r$ol. 1e crean una o m9s columnas TreeTie'Aolumn y se insertan en el TreeTie'. Aada una de ellas resultar9 en la "isualizacin de una columna. Para cada TreeTie'Aolumn se crea uno o m9s int%rpretes de celda Aell0enderer# que son a=adidos a cada TreeTie'Aolumn. 1e fijan los atri$utos de cada Aell0enderer para indicar de qu% columnas del modelo de 9r$ol an de tomar los datos del atri$uto# como por ejemplo# el texto que se a de mostrar. Esto permite que los Aell0enderer muestren las columnas de cada fila de forma distinta. El TreeTie' se inserta y es mostrado en una "entana 3>indo'8 o una "entana con $arras de desplazamiento 31crolled>indo'8. 5os datos del modelo de 9r$ol se manipulan pro&ram9ticamente en respuesta a las acciones de los usuarios y usuarias. El TreeTie' rastrear9 de forma autom9tica los cam$ios. El pro&rama de ejemplo basictree0ie(.py ilustra la creacin y "isualizacin de un o$jeto sencillo TreeTie') 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J QPGusrG$inGen" pyt on Q example $asictree"ie'.py import py&t( py&t(.require3N2.0N8 import &t( class FasicTreeTie'Example) Q close t e 'indo' and quit def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def BBinitBB3self8) Q Areate a ne' 'indo' self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 self.'indo'.setBtitle3EFasic TreeTie' ExampleE8 self.'indo'.setBsizeBrequest3200# 2008 self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8

2I Q create a Tree1tore 'it one strin& column to use as t e model 2R self.treestore M &t(.Tree1tore3str8 2S 2D Q 'eNll add some data no' U C ro's 'it ; c ild ro's eac ;0 for parent in ran&e3C8) ;1 piter M self.treestore.append3?one# ^Nparent `iN ` parent_8 ;2 for c ild in ran&e3;8) ;; self.treestore.append3piter# ^Nc ild `i of parent `iN ` ;C 3c ild# parent8_8 ;J ;I Q create t e TreeTie' usin& treestore ;R self.tree"ie' M &t(.TreeTie'3self.treestore8 ;S ;D Q create t e TreeTie'Aolumn to display t e data C0 self.t"column M &t(.TreeTie'Aolumn3NAolumn 0N8 C1 C2 Q add t"column to tree"ie' C; self.tree"ie'.appendBcolumn3self.t"column8 CC CJ Q create a Aell0endererText to render t e data CI self.cell M &t(.Aell0endererText38 CR CS Q add t e cell to t e t"column and allo' it to expand CD self.t"column.pac(Bstart3self.cell# True8 J0 J1 Q set t e cell EtextE attri$ute to column 0 U retrie"e text J2 Q from t at column in treestore J; self.t"column.addBattri$ute3self.cell# NtextN# 08 JC JJ Q ma(e it searc a$le JI self.tree"ie'.setBsearc Bcolumn308 JR JS Q -llo' sortin& on t e column JD self.t"column.setBsortBcolumnBid308 I0 I1 Q -llo' dra& and drop reorderin& of ro's I2 self.tree"ie'.setBreordera$le3True8 I; IC self.'indo'.add3self.tree"ie'8 IJ II self.'indo'.s o'Ball38 IR IS def main38) ID &t(.main38 R0 R1 if BBnameBB MM EBBmainBBE) R2 t"example M FasicTreeTie'Example38

R;

main38

En pro&ramas reales el Tree1tore pro$a$lemente se llenar<a de datos despu%s de que la "isualizacin del TreeTie' se produjese por una accin del usuario. ?os detendremos en los detalles de las interfaces de TreeTie' en secciones posteriores. Figura 1(.1, Programa e ementa !e ejemp o !e )ree#ie* muestra la "entana creada por el pro&rama basictree0ie(.py tras la expanxin de un par de filas madre. #igura 12.1. Progra"a ele"ental de e)e"plo de Tree$ie(

- ora examinemos la interfaz de Tree4odel y los modelos que la implementan. 12.!. 7a Inter-a4 y 3l"acCn de Batos Tree'odel 12.!.1. Introduccin 5a interfaz Tree4odel es implementada por todas las su$clases de Tree4odel y aporta m%todos para) la o$tencin de las caracter<sticas del conjunto de datos que almacena# tales como el n2mero de columnas y el tipo de datos de %stas. la o$tencin de un iterador 3Tree:ter8# una referencia temporal que apunta a una fila del modelo. la o$tencin de informacin so$re un nodo 3o fila8# tal como el n2mero de nodos que descienden de %l# una lista de %stos nodos ijos# el contenido de sus columnas y un puntero al nodo padre. informar de los cam$ios que se produzcan elos datos del modelo 3Tree4odel8. 12.!.!. Creacin de Eb)etos Tree%tore 85rbol9 y 7ist%tore 8lista9 5as clases $ase para el almacenamiento de datos 5ist1tore 3almac%n de datos en lista8 y Tree1tore 3almac%n de datos en 9r$ol8 permiten definir y &estionar las filas y columnas de datos existentes en un modelo de 9r$ol. 5os constructores de am$os o$jetos precisan que el tipo de cada una de las columnas sea al&uno de los si&uientes) tipos $9sicos de Pyt on# tal como) int# str# lon&# float y o$ject. tipos de PyGTK tales como Futton# TFox# &d(.0ectan&le# &d(.Pix$uf# etc. tipos G/$ject 3GTypes de GTK!8 especificados $ien como constantes G/$ject Type o como cadenas. 5a mayor<a de GTypes son traducidos a un tipo de Pyt on) &o$ject.T[PEBA+-0 o N&c arN &o$ject.T[PEB.A+-0 o N&uc arN &o$ject.T[PEBF//5E-? o N&$ooleanN &o$ject.T[PEB:?T o N&intN &o$ject.T[PEB.:?T o N&uintN &o$ject.T[PEB5/?G o N&lon& &o$ject.T[PEB.5/?G o N&ulon&

&o$ject.T[PEB:?TIC o N&intICN &o$ject.T[PEB.:?TIC o N&uintICN &o$ject.T[PEB75/-T o N&floatN &o$ject.T[PEB@/.F5E o N&dou$leN &o$ject.T[PEB1T0:?G o N&c ararrayN &o$ject.T[PEB/F*EAT o NG/$ject

Por ejemplo# para crear un 5ist1tore o Tree1tore cuyas columnas contu"iesen un &d(.Pix$uf 3un tipo de ima&en8# un entero# una cadena y un tipo $ooleano a$r<a que acier al&o as<) liststore M 5ist1tore3&t(.&d(.Pix$uf# int# str# N&$ooleanN8 treestore M Tree1tore3&t(.&d(.Pix$uf# int# str# N&$ooleanN8 .na "ez que se crea un almac%n de datos en 5ista 35ist1tore8 o un almac%n de datos en 9r$ol 3Tree1tore8 y sus columnas an sido definidas# ya no es posi$le acer en ellos cam$ios o modificaciones. -s< mismo es importante tener en cuenta que no existe una relacin predefinida entre las columnas de una "ista de 9r$ol 3TreeTie'8 y las columnas de su correspondiente modelo 3Tree4odel8. Es decir# la quinta columna de datos de un modelo 3Tree4odel8 puede mostrarse en la primera columna de una determinada "ista de 9r$ol 3TreeTie'8 y en la tercera columna en otra "ista diferente. Por tanto# no es necesario preocuparse de cmo se mostrar9n los datos a la ora de crear los almacenes de datos 31tores8. 1i estos dos tipos de almacenes de datos no se ajustan a las necesidades de una aplicacin es posi$le definir otros almacenes de datos personalizados en Pyt on siempre que %stos implementen la interfaz Tree4odel. 0etomaremos esta cuestin m9s adelante en la seccin dedicada a GenericTree4odel . 12.!./. C"o re-erirse a las -ilas de un "odelo Tree'odel -ntes de que podamos a$lar de la &estion de las filas de datos de un almac%n Tree1tore o 5ist1tore necesitamos una forma de especificar a qu% columna nos queremos referir. PyGTK dispone de tres formas de indicar columnas de un modelo Tree4odel ro's) un camino de 9r$ol# un iterador Tree:ter y una referencia Tree0o'0eference. 12.!./.1. Ca"inos de 5rbol 8Tree Paths9 .n camino de 9r$ol es una representacin mediante enteros# una cadena o una tupla de la localizacin de una fila en un almac%n de datos. .n "alor entero especifica la fila del ni"el superior del almac%n# empezando por 0. Por ejemplo# un "alor de camino de C especificar<a la quinta fila del almac%n de datos. @e la misma manera# una representacin mediante una cadena resultar<a ECE y la representacin como tupla 3C#8. Esto es suficiente para lle&ar a determinar cualquier fila en un almac%n de datos en lista 35ist1tore8# pero en el caso de un 9r$ol 3Tree1tore8 necesitamos poder indicar las filas ijas. Para este caso de$emos usar la representacin mediante una cadena o una tupla. @ado que un almac%n en 9r$ol 3Tree1tore8 puede tener una jerarqu<a de una profudidad ar$itraria# la representacin como cadena especifica el camino desde el ni"el m9s alto asta la fila esco&ida utilizando enteros separados mediante el car9cter E)E. @e forma

similar# la representacin mediante una tupla especifica el camino en el 9r$ol empezando desde el "%rtice asta la fila como una secuencia de enteros. Aomo ejemplos correctos de representaciones con cadenas de caminos tenemos) E0)2E 3especifica la fila que es la tercera ija de la primera fila8 y EC)0)1E 3especifica la fila que es la se&unda ija del primer ijo de la quinta fila8. @e forma semejante# los mismos caminos son representados respecti"amente por las tuplas 30# 28 y 3C# 0# 18. .n camino de 9r$ol es la 2nica manera en la que se puede acer corresponder una fila de una "ista de 9r$ol 3TreeTie'8 a una fila de un modelo 3Tree4odel8 de$ido a que los caminos de una y otra son i&uales. Tam$i%n existen otros pro$lemas con los caminos de 9r$ol) un camino de 9r$ol puede especificar una fila que no existe en el almac%n 5ist1tore o Tree1tore. un camino de 9r$ol puede apuntar a datos distintos tras insertar o $orrar una fila en un 5ist1tore o Tree1tore. PyGTK usa la representacin como tupla al de"ol"er caminos# pero acepta cualquiera de las tres formas de representar un camino. Por co erencia se de$er<a usar la representacin en forma de tupla. 1e puede o$tener un camino de 9r$ol a partir de un iterador Tree:ter utilizando el m%todo &etBpat 38) pat M store.&etBpat 3iter8 donde iter es un iterador Tree:ter que apunta a una fila en el almac%n y path es la tupla que representa el camino a la fila. 12.!./.!. Iteradores TreeIter .n iterador Tree:ter es un o$jeto que aporta una referencia transitoria a la fila de un almac%n 5ist1tore o Tree1tore. 1i los contenidos del almac%n cam$ian 3&eneralmente porque se a a=adido o quitado una fila8 el iterador Tree:ter puede no ser ya "9lido. .n modelo Tree4odel que d% soporte a iteradores persistentes de$e esta$lecer la $andera &t(.T0EEB4/@E5B:TE01BPE01:1T. .na aplicacin puede compro$ar dic a $andera aciendo uso del m%todo &etBfla&s38. 5os iteradore Tree:ter se crean utilizando al&uno de los m%todos del modelo Tree4odel# que son aplica$les tanto a o$jetos del tipo Tree1tore como 5ist1tore) treeiter M store.&etBiter3path8 donde treeiter apunta a la fila del camino path. 5a excepcin TalueError se acti"a en el caso de que el camino no sea "9lido. treeiter M store.&etBiterBfirst38 donde treeiter es un iterador Tree:ter que apunta a la fila en el camino 30#8. treeiter ser9 ?one si el almac%n est9 "ac<o. treeiter M store.iterBnext3iter8

donde treeiter es un iterador Tree:ter que apunta a la si&uiente fila en el mismo ni"el que el iterador Tree:ter especificado por iter. treeiter tendr9 el "alor ?one si no ay una fila si&uiente 3iter tam$i%n es in"alidado8. 5os si&uientes m%todos son de utilidad 2nicamente cuando se "aya a o$tener un iterador Tree:ter a partir de un almac%n de datos de 9r$ol 3Tree1tore8) treeiter M treestore.iterBc ildren3parent8 donde treeiter es un iterador Tree:ter que apunta a la primera fija que desciende de la fila indicada por el iterador Tree:ter indicado por parent. treeiter ser9 ?one en caso de que no ten&a descendientes. treeiter M treestore.iterBnt Bc ild3parent# n8 donde treeiter es un iterador Tree:ter que se=ala la fila ija 3de <ndice n8 de la fila especificada por el iterador Tree:ter parent. parent puede ser ?one para o$tener una fila del ni"el superior . treeiter ser9 ?one si no ay descendientes. treeiter M treestore.iterBparent3child8 donde treeiter es un Tree:ter que apunta a la fila madre de la fila especificada por el iterador Tree:ter child. treeiter ser9 ?one si no ay descendientes. 1e puede o$tener un camino a partir de un iterador Tree:ter usando el m%todo &etBpat 38 ) pat M store.&etBpat 3iter8 donde iter es un iterador Treeiter que apunta a una fila del almac%n# y path es su camino expresado como tupla. 12.!././. ,e-erencias persistentes a -ilas 8Tree,o(,e-erences9 .na referencia del tipo Tree0o'0eference es una referencia persistente a una fila de datos en un almac%n. 4ientras que el camino 3es decir# su localizacin8 de una fila puede cam$iar a medida que se a=den o quitan filas al almac%n# una referencia del tipo Tree0o'0eference apuntar9 a la misma fila de datos en tanto exista. ota 5as referencias Tree0o'0eference 2nicamente est9n disponi$les a partir de la "ersin 2.C de PyGTK. 1e puede crear una referencia del tipo Tree0o'0eference utilizando su constructor) treero'ref M Tree0o'0eference3"odel# path8 donde model es el modelo Tree4odel que contiene la fila y path es el camino de la fila que ay que referenciar. 1i path no es un camino "9lido para el modelo model entonces se de"uel"e ?one.

12.!.2. 3dicin de -ilas 12.!.2.1. 3dicin de -ilas a un al"acCn de datos del tipo 7ist%tore .na "ez que se a creado un almac%n del tipo 5ist1tore se an de a=adir filas utilizando al&uno de los m%todos si&uientes) iter M append3ro(M?one8 iter M prepend3ro(M?one8 iter M insert3position# ro(M?one8 iter M insertB$efore3sibling# ro(M?one8 iter M insertBafter3sibling# ro(M?one8 Aada uno de estos m%todos insertan una fila en una posicin impl<cita o especificada en el almac%n 5ist1tore. 5os m%todos append38 y prepend38 usan posiciones impl<citas) tras la 2ltima fila y antes de la primera fila# respecti"amente. El m%todo insert38 requiere un entero 3el par9metro position8 que especifica la localizacin en la que se insertar9 la fila. 5os otros dos m%todos necesitan un iterador Tree:ter 3sibling8 que ace referencia a una fila en el almac%n 5ist1tore ante o tras la cual se insertar9 la fila. El par9metro row especifica los datos que de$er<an ser insertados en la fila tras su creacin. 1i row es ?one o no se especifica# se crea una fila "ac<a. 1i row se especifica de$e ser una tupla o una lista que conten&a tantos elementos como el n2mero de columnas que posea el almac%n 5ist1tore. 5os elementos tam$i%n de$en coincidir con los tipos de las correspondientes columnas del almac%n 5ist1tore. Todos los m%todos de"uel"en un iterador Tree:ter que apunta a la fila reci%n insertada. El si&uiente fra&mento de cdi&o ilustra la creacin de un almac%n 5ist1tore y la adicin de filas de datos en %l) ... liststore M &t(.5ist1tore3int# str# &t(.&d(.Aolor8 liststore.append3^0#NredN#colormap.allocBcolor3NredN8_8 liststore.append3^1#N&reenN#colormap.allocBcolor3N&reenN8_8 iter M liststore.insert31# 32#N$lueN#colormap.allocBcolor3N$lueN88 8 iter M liststore.insertBafter3iter# ^;#Nyello'N#colormap.allocBcolor3N$lueN8_8 ... 12.!.2.!. 3dicin de -ilas a un al"acCn de datos del tipo Tree%tore 5a adicin de filas a un almac%n del tipo Tree1tore es semejante a la operacin so$re el tipo 5ist1tore# sal"o que tam$i%n se de$e especificar una fila madre 3usando un iterador Tree:ter8 a la que a=adir la nue"a fila. 5os m%todos para el amac%n Tree1tore son) iter M append3parent# ro(M?one8 iter M prepend3parent# ro(M?one8 iter M insert3parent# position# ro(M?one8 iter M insertB$efore3parent# sibling# ro(M?one8 iter M insertBafter3parent# sibling# ro(M?one8

1i parent es ?one# la fila se a=adir9 a las filas del ni"el superior. Aada uno de estos m%todos inserta una fila en una posicin impl<cita o especifica da en el almac%n Tree1tore. 5os m%todos append38 y prepend38 usan posiciones impl<citas) tras la 2ltima fila ija y antes de la primera fila ija# respecti"amente. El m%todo insert38 requiere un entero 3el par9metro position8# que especifica el lu&ar en el que se insertar9 la fila ija. 5os otros dos m%todos necesitan un iterador Tree:ter 3sibling8# que ace referencia a una fila ija en el almac%n Tree1tore ante o tras la que se insertar9 la fila. El par9metro row especifica qu% datos se de$en insertar en la fila tras su creacin. 1i row es ?one o no se especifica# entonces se crea una fila "ac<a. 1i row se especifica# de$e ser una tupla o una lista que conten&a tantos elementos como el n2mero de columnas que posea el almac%n Tree1tore. 5os elementos tam$i%n de$en coincidir en sus tipos con los de las correspondientes columnas del almac%n Tree1tore. Todos los m%todos de"uel"en un iterador Tree:ter que apunta a la reci%n creada fila. El si&uiente fra&mento de cdi&o ilustra la creacin de un Tree1tore y la adicin de filas de datos al mismo) ... folderp$ M &t(.&d(.pix$ufBfromBfile3Nfolder.xpmN8 filep$ M &t(.&d(.pix$ufBfromBfile3Nfile.xpmN8 treestore M &t(.Tree1tore3int# str# &t(.&d(.Pix$uf8 iter0 M treestore.append3?one# ^1#N30#8N#folderp$_ 8 treestore.insert3iter0# 0# ^11#N30#08N#filep$_8 treestore.append3iter0# ^12#N30#18N#filep$_8 iter1 M treestore.insertBafter3?one# iter0# ^2#N31#8N#folderp$_8 treestore.insert3iter1# 0# ^22#N31#18N#filep$_8 treestore.prepend3iter1# ^21#N31#08N#filep$_8 ... 12.!.2./. 3l"acenes de datos de gran ta"a+o Auando los almacenes 5ist1tore o Tree1tore contienen un &ran n2mero de filas de datos la adicin de nue"as filas puede lle&ar a ser muy lenta. +ay un par de cosas que se pueden acer para miti&ar este pro$lema) En el caso de a=adir un &ran n2mero de filas# desconectar el modelo 3Tree4odel8 de su "ista 3TreeTie'8 usando el m%todo setBmodel38 con el par9metro model puesto a ?one e"itar la actualizacin de la "ista 3TreeTie'8 con cada insercin. :&ualmente 2til puede ser desacti"ar la ordenacin al insertar un &ran n2mero de filas. Para ello se usa el m%todo setBdefaultBsortBfunc38 con el par9metro sort_func puesto a ?one. 5imitar el n2mero de referencias del tipo Tree0o'0eference en uso tam$i%n es importante# puesto que se actualiza su camino con cada adicin o emilinacin de filas. 7ijar la propiedad de la "ista 3TreeTie'8 EfixedU ei& tUmodeE a T0.E# de forma que todas las filas ten&an la misma altura y se e"ite el c9lculo indi"idual de la altura de cada fila. Esta opcin solamente est9 disponi$le a partir de la "ersin 2.C de PyGTK.

12.!.;. Eli"inacin de #ilas 12.!.;.1. Eli"inacin de -ilas de un al"acCn 7ist%tore Es posi$le eliminar una fila de datos de un almac%n 5ist1tore usando el m%todo remo"e38 ) treeiter M liststore.remo"e3iter8 donde iter es un iterador Tree:ter que apunta a la fila que se a de eliminar. El iterador de"uelto Tree:ter 3treeiter8 apunta a la si&uiente fila o no es "9lido si iter apunta a la 2ltima fila. El m%todo clear38 elimina todas las filas del almac%n 5ist1tore) liststore.clear38 12.!.;.!. Eli"inacin de -ilas de un al"acCn Tree%tore 5os m%todos que sir"en para eliminar filas de un almac%n Tree1tore son similares a los m%todos equi"alentes del almac%n 5ist1tore) result M treestore.remo"e3iter8 treestore.clear38 donde result es T0.E si la fila a sido eliminada e iter apunta a la si&uiente fila "9lida. En otro caso# result es 7-51E e iter es in"alidado. 12.!.>. Gestin de los datos de las -ilas 12.!.>.1. Establece"iento y obtencin de los 0alores de los datos 5os m%todos para acceder a los "alores de los datos en los almacenes 5ist1tore y Tree1tore tienen el mismo formato. Todas las manipulaciones de datos en almacenes usan un iterador Tree:ter que especifica la fila con la que se tra$aja. .na "ez o$tenido# dic o iterador 3Tree:ter8 puede usarse para o$tener los "alores de la columna de una fila utilizando el m%todo &etB"alue38 ) "alue M store.&etB"alue3iter# colu"n8 donde iter es un iterador Tree:ter que apunta a una fila# column es un n2mero de columna en el almac%n store# y# value es el "alor &uardado en la posicin filaUcolumna se=alada. Para o$tener los "alores de "arias columnas en una 2nica llamada se de$e usar el m%todo &et38 ) "alues M store.&et3iter# column# ...8 donde iter es un iterador Tree:ter que apunta a una fila# column es un n2mero de columna en el almac%n store# y# ... representa cero o m9s n2meros de columna adicionales y values es una tupla que contiene los "alores o$tenidos. Por ejemplo# para o$tener los "alores de las columnas 0 y 2)

"al0# "al2 M store.&et3iter# 0# 28 ota El m%todo &et38 solamente est9 disponi$le a partir de la "ersin 2.C de PyGTK. Para esta$lecer el "alor de una columna se emplea el m%todo setB"alue38 ) store.setB"alue3iter# colu"n# 0alue8 donde iter 3un iterador Tree:ter8 y column 3un entero8 especifican la posicin filaUcolumna en el almac%n store y column es el n2mero de columna cuyo "alor value de$e ser fijado. value de$e ser del mismo tipo de dato que la columna del almac%n store. En el caso de que se desee esta$lecer de una sola "ez el "alor de m9s de una columna en una fila se de$e usar el m%todo set38 ) store.set3iter# ...8 donde iter especifica la fila del almac%n y ... es uno o m9s pares de n2mero de columna U "alor que indican la columna y el "alor que se "a a fijar. Por ejemplo# la si&uiente llamada) store.set3iter# 0# N7ooN# J# NFarN# 1# 12;8 esta$lece el "alor de la primera columna como N7ooN# el de la sexta columna como NFarN y el de la se&unda columna como 12;# en la fila del almac%n store especificada por el iterador iter. 12.!.>.!. ,eorgani4acin de -ilas en al"acenes 7ist%tore 1e pueden mo"er indi"idualmente las filas de un almac%n 5ist1tore usando al&uno de los si&uientes m%todos disponi$les desde la "ersin 2.2 de PyGTK) liststore.s'ap3a# b8 liststore.mo"eBafter3iter# position8 liststore.mo"eB$efore3iter# position8 s'ap38 permuta la posicin de las filas a las que acen referencia los iteradores Tree:ter a y b. mo"eBafter38 y mo"eB$efore38 mue"en la fila se=alada por el iterador 3Tree:ter8 iter a una posicin anterior o posterior a la fila indicada por el iterador 3Tree:ter8 position. 1i position tiene el "alor ?one# mo"eBafter38 situar9 la fila al principio principio del almac%n# mientras que mo"eB$efore38 lo ar9 al final del mismo. En caso de que se desee reor&anizar completamente las filas de datos de un almac%n 5ist1tore entonces es preferi$le usar el si&uiente m%todo) liststore.reorder3new_order8 donde new_order es una lista de enteros que especifican el nue"o orden de filas de la si&uiente manera) new_order^nue"aposicin_ M anti&uaposicin

Por ejemplo# si liststore contu"iese cuatro filas) NoneN Nt'oN Nt reeN NfourN 5a llamada al m%todo) liststore.reorder3^2# 1# ;# 0_8 producir<a el si&uiente orden) Nt reeN Nt'oN NfourN NoneN ota Estos m%todos 2nicamente reor&anizar9n almacenes 5ist1tore no ordenados. En el caso de querer reor&anizar las filas de datos en la "ersin 2.0 de PyGTK es necesario recurrir a la eliminacin e insercin de filas utilizando los m%todos descritos en las secciones A!icin !e +i as y E iminacin !e +i as. 12.!.>./. ,eorgani4acin de -ilas en al"acenes Tree%tore 5os m%todos que se usan para reor&anizar las filas de un almac%n Tree1tore son semejantes a los utilizados con los almacenes del tipo 5ist1tore# exceptuando que los primeros 2nicamente afectan a las filas ijas de una determinada fila madre. Es decir# no es posi$le# por ejemplo# intercam$iar filas con filas madre distintas.) treestore.s'ap3a# b8 treestore.mo"eBafter3iter# position8 treestore.mo"eB$efore3iter# position8 s'ap38 intercam$ia las posiciones de las filas ija indicadas por los iteradores 3Tree:ter8 a y b. a y b de$en compartir su fila madre. mo"eBafter38 y mo"eB$efore38 mue"en la fila indicada por el iterador 3Tree:ter8 iter a una posicin posterior o anterior a la fila se=alada por el iterador 3Tree:ter8 position. iter y position de$en compartir su fila madre. 1i position tiene el "alor ?one# mo"eBafter38 situar9 la fila al principio del almac%n# mientras que el m%todo mo"eB$efore38 lo ar9 al final del mismo. El m%todo reorder38 precisa un par9metro adicional que especifique la fila madre cuyas filas ijas ser9n reordenadas) treestore.reorder3parent# ne(.order8

donde new_order es una lista de enteros que especifican el nue"o orden de filas ijas de la fila madre especificada por el iterador 3Tree:ter8 parent de la si&uiente manera) new_order^nue"aposicin_ M anti&uaposicin Por ejemplo# si treestore contu"iese estas cuatro filas) NparentN NoneN Nt'oN Nt reeN NfourN 5a llamada al m%todo) treestore.reorder3parent# ^2# 1# ;# 0_8 producir<a el si&uiente orden) NparentN Nt reeN Nt'oN NfourN NoneN ota Estos m%todos 2nicamente reor&anizar9n almacenes Tree1tore no ordenados. 12.!.>.2. Gestin de "?ltiples -ilas .no de los aspectos m9s pro$lem9ticos de la manipulacin de almacenes 5ist1tore y Tree1tore es el tra$ajo con m2ltiples filas# como por ejemplo# mo"er "arias filas de una fila madre a otra# o eliminar un conjunto de filas en funcin de determinados criterios. 5a dificultad sur&e de la necesidad de utilizar un iterador Tree:ter que puede no ser ya "9lido como resultado de la operacin que se realice. Es posi$le compro$ar si los iteradores de unos almacenes 5ist1tore y Tree1tore con persistentes utilizando el m%todo &etBfla&s38 y contrastando la existencia de la $andera &t(.T0EEB4/@E5B:TE01BPE01:1T. 1in em$ar&o# las clases apila$les del tipo Tree4odel7ilter y Tree4odel1ort no poseen iteradores Tree:ter persistentes. 1i aceptamos que los iteradores Tree:ter no son persistentes# Xcmo mo"emos todas las filas ijas de una dada a otraY. Para ello tenemos que) iterar so$re la descendencia de la fila madre o$tener los datos de cada fila eliminar cada fila ija insertar una nue"a fila con los datos de la anti&ua fila en la lista de la nue"a fila madre

?o podemos confiar en que el m%todo remo"e38 de"uel"a un iterador Tree:ter correcto# por

lo que simplemente solicitaremos el iterador del primer descendiente asta que de"uel"a ?one. .na funcin posi$le para mo"er filas ijas ser<a) def mo"eBc ildBro's3treestore# fromBparent# toBparent8) nBcolumns M treestore.&etBnBcolumns38 iter M treestore.iterBc ildren3fromBparent8 ' ile iter) "alues M treestore.&et3iter# Zran&e3nBcolumns88 treestore.remo"e3iter8 treestore.append3toBparent# "alues8 iter M treestore.iterBc ildren3fromBparent8 return 5a funcin anterior a$arca el caso sencillo en el que se mue"en todas las filas ijas de una 2nica fila madre# pero Xqu% ocurre si se desea elminar todas las filas del almac%n Tree1tore en funcin de determinado criterio# por ejemplo# el "alor de la primera columnaY. - primera "ista# se podr<a pensar en la posi$ilidad de usar el m%todo foreac 38# de manera que se itere so$re todas las filas y entonces se eliminar<an las que cumpliesen el criterio ele&ido) store.foreac 3func# user_data8 donde func es una funcin que es llamada por cada fila y tiene la si&uiente si&natura) def func3model# path# iter# user_data8) donde model es el almac%n de datos Tree4odel# path es el camino de una fila en el modelo model# iter es un iterador Tree:ter que apunta al camino path y user_data son los datos aportados. 1i func de"uel"e T0.E entonces el m%todo foreac 38 dejar9 de iterar y retornar9. El pro$lema con este enfoque es que al cam$iar los contenidos del almac%n mientras se produce la iteracin del m%todo foreac 38 puede dar lu&ar a resultados impredeci$les. El uso del m%todo foreac 38 para crear y &uardar referencias persistentes Tree0o'0eferences de las filas que "an a ser eliminadas# para posteriormente eliminar estas referencias tras la finalizacin del m%todo foreac 38 podr<a ser una estrate&ia adecuada# sal"o que no funcionar<a en las "ersiones 2.0 y 2.2 de PyGTK# donde no est9n disponi$les las referencias persistentes del tipo Tree0o'0eference. .na estrate&ia fia$le que a$arca todas las "ariantes de PyGTK consiste en llamar al m%todo foreac 38 para reunir los caminos de las filas que se "an a eliminar y lue&o proceder a eliminar dic as filas en orden in"erso# de forma que se preser"e la "alidez de los caminos en el 9r$ol. El si&uiente fra&mento de cdi&o ejemplifica esta estrate&ia)

... Q esta funcin selecciona una fila si el "alor de la primera columna es LM que el "alor de comparaci Q data es una tupla que contiene el "alor de comparacin y una lista para &uardar los caminos def matc B"alueBc$3model# pat # iter# data8) if model.&etB"alue3iter# 08 LM data^0_) data^1_.append3pat 8 return 7alse Q mantiene la iteracin de foreac

pat list M ^_ treestore.foreac 3matc B"alueBc$# 310# pat list88 Q foreac funciona en orden de lle&ada 37:7/8 pat list.re"erse38 for pat in pat list) treestore.remo"e3treestore.&etBiter3pat 88 ... En el caso de que se quisiese $uscar en un almac%n Tree1tore la primera fila que cumpliese determinado criterio# pro$a$lemente ser<a preferi$le lle"ar a ca$o personalmente la iteracin con al&o similar a) treestore M Tree1tore3str8 ... def matc Bfunc3model# iter# data8) column# (ey M data Q data es una tupla que contiene n2mero de columna# cla"e 3(ey8 "alue M model.&etB"alue3iter# column8 return "alue MM (ey def searc 3model# iter# func# data8) ' ile iter) if func3model# iter# data8) return iter result M searc 3model# model.iterBc ildren3iter8# func# data8 if result) return result iter M model.iterBnext3iter8 return ?one ... matc Biter M searc 3treestore# treestore.iterBc ildren3?one8# matc Bfunc# 30# NfooN88 5a funcin de $2squeda searc 38 itera recursi"amente so$re la fila 3especificada por el iterador iter8 y sus descendientes y sus fijas ijas en orden de lle&ada# en $2squeda de una fila que ten&a una columna cuyo "alor coincida con la cadena cla"e dada. 5a $2squeda termina al encontrarse una fila. 12.!.@. %oporte del protocolo de Python 5as clases que implementan la interfaz Tree4odel 3Tree1tore y 5ist1tore y en PyGTK 2.C tam$i%n Tree4odel1ort y Tree4odel7ilter8 tam$i%n soportan los protocolos de Pyt on de mapeado e iteracin 3protocolos mappin& e iterator8. El protocolo de iterador permite usar la funcin de Pyt on iter38 so$re un Tree4odel o crear un iterador que sir"a para iterar so$re todas las filas superiores del Tree4odel. .na caracter<stica m9s 2til es la de iterar utilizando la orden for o la comprensin de listas. Por ejemplo) ... liststore M &t(.5ist1tore3str# str8 ... Q a=adimos al&unas filas al almac%n liststore

... Q $ucle for for ro' in liststore) Q procesado de cada fila ... Q comprensin de lista que de"uel"e una lista de los "alores de la primera columna "alues M ^ r^0_ for r in liststore _ ... /tras partes del protocolo de mapeado que est9n soportadas son el uso de del para eliminar un fila del modelo y la o$tencin de un Tree4odel0o' de PyGTK del modelo utilizando un "alor de cla"e que sea un camino o in iterador Tree:ter. Por ejemplo# las si&uientes instrucciones de"uel"en la primera fila de un modelo Tree4odel y la instruccin final $orra la primera fila ija de la primera fila) ro' M model^0_ ro' M model^N0N_ ro' M model^E0E_ ro' M model^30#8_ i M model.&etBiter308 ro' M model^i_ del model^30#08_ -dem9s# se pueden fijar los "alores en una fila existente de forma parecida a esto) ... liststore M &t(.5ist1tore3str# int# o$ject8 ... liststore^0_ M ^NFuttonN# 2;# &t(.Futton3N5a$elN8_ 5os o$jetos Tree4odel0o' de PyGTK soportan los protocolos de Pyt on de secuencia e iterador. 1e puede o$tener un iterador para recorrer los "alores de columna en una fila o utilizar la instruccin for as< como la comprensin de listas. .n Tree4odel0o' utiliza el n2mero de columna como <ndice para extraer un "alor. Por ejemplo) ... liststore M &t(.5ist1tore3str# int8 liststore.append3^N0andom strin&N# J1C_8 ... ro' M liststore^0_ "alue1 M ro'^1_ "alue0 M liststore^N0N_^0_ for "alue in ro') print "alue "al0# "al1 M ro' ... +aciendo uso del ejemplo de la seccin anterior para iterar so$re un almac%n Tree1tore y localizar una fila que conten&a un "alor concreto# el cdi&o quedar<a)

treestore M Tree1tore3str8 ... def matc Bfunc3ro'# data8) column# (ey M data Q data es una tupla que contiene n2mero de columna# cla"e 3(ey8 return ro'^column_ MM (ey ... def searc 3ro's# func# data8) if not ro's) return ?one for ro' in ro's) if func3ro'# data8) return ro' result M searc 3ro'.iterc ildren38# func# data8 if result) return result return ?one ... matc Bro' M searc 3treestore# matc Bfunc# 30# NfooN88 Tam$i%n se puede fijar el "alor de una columna utilizando) treestore^31#0#18_^1_ M Na$cN .n Tree4odel0o' tam$i%n soporta la instruccin del y la con"ersin a listas y tuplas utilizando las funciones de Pyt on list38 and tuple38. Tal como se ilustra en el ejemplo superior# un o$jeto Tree4odel0o' posee el m%todo iterc ildren38# que de"uel"e un iterador para recorrer las filas ijas del o$jeto Tree4odel0o'. 12.!.A. %e+ales de Tree'odel 5as aplicaciones pueden se&uir los cam$ios de un modelo Tree4odel conect9ndose a las se=ales que son emitidas por un modelo Tree4odel) Ero'Uc an&edE 3fila modificada8# Ero'U deletedE 3fila eliminada8# Ero'UinsertedE 3fila insertada8# Ero'U asUc ildUto&&ledE 3cam$io de fila tiene descendencia8 y Ero'sUreorderedE 3filas reordenadas8. Estas se=ales son utilizadas por las "istas TreeTie' para se&uir los cam$ios en su modelo Tree4odel. 1i una aplicacin se conecta a estas se=ales es posi$le que se produzcan &rupos de se=ales al llamar al&unos m%todos. Por ejemplo# una llamada para a=adir la primera fila a una fila madre) treestore.append3parent# ^Nq'eN# NasdN# 12;_8 causar9 la emisin de las si&uientes se=ales) Ero'UinsertedE en donde la fila insertada estar9 "ac<a. Ero'U asUc ildUto&&ledE puesto que la fila madre 3 parent8 no ten<a pre"iamente nin&una fila ija. Ero'Uc an&edE para la fila insertada al esta$lecer el "alor Nq'eN en la primera columna. Ero'Uc an&edE para la fila insertada al esta$lecer el "alor Nasd en la se&unda columna.

Ero'Uc an&edE para la fila insertada al esta$lecer el "alor 12; en la tercera columna. ?tese que no es posi$le o$tener el orden de las fila en la retrollamada de Ero'sU reorderedE puesto que el nue"o orden de las filas se pasa como un puntero opaco a un "ector de enteros. Aonsulte el ,anua !e -e+erencia !e Py.)/ para sa$er m9s so$re las se=ales de Tree4odel. 12.!.F. Erdenacin de -ilas de "odelos Tree'odel 12.!.F.1. 7a inter-a4 Tree%ortable 5os o$jetos 5ist1tore y Tree1tore implementan la interfaz Tree1orta$le que les aporta m%todos para controlar la ordenacin de las filas de un modelo Tree4odel. El elemento cla"e de la interfaz es Esort column :@E# que es un "alor entero ar$itrario que est9 referido a una funcin de comparacin de orden y a unos datos asociados de usuario. @ic o identificador de orden de columna de$e ser mayor o i&ual a cero# y se crea utilizando el si&uiente m%todo) treesorta$le.setBsortBfunc3sort_column_id# sort_func# user_dataM?one8 donde sort_column_id es un "alor entero asi&nado por el pro&ramador# sort_func es una funcin o m%todo utilizado para comparar filas y user_data son los datos contextuales. sort_func tiene la si&uiente si&natura) def sortBfuncBfunction3model# iter1# iter2# data8 def sortBfuncBmet od3self# model# iter1# iter2# data8 donde model el el modelo Tree4odel que contiene las filas se=aladas por los iteradores Tree:ter iter e iter! y data es user_data. sort_func de$er<a de"ol"er) U1 si la fila correspondiente a iter de$e preceder a la fila correspondiente a iter!\ 0# si las filas son i&uales\ y# 1 si la fila correspondiente a iter! de$e preceder a la indicada por iter . 5a funcin de comparacin de orden de$er<a presuponer siempre que el orden de clasificacin es ascendente 3&t(.1/0TB-1AE?@:?G8 puesto que el orden de clasificacin ser9 tenido en cuenta por las implementaciones de Tree1orta$le. Puede usarse la misma funcin de comparacin de orden para "arios identificadores de orden de columna# aciendo "ariar los datos de informacin contextual contenidos en user_data. Por ejemplo# los datos user_data especificados en el m%todo setBsortBfunc38 podr<an consistir en los <ndices de las columnas de donde se extraer<an los datos de clasificacin. .na "ez que se a creado un identificador de orden de columna 3sort column :@8 en un almac%n# es posi$le usarla para ordenar los datos llamando al m%todo) treesorta$le.setBsortBcolumnBid3sort.colu"n.id# order8 donde order es el orden de clasificacin# $ien &t(.1/0TB-1AE?@:?G 3ascendente8 o &t(.1/0TB@E1AE?@:?G 3descendente8. .n identificador de orden de columna 3sort_column_id8 de "alor i&ual a U1 indica que el almac%n de$er<a utilizar la funcin de comparacin por defecto que se esta$lece a tra"%s

del m%todo) treesorta$le.setBdefaultBsortBfunc3sort_func# user_dataM?one8 Es posi$le compro$ar si un almac%n tiene una funcin de comparacin por defecto aciendo uso del m%todo) result M treesorta$le. asBdefaultBsortBfunc38 que de"uel"e T0.Esi se a esta$lecido una funcin por defecto para las comparaciones. .na "ez que se a esta$lecido un identificador de orden de columna para un modelo Tree4odel que implementa la interfaz Tree1orta$le este modelo ya no puede "ol"er al estado ori&inal no ordenado. Es posi$le cam$iar su funcin de clasificacin o utilizar la funcin por defecto# pero ya no es posi$le esta$lecer que ese modelo Tree4odel carezca de dic a funcin. 12.!.F.!. Clasi-icacin en al"acenes 7ist%tore y Tree%tore Auando se crea un o$jeto del tipo 5ist1tore o Tree1tore autom9ticamente se esta$lecen identificadores de orden de columna que se corresponden con el n2mero de <ndice de las columnas. Por ejemplo# un almac%n 5ist1tore con tres columnas tendr<an tres identificadores de orden de columna 30# 1# 28 &enerados autom9ticamente. Estos identificadores est9n asociados a una funcin de comparacin interna que maneja los tipos fundamentales) N&$ooleanN str int lon& float

:nicialmente# tanto los almacenes 5ist1tore como los Tree1tore se fijan con un identificador de orden de columna i&ual a U2# que indica que no se utiliza una funcin de ordenacin y que el almac%n no est9 ordenado. .na "ez que se fija un identificador de clasificacin de columna en un 5ist1tore o Tree1tore ya no es posi$le "ol"er a esta$lecerlo al "alor U2. En caso de que se desee mantener los identificadores de orden de columna por defecto se de$e esta$lecer su "alor fuera del ran&o del n2mero de columnas# tal como 1000 o m9s. entonces es posi$le cam$iar entre las funciones de ordenacin por defecto y las de la aplicacin se&2n sea necesario. 12./. Tree$ie(s 8$istas de 5rbol9 .n TreeTie' es fundamentalmente un contenedor de o$jetos de columna TreeTie'Aolumn e int%rpretes de celda Aell0enderer que son los responsa$les de lle"ar a ca$o en 2ltimo t%rmino la "isualizacin de los datos del almac%n de datos. Tam$i%n aporta una interfaz para las filas de datos mostradas y para las caracter<sticas que controlan la "isualizacin de esos datos.

12./.1. Creacin de un Tree$ie( 80ista de 5rbol9 .n TreeTie' se crea utilizando su constructor) tree"ie' M &t(.TreeTie'3"odelM?one8 donde model es un o$jeto que implementa la interfaz Tree4odel 3&eneralmente un 5ist1tore o Tree1tore8. 1i model es ?one o no se especifica# entonces el TreeTie' no estar9 asociado a un almac%n de datos. 12./.!. Ebtencin y estableci"iento del 'odelo de un Tree$ie( El modelo de 9r$ol que proporciona el almac%n de datos de un TreeTie' puede o$tenerse utilizando el m%todo &etBmodel38 ) model M tree"ie'.&etBmodel38 .n Tree4odel puede asociarse simult9neamente con m9s de un TreeTie'# que cam$ia autom9ticamente su "isualizacin en el memento en el que cam$ian los datos del Tree4odel. 4ientras que unTreeTie' siempre muestra todas las filas de su modelo de 9r$ol# permite mostrar selecti"amente al&unas de las columnas. Ello si&nifica que dos TreeTie's asociados al mismo Tree4odel pueden realizar "isualizaciones completamente distintas de los mismos datos. Es tam$i%n importante darse cuenta de que no existe relacin preesta$lecida entre las columnas de un TreeTie' y las columnas de su Tree4odel. Por tanto# la quinta columna de los datos de un Tree4odel pueden mostrarse en la primera columna de un TreeTie' y en la tercera columna de otro. .n TreeTie' puede cam$iar su modelo de 9r$ol utilizando el m%todo setBmodel38 ) tree"ie'.setBmodel3"odelM?one8 donde model es un o$jeto que implementa la interfaz Tree4odel 3p.e. 5ist1tore y Tree1tore8. 1i model es ?one# entonces se descarta el modelo actual. 12././. Be-inicin de las propiedades de un Tree$ie( TreeTie' tiene una serie de propiedades que se pueden &estionar utilizando sus m%todos) Eena$leUsearc E 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 1i es T0.E# el usuario puede acer $2squedas a tra"es de las columnas de forma interacti"a. Por defecto es T0.E 5a columna usada para el elemento de expansin. Por defecto es 0 1i es T0.E# asume que todas las filas tiene la misma altura# lo que acelera la "isualizacin. @isponi$le a partir de GTK! 2.C. Por defecto es 7-51E El control -djustment 3ajuste8 orizontal del control. 1e crea uno nue"o por defecto.

EexpanderU columnE EfixedU ei& tU modeE E adjustmentE

E eadersU clic(a$leE E eadersU"isi$leE EmodelE Ereordera$leE ErulesU intE

Escritura

1i es T0.E# entonces los enca$ezados de las columnas responden a los e"entos de clic(. Por defecto es 7-51E 1i es T0.E# entonces muestra los $otones de enca$ezado de columna. Por defecto es T0.E El modelo del tree "ie'. Por defecto es ?one 1i es T0.E# la "ista es reor&aniza$le. Por defecto es 7-51E 1i es T0.E# entonces indicar al motor de temas que di$uje las filas en colores alternados. Por defecto es 7-51E :ndica la columna del modelo en la que $uscar cuando se ace a tra"%s de cdi&o. Por defecto es U1. El -djustment 3ajuste8 "ertical para el control. 1e crea uno nue"o por defecto.

5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura

Esearc UcolumnE E"adjustmentE

5ecturaU Escritura 5os m%todos correspondientes son)

ena$leBsearc M tree"ie'.&etBena$leBsearc 38 tree"ie'.setBena$leBsearc 3enable.search8 column M tree"ie'.&etBexpanderBcolumn38 tree"ie'.setBexpanderBcolumn3colu"n8 adjustment M tree"ie'.&etB adjustment38 tree"ie'.setB adjustment3ad)ust"ent8 tree"ie'.setB eadersBclic(a$le3acti0e8 eadersB"isi$le M tree"ie'.&etB eadersB"isi$le38 tree"ie'.setB eadersB"isi$le3headers.0isible8 reordera$le M tree"ie'.&etBreordera$le38 tree"ie'.setBreordera$le3reorderable8 rilesB int M tree"ie'.&etBrulesB int38 tree"ie'.setBrulesB int3setting8 column M tree"ie'.&etBsearc Bcolumn38 tree"ie'.setBsearc Bcolumn3colu"n8 "adjustment M tree"ie'.&etB"adjustment38 tree"ie'.setB"adjustment3ad)ust"ent8 5a funcin de la mayor<a de ellos resulta o$"ia por su descripcin. 1in em$ar&o# la

propiedad Eena$leUsearc E necesita que se aya definido correctamente la propiedad Esearc UcolumnE como un n2mero de una columna "9lida del modelo de 9r$ol. Entonces# cuando el usuario o usuaria pulsa Control!- aparece un di9lo&o de $2squeda en el que se puede escri$ir. 1e selecciona la primera fila coincidente a medida que se teclea.. -n9lo&amente# la propiedad E eadersUclic(a$leE realmente solamente fija la propiedad Eclic(a$leE de las columnas TreeTie'Aolumns su$yacentes. .na TreeTie'Aolumn no ser9 ordena$le sal"o que su modelo de 9r$ol implemente la interfaz Tree1orta$le y se aya llamado el m%todo TreeTie'Aolumn setBsortBcolumnBid38 con un n2mero "9lido de columna. 5a propiedad Ereordera$leE permite que usuarios y usuarias reordenen el modelo TreeTie' arrastrando y soltando las filas mostradas del TreeTie'. 5a propiedad ErulesU intE no de$e esta$lecerse sal"o en el caso de tener muc as columnas y cuando resulte 2til mostrarlas con colores alternos. 12.2. $isuali4adores de Celda 8Cell,enderer9 12.2.1. Introduccin 5as columnas de "ista de 9r$ol 3TreeTie'Aolumn8 y los Tisualizadores o :nt%rpretes de Aelda 3Aell0enderer8 cola$oran en la "isualizacin de una columna de datos de una "ista de 9r$ol 3TreeTie'8. 5a clase TreeTie'Aolumn proporciona el t<tulo de columna y un espacio "ertical para que los Aell0enderer muestren una porcin de los datos de los que contiene el almac%n del TreeTie'. .n Aell0enderer maneja la "isualizacin de los datos de cada fila y columna dentro de los confines de una TreeTie'Aolumn. .na TreeTie'Aolumn puede contener m9s de un Aell0enderer para proporcionar una "isualizacin de fila similar a la de una +Fox. .n uso a$itual con m2ltiples Aell0enderer es la com$inacin de un Tisualizador de :m9&enes en Aelda 3Aell0endererPix$uf8 y un Tisuallizador de Texto en Aelda 3Aell0endererText8 en la misma columna. El ejemplo Figura 1(.0, )ree#ie*%o umns con %e -en!erers muestra un ejemplo que ilustra la composicin de dos TreeTie'Aolumn# una con dos Aell0enderer y la otra con uno slo) #igura 12.!. Tree$ie(Colu"ns con Cell,enderers

5a aplicacin de cada Aell0enderer se indica mediante un color de fondo diferenciado) amarillo en el caso de un Aell0endererPix$uf# cian para un Aell0endererText# y rosa para el otro Aell0endererText. +ay que resaltar que el Aell0endererPix$uf y el primer Aell0endererText est9n en la misma columna# enca$ezada con el texto EPix$uf and TextE. El color de fondo del Aell0endererText que muestra EPrint 7ileE es el color predeterminado que muestra el 9rea de la aplicacin en una fila. Figura 1(.0, )ree#ie*%o umns tree0ie(colu"n.py. con %e -en!erers se cre con el pro&rama

12.2.!. Tipos de $isuali4adores Cell,enderer El tipo del Aell0enderer que se necesita para cada caso "iene determinado por el tipo de

"isualizacin requerida por los datos del modelo de 9r$ol usado. PyGTK posee tres Aell0enderer predefinidos) Aell0endererPix$uf "isualiza im9&enes de p<xeles 3pix$uf8 que pueden a$er sido creadas por el pro&rama# o tratarse de una ima&en de serie predefinida. "isualiza cadenas de texto# as< como n2meros que pueden ser con"ertidos en cadenas 3enteros# reales y $ooleanos incluidos8. "isualiza un "alor $ooleano como un $otn $iestado o como un $otn de exclusin

Aell0endererText Aell0endererTo&&le

12.2./. Propiedade de un Cell,enderer 5as propiedades de un Aell0enderer determinan la forma en que se "isualizar9n los datos) EmodeE 5ecturaU Escritura El modo de edicin del Aell0enderer. Es uno de estos) &t(.AE55B0E?@E0E0B4/@EB:?E0T 3inerte8# &t(.AE55B0E?@E0E0B4/@EB-AT:T-T-F5E 3acti"a$le8 o &t(.AE55B0E?@E0E0B4/@EBE@:T-F5E 3edita$le8 1i es T0.E se muestra la celda. 5a fraccin de espacio libre a la izquierda de la celda dentro del inter"alo 0.0 a 1.0. 5a fraccin de espacio libre so$re la celda dentro del inter"alo 0.0 a 1.0. 5a cantidad de mar&en a la derec a e izquierda de la celda. 5a cantidad de mar&en so$re y $ajo la celda. 5a anc ura fija de la celda. 5a altura fija de la celda. 1i es T0.E la fila tiene descendientes 3 ijas8 1i es T0.E la fila tiene descendientes y se expande para mostrarlas. El color de fondo de la celda indicada como cadena. El color de fondo indicado como &t(.&d(.Aolor.

E"isi$leE Exali&nE Eyali&nE ExpadE EypadE E'idt E E ei& tE EisUexpanderE EisUexpandedE EcellU$ac(&roundE EcellU$ac(&roundU &d(E

5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura Escritura 5ecturaU Escritura

EcellU$ac(&roundU 5ecturaU 1i es T0.E el color de fondo de la celda lo setE Escritura determina este "isualizador 5as propiedades anteriores est9n disponi$les para todas las su$clases de Aell0enderer. Pero los distintos tipos de Aell0enderer tam$i%n tienen propiedades exclusi"as. 5os Aell0endererPix$uf tienen estas propiedades) Epix$ufE Epix$ufUexpanderU openE Epix$ufUexpanderU closedE Estoc(UidE Estoc(UsizeE Estoc(UdetailE 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 0eadU>rite El pix$uf que se "isualizar9 3es anulada por Estoc(UidE8 Pix$uf para desple&ado. el expansor cuando est9

Pix$uf para el expansor cuando est9 cerrado. El stoc( :@ del icono de serie que se "isualizar9. El tama=o del icono representado.

5ecturaU @etalle de "isualizacin que se proporcionar9 al Escritura motor de temas. 5os Aell0endererText tienen un &ran n2mero de propiedades que tratan fundamentalmente con la especificacin de estilos) EtextE Emar(upE Eattri$utesE E$ac(&roundE Efore&roundE E$ac(&roundU&d(E Efore&roundU&d(E EfontE EfontUdescE EfamilyE EstyleE E"ariantE 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura Escritura Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Texto que se "isualizar9. Texto con marcas que se "isualizar9. .na lista de atri$utos de estilo que se aplicar9n al texto del "isualizador. Aolor de fondo# como cadena de texto. Aolor de primer plano# como cadena de texto. Aolor de fondo# como &t(.&d(.Aolor Aolor de primer plano# como &t(.&d(.Aolor @escripcin de la fuente# como cadena de texto. @escripcin de pan&o.7ont@escription. la fuente# como

?om$re de la familia de la fuente# p.e. 1ans# +el"etica# Times# 4onospace. Estilo de fuente. Tariante de la fuente.

Escritura E'ei& tE Estretc E EsizeE EsizeUpointsE EscaleE Eedita$leE Estri(et rou& E EunderlineE EriseE Elan&ua&eE 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura Peso de la fuente. Estirado de la fuente. Tama=o de la fuente. Tama=o de la fuente en puntos. 7actor de escala de la fuente. 1i es T0.E el texto puede ser cam$iado por el usuario. 1i es T0.E se tac a el texto Estilo de su$rayado del texto. Ele"acin del texto por encima de la l<nea $ase 3o por de$ajo si el "alor es ne&ati"o8 El idioma del texto# como cdi&o :1/. Pan&o puede utilizarlo como pista al representar el texto. 1i no se entiende este par9metro... pro$a$lemente es que no se necesita. 1olamente disponi$le a partir de GTK! 2.C. 1i es T0.E# se deja todo el texto en un 2nico p9rrafo. 1olamente disponi$le a partir de GTK! 2.C. 1i es T0.E se aplica el color de fondo. 1i es T0.E se aplica el color de primer plano. 1i es T0.E se aplica la familia de la fuente. 1i es T0.E se aplica el estilo de la fuente. 1i es T0.E se aplica la "ariante de la fuente. 1i es T0.E se aplica el peso de la fuente. 1i es T0.E se aplica el estirado de la fuente. 1i es T0.E se aplica el tama=o de fuente.

Esin&leUpara&rap U modeE E$ac(&roundU setE

5ecturaU Escritura

5ecturaU Escritura

Efore&roundUsetE 5ecturaU Escritura EfamilyUsetE EstyleUsetE E"ariantUsetE E'ei& tUsetE Estretc UsetE EsizeUsetE 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU

Escritura EscaleUsetE Eedita$leUsetE Estri(et rou& U setE EunderlineUsetE EriseUsetE Elan&ua&eUsetE 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura 5ecturaU Escritura si es T0.E se escala la fuente. 1i es T0.E se aplica la edita$ilidad del texto. 1i es T0.E se aplica el tac ado. 1i es T0.E se aplica el su$rayado de texto. 1i es T0.E se aplica la ele"acin del texto.

5ecturaU 1i es T0.E se aplica el idioma usado para mostrar el Escritura texto. - partir de GTK! 2.C. Aasi cada una de las propiedades de Aell0endererText posee una propiedad $ooleana asociada 3con el suffijo EUsetE8 que indica si se aplica dic a propiedad. Esto permite fijar &lo$almente una propiedad y acti"ar o desacti"ar su aplicacin selecti"amente. 5os Aell0endererTo&&le poseen las si&uientes propiedades) Eacti"ata$le 5ecturaU E Escritura Eacti"eE EradioE 5ecturaU Escritura 5ecturaU Escritura 1i es T0.E# el $otn $iestado se puede acti"ar. 1i es T0.E# el $otn est9 acti"o. 1i es T0.E# se di$uja el $otn como un $otn de exclusin.

Einconsisten 5ecturaU 1i es T0.E# el $otn est9 en un estado inconsistente. tE Escritura partir de GTK! 2.2. 5as propiedades se pueden fijar para todas las filas utilizando el m%todo &o$ject.setBproperty38. T%ase el pro&rama tree0ie(colu"n.py como ejemplo del uso de este m%todo. 12.2.2. 3tributos de un Cell,enderer .n atri$uto asocia una columna de un modelo de 9r$ol a una propiedad de un Aell0enderer. El Aell0enderer fija la propiedad en funcin del "alor de una columna de la fila antes de representar la celda. Esto permite personalizar la "isualizacin de la celda utilizando los datos del modelo de 9r$ol. 1e puede a=adir un atri$uto al conjunto actual con) tree"ie'column.addBattri$ute3cell.renderer# attribute# colu"n8 donde la propiedad especificada por attribute se fija para el cell_renderer en la columna column. Por ejemplo) tree"ie'column.addBattri$ute3cell# EcellU$ac(&roundE# 18

esta$lece el fondo del Aell0enderer al color indicado por la cadena de la se&unda columna del almac%n de datos. Para eliminar todos los atri$utos y esta$lecer "arios atri$utos nue"os de una "ez se usa) tree"ie'column.setBattri$utes3cell_renderer# ...8 donde los atri$utos de cell_renderer se determinan mediante pares cla"eU"alor) propiedadMcolumna. Por ejemplo# en el caso de un Aell0endererText) tree"ie'column.setBattri$utes3cell# textM0# cellB$ac(&roundM1# xpadM;8 indica# para cada fila# el texto en la primera columna# el color de fondo en la se&unda y el mar&en orizontal desde la cuarta columna. T%ase el pro&rama tree0ie(colu"n.py para "er ejemplos del uso de estos m%todos. 5os atri$utos de un Aell0enderer se pueden limpiar utilizando) tree"ie'column.clearBattri$utes3cell.renderer8 12.2.;. #uncin de Batos de Celda 1i no es suficiente el uso de atri$utos para cu$rir nuestras necesidades# tam$i%n es posi$le indicar una funcin que ser9 llamada en cada fila y que determine las propiedades del Aell0enderer utilizando) tree"ie'column.setBcellBdataBfunc3cell_renderer# func# dataM?one8 donde func tiene la si&natura) def func3column# cellBrenderer# treeBmodel# iter# userBdata8 donde column es la TreeTie'Aolumn que contiene el "isualizador cell_renderer# tree_model es el almac%n de datos e iter es un iterador Tree:ter que apunta a una fila en tree_model. user_data es el "alor de data que se pas a setBcellBdataBfunc38. En func se esta$lecen las propiedades que se deseen para cell_renderer. Por ejemplo# el si&uiente fra&mento de cdi&o esta$lece la propiedad de texto de manera que muestre los o$jetos de PyGTK como una cadena de identificacin :@. ... def o$jBidBstr3tree"ie'column# cellBrenderer# model# iter8) pyo$j M model.&etB"alue3iter# 08 cell.setBproperty3NtextN# str3pyo$j88 return ... treestore M &t(.Tree1tore3o$ject8 'in M &t(.>indo'38 tree"ie' M &t(.TreeTie'3treestore8 'in.add3tree"ie'8 cell M Aell0endererText38 t"column M &t( TreeTie'Aolumn3N/$ject :@N# cell8

tree"ie'.appendBcolumn3t"column8 iter M treestore.append3?one# ^'in_8 iter M treestore.append3iter# ^tree"ie'_8 iter M treestore.append3iter# ^t"column_8 iter M treestore.append3iter# ^cell_8 iter M treestore.append3?one# ^treestore_8 ... El resultado de$er<a ser al&o como Figura 1(.1, Funcin !e 2atos !e %e !a) #igura 12./. #uncin de Batos de Celda

/tro posi$le uso de la funcin de datos de celda es el control del formato de "isualizacin de un texto num%rico# p.e. un "alor real. .n Aell0endererText ar9 una con"ersin de forma autom9tica del "alor real a una cadena# pero con el formato predeterminado E`fE. Aon funciones de datos de celda se pueden &enerar incluso los datos de las celdas a partir de datos externos. Por ejemplo# el pro&rama -ilelisting.py usa un almac%n 5ist1tore con una 2nica columna que contiene una lista de nom$res de arc i"os. 5a TreeTie' muestra columnas que incluyen una ima&en pix$uf# el nom$re de arc i"o y su tama=o# modo y fec a del 2ltimo cam$io. 5os datos son &enerados por las si&uientes funciones de datos de celda) def fileBpix$uf3self# column# cell# model# iter8) filename M os.pat .join3self.dirname# model.&etB"alue3iter# 088 filestat M statcac e.stat3filename8 if stat.1B:1@:03filestat.stBmode8) p$ M folderp$ else) p$ M filep$ cell.setBproperty3Npix$ufN# p$8 return def fileBname3self# column# cell# model# iter8) cell.setBproperty3NtextN# model.&etB"alue3iter# 088 return def fileBsize3self# column# cell# model# iter8) filename M os.pat .join3self.dirname# model.&etB"alue3iter# 088 filestat M statcac e.stat3filename8 cell.setBproperty3NtextN# filestat.stBsize8 return def fileBmode3self# column# cell# model# iter8) filename M os.pat .join3self.dirname# model.&etB"alue3iter# 088 filestat M statcac e.stat3filename8 cell.setBproperty3NtextN# oct3stat.1B:4/@E3filestat.stBmode888

return def fileBlastBc an&ed3self# column# cell# model# iter8) filename M os.pat .join3self.dirname# model.&etB"alue3iter# 088 filestat M statcac e.stat3filename8 cell.setBproperty3NtextN# time.ctime3filestat.stBmtime88 return Estas funciones o$tienen la informacin de los arc i"os utilizando el nom$re# extraen los datos necesarios y esta$lecen las propiedades de celda NtextN o Npix$ufN con los datos. Figura 1(.(, Ejemp o !e 3ista!o !e Arc'i&os 4ti i5an!o Funciones !e 2atos !e %e !a muestra el pro&rama de ejemplo en accin) #igura 12.2. E)e"plo de 7istado de 3rchi0os :tili4ando #unciones de Batos de Celda

12.2.>. Eti6uetas de 'arcado en Cell,endererText .n Aell0endererText puede utilizar etiquetas de marcado de Pan&o 3esta$leciendo la propiedad Emar(upE8 en "ez de una cadena de texto sencilla para codificar di"ersos atri$utos de texto y proporcionar una "isualizacin rica# con m2ltiples cam$ios de estilos de fuente. T%ase la referencia Pango ,ar6up en el ,anua !e -e+erencia !e Py.)/ para o$tener m9s detalles so$re el len&uaje de marcado de Pan&o. El si&uiente fra&mento de cdi&o ilustra el uso de la propiedad Emar(upE) ... liststore M &t(.5ist1tore3str8 cell M &t(.Aell0endererText38 t"column M &t(.TreeTie'Aolumn3NPan&o 4ar(upN# cell# mar(upM08 ... liststore.append3^Ngspan fore&roundME$lueELg$LPan&ogG$LgGspanL mar(up canN N c an&eangiLstylegGiL g$i&LsizegG$i&L# guLunderline#N gsLstri(et rou& gGsLgGuL#anN Nand gspan fontBfamilyME.0> A ancery 5ELg$i&Lfont family N Ne.&. .0> A ancery 5gG$i&LgGspanLangspan fore&roundMEredELredN N fore&round and gspan $ac(&roundMEcyanELcyan $ac(&roundgGspanLgGspanLN_8 ... produce un resultado semejante a Figura 1(.7, Etiquetas !e ,arca!o para %e -en!erer)ext) #igura 12.;. Eti6uetas de 'arcado para Cell,endererText

1i se crean etiquetas de marcado so$re la marc a es preciso tener cuidado y sustituir los caracteres con especial si&nificado en el len&uaje de marcas) EgE# ELE# EhE. 5a funcin de la

$i$lioteca de Pyt on c&i.escape38 permite acer estas con"ersiones $9sicas. 12.2.@. Celdas de Texto Editables 5as celdas Aell0endererText pueden acerse edital$es de forma que una usuaria pueda editar los contenidos de la celda que seleccione aciendo clic en ella o pulsando las teclas ,eturn# Enter# %pace o %hi-t!%pace. 1e ace edita$le un Aell0endererText en todas sus filas esta$leciendo su propiedad Eedita$leE a T0.E de la si&uiente manera) cellrenderertext.setBproperty3Nedita$leN# True8 1e pueden esta$lecer indi"idualmente celdas edita$les a=adiendo un atri$uto a la TreeTie'Aolumn utilizando un Aell0endererText parecido a) tree"ie'column.addBattri$ute3cellrenderertext# Eedita$leE# 28 que esta$lece que el "alor de la propiedad Eedita$leE se indica en la tercera columna del almac%n de datos. .na "ez que la edicin de la celda termina# la aplicacin de$e &estionar la se=al EeditedE para o$tener el nue"o texto y esta$lecer los datos asociados del almac%n de datos. @e otro modo# el "alor de la celda recuperar9 su "alor inicial. 5a si&natura del manejador de llamada de la se=al EeditedE es) def editedBc$3cell# path# new_text# user_data8 donde cell es el Aell0endererText# path es el camino de 9r$ol 3como cadena8 a la fila que contiene la celda editada# new_text es el texto editado y user_data son datos de contexto. Puesto que se necesita el Tree4odel para usar el camino path y esta$lecer new_text en el almac%n de datos# pro$a$lemente se quiera pasar el Tree4odel como user_data en el m%todo connect38) cellrenderertext.connect3NeditedN# editedBc$# model8 1i se tienen dos o m9s celdas edita$les en una fila# se podr<a pasar el n2mero de columna del Tree4odel como parte de los datos adicionales user_data as< como el modelo Tree4odel) cellrenderertext.connect3NeditedN# editedBc$# 3model# colBnum88 -s<# se puede esta$lecer el nue"o texto en el manejador de la se=al EeditedE de una forma parecida al si&uiente ejemplo que usa un almac%n de lista 5ist1tore) def editedBc$3cell# pat # ne'Btext# userBdata8) liststore# column M userBdata liststore^pat _^column_ M ne'Btext return 12.2.A. Celdas =iestado 3cti0ables 5os $otones de Aell0endererTo&&le se pueden acer acti"a$les esta$leciendo la propiedad

Eacti"ata$leE como T0.E. @e forma parecida a la celdas edita$les de Aell0endererText la propiedad Eacti"ata$leE se puede fijar para un conjunto completo de celdas con Aell0endererTo&&le utilizando el m%todo setBproperty38 o indi"idualmente en al&unas celdas a=adiendo un atri$uto a la columna TreeTie'Aolumn que contiene el Aell0endererTo&&le. cellrendererto&&le.setBproperty3Nacti"ata$leN# True8 tree"ie'column.addBattri$ute3cellrendererto&&le# Eacti"ata$leE# 18 5a creacin de $otones indi"iduales $iestado se puede deducir de los "alores de una columna de un Tree4odel a=adiendo un atri$uto de manera similar a este ejemplo) tree"ie'column.addBattri$ute3cellrendererto&&le# Eacti"eE# 28 1e de$e conectar a la se=al Eto&&ledE para disponer de notificacin de las pulsaciones del usuario en los $otones $iestado# de manera que la aplicacin pueda modificar los "alores del almac%n de datos. Por ejemplo) cellrendererto&&le.connect3Eto&&ledE# to&&ledBc$# 3model# column88 5a retrollamada tiene la si&natura) def to&&ledBc$3cellrenderertoggle# path# user_data8 donde path es el camino de 9r$ol# como cadena# que apunta a la fila que contiene el $otn $iestado que a sido pulsado. Es recomenda$le pasar el Tree4odel y# tal "ez# el <ndice de la columna como parte de los datos de usuario user_data para proporcionar el contexto necesario para esta$lecer los "alores del almac%n de datos. Por ejemplo# la aplicacin puede conmutar los "alores del almac%n de datos# as<) def to&&ledBc$3cell# pat # userBdata8) model# column M userBdata model^pat _^column_ M not model^pat _^column_ return 1i la aplicacin desea mostrar los $otones $iestado como $otones de exclusin y que 2nicamente uno de ellos est% acti"o# tendr9 que recorrer los datos del almac%n para desacti"ar el $otn de exclusin acti"o y posteriormente acti"ar el $otn $iestado. Por ejemplo) def to&&ledBc$3cell# pat # userBdata8) model# column M userBdata for ro' in model) ro'^column_ M 7alse model^pat _^column_ M True return usa la estrate&ia E"a&aE de poner todos los "alores a 7-51E antes de fijar el "alor T0.E en la fila especificada en path.

12.2.F. Progra"a de E)e"plo de Celda Editable and 3cti0able El pro&rama ce ren!erer.py ilustra la utilizacin de celdas Aell0endererText edita$les y de celdas Aell0endererTo&&le acti"a$les en un almac%n Tree1tore. 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC QPGusrG$inGen" pyt on Q "im) tsMC)s'MC)t'MRS)no'rap EEE @emonstration usin& edita$le and acti"ata$le Aell0enderers EEE import py&t( py&t(.require3E2.0E8 import &t(# &o$ject tas(s M j EFuy &roceriesE) EGo to -sda after 'or(E# E@o some pro&rammin&E) E0emem$er to update your soft'areE# EPo'er up systemsE) ETurn on t e client $ut lea"e t e ser"erE# E>atc some t"E) E0emem$er to catc E0E k class G.:BAontroller) EEE T e G.: class is t e controller for our application EEE def BBinitBB3self8) Q esta$lecer la "entana principal self.root M &t(.>indo'3typeM&t(.>:?@/>BT/P5ETE58 self.root.setBtitle3EAell0enderer ExampleE8 self.root.connect3EdestroyE# self.destroyBc$8 Q /$tener el modelo y "incularlo a la "ista self.mdl M 1tore.&etBmodel38 self."ie' M @isplay.ma(eB"ie'3 self.mdl 8 Q -=adir la "ista a la "entana principal self.root.add3self."ie'8 self.root.s o'Ball38 return def destroyBc$3self# Z('8) EEE @estroy call$ac( to s utdo'n t e app EEE &t(.mainBquit38 return def run3self8) EEE run is called to set off t e GTK mainloop EEE &t(.main38 return class :nfo4odel) EEE T e model class olds t e information 'e 'ant to display EEE def BBinitBB3self8) EEE 1ets up and populates our &t(.Tree1tore EEE self.treeBstore M &t(.Tree1tore3 &o$ject.T[PEB1T0:?G# &o$ject.T[PEBF//5E-? 8 Q colocar los datos &lo$ales de la &ente en la lista

CJ Q formamos un 9r$ol simple. CI for item in tas(s.(eys38) CR parent M self.treeBstore.append3 ?one# 3item# ?one8 8 CS self.treeBstore.append3 parent# 3tas(s^item_#?one8 8 CD return J0 def &etBmodel3self8) J1 EEE 0eturns t e model EEE J2 if self.treeBstore) J; return self.treeBstore JC else) JJ return ?one JI JR class @isplay4odel) JS EEE @isplays t e :nfoB4odel model in a "ie' EEE JD def ma(eB"ie'3 self# model 8) I0 EEE 7orm a "ie' for t e Tree 4odel EEE I1 self."ie' M &t(.TreeTie'3 model 8 I2 Q confi&uramos el "isualizador de celda de texto y permitimos I; Q la edicin de las celdas. IC self.renderer M &t(.Aell0endererText38 IJ self.renderer.setBproperty3 Nedita$leN# True 8 II self.renderer.connect3 NeditedN# self.col0BeditedBc$# model 8 IR IS Q 1e confi&ura el "isualizador de $otones $iestado y permitimos que se ID Q pueda cam$iar por el usuario. R0 self.renderer1 M &t(.Aell0endererTo&&le38 R1 self.renderer1.setBproperty3Nacti"ata$leN# True8 R2 self.renderer1.connect3 Nto&&ledN# self.col1Bto&&ledBc$# model 8 R; RC Q Aonectamos la columna 0 de la "isualizacin con la columna o de nuestro modelo RJ Q El "isualizador mostrar9 lo que aya en la columna 0 RI Q de nuestro modelo. RR self.column0 M &t(.TreeTie'Aolumn3E?ameE# self.renderer# textM08 RS RD Q El estado de acti"acin del modelo se "incula a la se&unda columna S0 Q del modelo. -s<# cuando el modelo dice True entonces el $otn S1 Q se mostrar9 acti"o# es decir# encendido. S2 self.column1 M &t(.TreeTie'Aolumn3EAompleteE# self.renderer1 8 S; self.column1.addBattri$ute3 self.renderer1# Eacti"eE# 18 SC self."ie'.appendBcolumn3 self.column0 8 SJ self."ie'.appendBcolumn3 self.column1 8 SI return self."ie' SR def col0BeditedBc$3 self# cell# pat # ne'Btext# model 8) SS EEE SD Aalled ' en a text cell is edited. :t puts t e ne' text D0 in t e model so t at it is displayed properly. D1 EEE D2 print EA an&e N`sN to N`sNE ` 3model^pat _^0_# ne'Btext8 D; model^pat _^0_ M ne'Btext DC return

DJ def col1Bto&&ledBc$3 self# cell# pat # model 8) DI EEE DR 1ets t e to&&led state on t e to&&le $utton to true or false. DS EEE DD model^pat _^1_ M not model^pat _^1_ 100 print ETo&&le N`sN to) `sE ` 3model^pat _^0_# model^pat _^1_#8 101 return 102 10; if BBnameBB MM NBBmainBBN) 10C 1tore M :nfo4odel38 10J @isplay M @isplay4odel38 10I myG.: M G.:BAontroller38 10R myG.:.run38 El pro&rama proporcional celdas edita$les en la primera columna y celdas acti"a$les en la se&unda columna. 5as l<neas ICUII crean un Aell0endererText edita$le y conectan la se=al EeditedE a la retrollamada col0BeditedBc$38 3l<neas SRUDC8# que cam$ia el "alor en la columna correspondiente de la fila en el almac%n de 9r$ol Tree1tore. @e la misma manera# las l<neas R0UR2 crean un Aell0endererTo&&le acti"a$le y conectan la se=al Eto&&ledE a la retrollamada col1Bto&&ledBc$38 3l<neas DJU1018 para cam$iar el "alor de la fila correspondiente. Auando se modifica una celada edita$le o acti"a$le se muestra un mensaje para indicar cu9l a sido el cam$io. Figura 1(.6, %e !as E!ita8 es y Acti&a8 es ilustra el pro&rama ce ren!erer.py en ejecucin. #igura 12.>. Celdas Editables y 3cti0ables

12.;. Tree$ie(Colu"ns 8colu"nas de 0ista de 5rbol9 12.;.1. Creacin de Tree$ie(Colu"ns 8colu"nas de 0ista de 5rbol9 .na TreeTie'Aolumn se crea usando el constructor) tree"ie'column M &t(.TreeTie'Aolumn3titleM?one# cell_renderer#$one# ...8 donde title es la cadena que ser9 usada como etiqueta en el enca$ezado de la columna# y cell_renderer es el primer Aell0enderer que se empaqueta en la columna. 5os ar&umentos adicionales que esta$lecen los atri$utos de cell_renderer se pasan al constructor como "alores con nom$re 3en el formato atri$utoMcolumna8. Por ejemplo) tree"ie'column M &t(.TreeTie'Aolumn3N1tatesN# cell# textM0# fore&roundM18 crea una TreeTie'Aolumn en el que el Aell0endererText llamado cell o$tiene su texto de la primera columna del modelo de 9r$ol y el color del texto de la se&unda columna. 12.;.!. Gestin de los Cell,enderers 8IntCrpretes de celda9 1e puede a=adir un Aell0enderer 3int%rprete de celda8 a una TreeTie'Aolumn usando uno

de los si&uientes m%todos) tree"ie'column.pac(Bstart3cell# expand8 tree"ie'column.pac(Bend3cell# expand8 pac(Bstart38 y pac(Bend38 a=aden cell al principio o final# respecti"amente# de la TreeTie'Aolumn. 1i expand es T0.E# cell compartir9 el espacio disponi$le extra que aya reser"ado la TreeTie'Aolumn. El m%todo &etBcellBrenderers38 ) cellBlist M tree"ie'column.&etBcellBrenderers38 de"uel"e una lista de todos los Aell0enderers de una columna. El m%todo clear38 elimina todos los atri$utos de Aell0enderer de la columna TreeTie'Aolumn) tree"ie'column.clear38 +ay muc os otros m%todos disponi$les para una TreeTie'Aolumn 3y la mayor<a tienen que "er con el esta$lecimiento y o$tencin de propiedades. T%ase el ,anua !e -e+erencia !e Py.)/ para o$tener m9s informacin so$re las propiedades de TreeTie'Aolumn. 5a capacidad de usar la caracter<stica incluida de ordenacin se determina con el m%todo) tree"ie'column.setBsortBcolumnBid3sort.colu"n.id8 que esta$lece sort_column_id como el identificador 3:@8 de columna de ordenacin del modelo de 9r$ol que se usar9 cuando se ordene la "ista del TreeTie'. Este m%todo tam$i%n esta$lece la propiedad Eclic(a$leE de la columna# lo que permite al usuario acer clic( so$re en enca$ezado de la columna para acti"ar la ordenacin. Auando se ace clic( en el enca$ezado de la columna el identificador 3:@8 de columna de ordenacin de la TreeTie'Aolumn se esta$lece como identificador de columna de ordenacin del Tree4odel y las filas del Tree4odel son reordenadas utilizando la funcin de comparacin asociada. 5a erramienta de ordenacin autom9tica tam$i%n conmuta el orden de clasificacin de la columna y &estiona la "isualizacin del indicador de orden. T%ase la seccin 9r!enacin !e as +i as !e un ,o!e o !e :r8o para o$tener m9s informacin so$re los identificadores de columna de ordenacin y funciones de comparacin. +a$itualmente# cuando se usa un 5ist1tore o Tree1tore el identificador de columna de ordenacin por defecto 3el <ndice de la columna8 de la columna del Tree4odel asociada con la TreeTie'Aolumn se esta$lece como el identificador de columna de ordenacin de la TreeTie'Aolumn. 1i se usan los enca$ezados de las TreeTie'Aolumns para acer la ordenacin# entonces si se utiliza el m%todo setBsortBcolumnBid38 no es necesario utilizar el m%todo Tree1orta$lesetBsortBcolumnBid38 . 1e pueden rastrear las operaciones de ordenacin o utilizar el clic( so$re los enca$ezados para propsitos espec<ficos conect9ndose a la se=al Eclic(edE de la columna de un TreeTie'. 5a funcin de retrollamada de$er<a definirse as<) def call$ac(3tree"ie'column# userBdata# ...8

12.>. 'anipulacin de Tree$ie(s 12.>.1. Gestin de las Colu"nas 5as TreeTie'Aolumns de un TreeTie' pueden o$tenerse indi"idualmente o como una lista utilizando los m%todos) tree"ie'column M tree"ie'.&etBcolumn3n8 columnlist M tree"ie'.&etBcolumns38 donde n es el <ndice 3empezando desde 08 de la columna que se quiere o$tener. 1e puede eliminar una columna con el m%todo) tree"ie'.remo"eBcolumn3colu"n8 donde column es una TreeTie'Aolumn en treeview. 5as filas que tienen filas ijas se muestran en el TreeTie' con una flec a de expansin Figura 1(.1, Funcin !e 2atos !e %e !a8 que se puede pulsar para ocultar o mostrar las filas ijas. 5a columna en la que se muestra la flec a de expansin puede cam$iarse utilizando el m%todo) tree"ie'.setBexpanderBcolumn3colu"n8 donde column es una TreeTie'Aolumn en tree"ie'. Este m%todo es 2til cuando no se desea que se indente la primera columna. Por ejemplo# Figura 1(.", F ec'a !e Expansin en a segun!a %o umna ilustra la flec a de expansin en la se&unda columna) #igura 12.@. #lecha de Expansin en la segunda Colu"na

12.>.!. Expansin y Contraccin de #ilas &i)as Todas las filas mostradas en un TreeTie' pueden ser expandidas o contra<das desde un pro&rama utilizando los m%todos si&uientes) tree"ie'.expandBall38 tree"ie'.collapseBall38 Estos m%todos son 2tiles si se quiere inicializar la "isualizacin del TreeTie' en un estado determinado. 5as filas indi"iduales pueden ser expandidas o contra<das utilizando) tree"ie'.expandBro'3path# open.all8 tree"ie'.collapseBro'3path8 donde path es el camino de 9r$ol a una fila en tree"ie'# y si open_all es T0.E# entonces todas las filas descendientes de path son expandidas\ en otro caso# 2nicamente son expandidas las descendientes inmediatas. 1e puede determinar si una fila se expande utilizando el m%todo)

isBexpanded M tree"ie'.ro'Bexpanded3path8 12.@. %e+ales de Tree$ie( 5os controles TreeTie' emiten un &ran n2mero de se=ales que se pueden usar para se&uir los cam$ios en la "isualizacin del modelo. las se=ales caen &eneralmente en una de las si&uientes cate&or<as) expansin y contraccin de filas) Ero'UcollapsedE# Ero'UexpandedE# EtestUcollapseU ro'E# EtestUexpandUro'E y EexpandUcollapseUcursorUro'E el cursor) EcursorUc an&edE# EexpandUcollapseUcursorUro'E# Emo"eUcursorE# EselectU cursorUparentE# EselectUcursorUro'E y Eto&&leUcursorUro'E seleccin) EselectUallE# EselectUcursorUparentE# EselectUcursorUro'E y EunselectUallE. "arios) EcolumnsUc an&edE# Ero'Uacti"atedE# EsetUscrollUadjustmentsE y EstartU interacti"eUsearc E. 5as se=ales EtestUcollapseUro'E y EtestUexpandUro'E son emitidas antes de que se contrai&a o expanda una fila. El "alor de"uelto por la retrollamada puede permitir o cancelar la operacin 3T0.E para permitirla y 7-51E para cancelarla. def call$ac(3tree"ie'# iter# pat # userBdata8 donde iter es un Tree:ter y path es un camino de 9r$ol que apunta a la fila y user_data son los datos especificados en el m%todo connect38 . 5a se=al Ero'Uacti"atedE se emite cuando se produce un do$le clic( en una fila o cuando se selecciona una fila no edita$le y se pulsa una de las si&uientes teclas) Espacio# %hi-t!Espacio# ,eturn o Enter. El resto de las se=ales se emiten tras a$er cam$iado el TreeTie'. El cursor es la fila marcada por una caja. En la mayor<a de los casos la seleccin se mue"e cuando se mue"e el cursor. El cursor se puede mo"er de forma independiente mediante Control!3ba)o o Control!3rriba y otras com$inaciones de teclas. T%ase el 4anual de 0eferencia de PyGTK para o$tener m9s informacin so$re las se=ales de TreeTie'. 12.A. %elecciones Tree%elections 12.A.1. Ebtencin de Tree%election 5as Tree1elections son o$jetos que &estionan las selecciones en un TreeTie'. Auando se crea un TreeTie' tam$i%n se crea autom9ticamente una Tree1election. Puede o$tenerse la Tree1election de una TreeTie' utilizando el m%todo) treeselection M tree"ie'.&etBselection38 1e puede o$tener el TreeTie' asociado a una Tree1election con el m%todo) tree"ie' M treeselection.&etBtree"ie'38

12.A.!. 'odos de una seleccin Tree%election .na seleccin Tree1election soporta los si&uientes modos de seleccin) &t(.1E5EAT:/?B?/?E ?o se permite acer una seleccin. &t(.1E5EAT:/?B1:?G5E 1e permite una 2nica seleccin aciendo clic(. &t(.1E5EAT:/?BF0/>1 1e permite una 2nica seleccin na"e&ando con el puntero. E &t(.1E5EAT:/?B4.5T:P5 1e pueden seleccionar m2ltiples elementos de una "ez. E 1e puede o$tener el modo actual de seleccin llamando al m%todo) mode M treeselection.&etBmode38 El modo puede esta$lecerse utilizando) treeselection.setBmode3"ode8 donde mode es uno de los modos pre"iamente indicados. 12.A./. Ebtencin de la %eleccin El m%todo que es necesario usar par o$tener la seleccin depende del modo actual de seleccin. 1i el modo de seleccin es &t(.1E5EAT:/?B1:?G5E o &t(.1E5EAT:/?BF0/>1E# se de$e usar el si&uiente m%todo) 3model# iter8 M treeselection.&etBselected38 que de"uel"e una tupla de dos elementos que contiene model# el Tree4odel usado por el TreeTie' asociado con treeselection e iter# un iterador Tree:ter que apunta a la fila seleccionada. 1i no ay una fila seleccionada entonces iter es ?one. 1i el modo de seleccin es &t(.1E5EAT:/?B4.5T:P5E se produce una excepcin TypeError. 1i se tiene una TreeTie' que utiliza el modo de seleccin &t(.1E5EAT:/?B4.5T:P5E entonces se de$er<a usar el m%todo) 3model# pat list8 M treeselection.&etBselectedBro's38 que de"uel"e una tupla de dos elementos que contiene el modelo de 9r$ol y una lista de los caminos de 9r$ol de las filas seleccionadas. Este m%todo no est9 disponi$le en PyGTK 2.0# por lo que es necesario utilizar una funcin auxiliar para o$tener la lista mediante) treeselection.selectedBforeac 3func# dataM?one8 donde func es una funcin que es llamada para cada fila seleccionada con data. 5a si&natura de func es) def func3model# path# iter# data8 donde model es el Tree4odel# path es el camino de 9r$ol de la fila seleccionada e iter es un Tree:ter que se=ala la fila seleccionada.

Este m%todo puede ser usado para simular el m%todo &etBselectedBro'38 as<) ... def foreac Bc$3model# pat # iter# pat list8) list.append3pat 8 ... def myB&etBselectedBro's3treeselection8) pat list M ^_ treeselection.selectedBforeac 3foreac Bc$# pat list8 model M sel.&etBtree"ie'38.&etBmodel38 return 3model# pat list8 ... El m%todo selectedBforeac 38 no puede usarse para modificar el modelo de 9r$ol o la seleccin# aunque s< permite cam$iar los datos de las filas. 12.A.2. :so de una #uncin de Tree%election 1i se desea un control definiti"o so$re la seleccin de filas se puede esta$lecer una funcin que ser9 llamada antes de que se seleccione o deselecciones una fila mediante el m%todo) treeselection.setBselectBfunction3func# data8 donde func es una funcin de retrollamada y data son los datos de usuario que se pasar9n a func cuando es llamada. func tiene la si&natura) def func3selection# model# path# is_selected# user_data8 donde selection es la seleccin Tree1election# model es el Tree4odel usado con el TreeTie' asociado con selection# path es el camino de 9r$ol de la fila seleccionada# is_selected es T0.E si la fila est9 actualmente seleccionada y user_data es data. func de$er<a de"ol"er T0.E si el estado de seleccin de la fila de$er<a ser conmutado. Esta$lecer una funcin de seleccin es 2til en estos casos) se quiere controlar la seleccin o deseleccin de una fila en funcin de al&una informacin adicional de contexto. 1e necesitar9 indicar de al&una manera que el cam$io de seleccin no se puede lle"ar a ca$o y# tal "ez# el porqu%. Por ejemplo# se puede diferenciar "isualmente la fila o mostar un di9lo&o emer&ente del tipo 4essa&e@ialo&. se necesita mantener una lista propia de filas seleccionadas o deseleccionadas# aunque esto mismo se puede acer# con al&o m9s de esfuerzo# conect9ndose a la se=al Ec an&edE. se quiere acer al&2n procesado adicional antes de que una fila sea seleccionada o deseleccionada. Por ejemplo# cam$iar el aspecto de la fila o modificar los datos de la misma. 12.A.;. %eleccin y Beseleccin de #ilas 1e puede cam$iar la seleccin dentro de un pro&rama utilizando los si&uientes m%todos)

treeselection.selectBpat 3path8 treeselection.unselectBpat 3path8 treeselection.selectBiter3iter8 treeselection.unselectBiter3iter8 Estos m%todos seleccionan o deseleccionan una 2nica fila que se especifica $ien con path# un camino de 9r$ol# o iter# un iterador Tree:ter que apunta a la fila. 5os si&uientes m%todos seleccionan o deseleccionan "arias filas de una "ez) treeselection.selectBall38 treeselection.unselectBall38 treeselection.selectBran&e3start.path# end.path8 treeselection.unselectBran&e3start.path# end.path8 El m%todo selectBall38 precisa que el modo de seleccin sea &t(.1E5EAT:/?B4.5T:P5E al i&ual que el m%todo selectBran&e38. 5os m%todos unselectBall38 y unselectBran&e38 funcionar9n con cualquier modo de seleccin. ?tese que el m%todo unselectBall38 no est9 disponi$le en PyGTK 2.0 1e puede compro$ar si una fila est9 seleccionada utilizando uno de los si&uientes m%todos) result M treeselection.pat BisBselected3pat 8 result M treeselection.iterBisBselected3iter8 que de"uel"en T0.E si la fila especificada por path o iter est9 actualmente seleccionada. 1e puede o$tener el n2mero de filas seleccionadas con el m%todo) count M treeselection.countBselectedBro's38 Este m%todo no est9 disponi$le en PyGTK 2.0 por lo que es preciso simularlo utilizando el m%todo selectedBforeac 38 de forma parecida a la simulacin del m%todo &etBselectedBro's38 de la seccin 98tencin !e a ;e eccin. Por ejemplo) ... def foreac Bc$3model# pat # iter# counter8) counter^0_ !M 1 ... def myBcountBselectedBro's3treeselection8) counter M ^0_ treeselection.selectedBforeac 3foreac Bc$# counter8 return counter^0_ ...

12.F. 3rrastra y %oltar en Tree$ie( 12.F.1. ,eordenacin "ediante 3rrastrar y %oltar 5a reordenacin de las filas de un TreeTie' 3y de las filas del modelo de 9r$ol su$yacente8 se acti"a usando el m%todo setBreordera$le38 que se mencion pre"iamente. El m%todo set_reorderable38 fija la propiedad Ereordera$leE al "alor especificado y permite o impide arrastrar y soltar en las filas del TreeTie'. Auando la propiedad Ereordera$leE es T0.E es posi$le arrastar internamente filas del TreeTie' y soltarlas en una nue"a posicin. Esta accin pro"oca que las filas del Tree4odel su$yacente se reor&anicen para coincidir con la nue"a situacin. 5a reordenacin mediante arrastrar y soltar de filas funciona 2nicamente con almacenes no ordenados. 12.F.!. 3rrastar y %oltar Externo 1i se quiere controlar el arrastar y soltar o tratar con el arrastrar y soltar desde fuentes externas de datos es necesario a$ilitar y controlar el arrastar y soltar con los si&uientes m%todos) tree"ie'.ena$leBmodelBdra&Bsource3start.button."ask# targets# actions8 tree"ie'.ena$leBmodelBdra&Bdest3targets# actions8 Estos m%todos permiten utilizar filas como fuente de arrastre y como lu&ar para soltar respecti"amente. start_button_mask es una m9scara de modificacin 3"%ase re+erencia !e constantes gt6.gt6 %onstants en el ,anua !e -e+erencia !e Py.)/ 8 que especifica los $otones o teclas que de$en ser pulsadas para iniciar la operacin de arrastre. targets es una lista de tuplas de ; elementos que descri$en la informacin del o$jeti"o que puede ser reci$ido o dado. Para que ten&a %xito el arrastar o soltar# por lo menos uno de los o$jeti"os de$e coincidir en la fuente o destino del arrastre 3p.e. el o$jeti"o E1T0:?GE8. Aada tupla de ; elementos del o$jeti"o contiene el nom$re del o$jeti"o# $anderas 3una com$inacin de &t(.T-0GETB1-4EB-PP y &t(.T-0GETB1-4EB>:@GET o nin&uno8 y un identificador entero 2nico. actions descri$e cu9l de$er<a ser el resultado de la operacin) &t(.&d(.-AT:/?B@E7 -.5T# Aopiar los datos. &t(.&d(.-AT:/?BA/ P[# &t(.&d(.-AT:/?B4/ 4o"er los datos# es decir# primero copiarlos# lue&o $orrarlos de la TE fuente utilizando el o$jeti"o @E5ETE del protocolo de selecciones de las 6. &t(.&d(.-AT:/?B5:? -=adir un enlace a los datos. ?tese que esto solamente es de K utilidad si la fuente y el destino coinciden en el si&nificado. &t(.&d(.-AT:/?BP0: -ccin especial que informa a la fuente que el destino "a a acer al&o T-TE que el destino no comprende. &t(.&d(.-AT:/?B-1 Pide al usuario qu% acer con los datos. K Por ejemplo para definir un destino de un arrastrar y soltar) tree"ie'.ena$leBmodelBdra&Bdest3^3NtextGplainN# 0# 08_#

&t(.&d(.-AT:/?B@E7-.5T b &t(.&d(.-AT:/?B4/TE8 Entonces a$r9 que &estionar la se=al del control >id&et Edra&UdataUrecei"edE para reci$ir los datos reci$idos U tal "ez sustituyendo los datos de la fila en la que se solt el contenido. 5a si&natura de la retrollamada de la se=al Edra&UdataUrecei"edE es) def call$ac(3widget# drag_context# x# y# selection_data# info# timestamp8 donde widget es el TreeTie'# drag_context es un @ra&Aontext que contiene el contexto de la seleccin# x e y son la posicin en dnde ocurri el soltar# selection_data es la 1election@ata que contiene los datos# info es un entero identificador del tipo# timestamp es la ora en la que sucedi el soltar. 5a fila puede ser identificada llamando al m%todo) dropBinfo M tree"ie'.&etBdestBro'BatBpos3x# y8 donde 3x# y8 es la posicin pasada a la funcin de retrollamada y drop_info es una tupla de dos elementos que contiene el camino de una fila y una constante de posicin que indica donde se produce el soltar respecto a la fila) &t(.T0EEBT:E>B@0/PBFE7/0E# &t(.T0EEBT:E>B@0/PB-7TE0# &t(.T0EEBT:E>B@0/PB:?T/B/0BFE7/0E o &t(.T0EEBT:E>B@0/PB:?T/B/0B-7TE0. 5a funcin de retrollamada podr<a ser al&o parecido a) tree"ie'.ena$leBmodelBdra&Bdest3^3NtextGplainN# 0# 08_# &t(.&d(.-AT:/?B@E7-.5T b &t(.&d(.-AT:/?B4/TE8 tree"ie'.connect3Edra&UdataUrecei"edE# dra&BdataBrecei"edBc$8 ... ... def dra&BdataBrecei"edBc$3tree"ie'# context# x# y# selection# info# timestamp8) dropBinfo M tree"ie'.&etBdestBro'BatBpos3x# y8 if dropBinfo) model M tree"ie'.&etBmodel38 pat # position M dropBinfo data M selection.data Q do somet in& 'it t e data and t e model ... return ... 1i una fila se usa como fuente para arrastar de$e manejar la se=al de >id&et Edra&UdataU &etE que llena una seleccin con los datos que se de"ol"er9n al destino de arrastar y soltar con una funcin de retrollamada con la si&natura) def call$ac(3widget# drag_context# selection_data# info# timestamp8 5os par9metros de callback son similares a los de la funcin de retrollamada de Edra&UdataU recei"edE. Puesto que a la retrollamada no se le pasa un camino de 9r$ol o una forma sencilla de o$tener informacin so$re la fila que est9 siendo arrastrada# asumiremos que la fila que est9 siendo arrastrada est9 seleccionada y que el modo de seleccin es &t(.1E5EAT:/?B1:?G5E o &t(.1E5EAT:/?BF0/>1E de modo que podemos tener la fila

o$teniendo la Tree1election# el modelo y el iterador Tree:ter que apunta a la fila. Por ejemplo# se podr<a pasar texto as<)) ... treestore M &t(.Tree1tore3str# str8 ... tree"ie'.ena$leBmodelBdra&Bsource3&t(.&d(.F.TT/?1B4-1K# ^3NtextGplainN# 0# 08_# &t(.&d(.-AT:/?B@E7-.5T b &t(.&d(.-AT:/?B4/TE8 tree"ie'.connect3Edra&UdataU&etE# dra&BdataB&etBc$8 ... ... def dra&BdataB&etBc$3tree"ie'# context# selection# info# timestamp8) treeselection M tree"ie'.&etBselection38 model# iter M treeselection.&etBselected38 text M model.&etB"alue3iter# 18 selection.set3NtextGplainN# S# text8 return ... .n TreeTie' puede ser desacti"ado como fuente o destino para arrastrar y soltar utilizando los m%todos) tree"ie'.unsetBro'sBdra&Bsource38 tree"ie'.unsetBro'sBdra&Bdest38 12.F./. E)e"plo de 3rrastrar y %oltar en Tree$ie( Es necesario un ejemplo para unir las piezas de cdi&o descritas m9s arri$a. Este ejemplo 3tree&ie*!n!.py8 es una lista en la que se pueden arrastrar y soltar .05s. Tam$i%n se pueden reordenar las .05s de la lista arrastrando y soltando en el interior del TreeTie'. .n par de $otones permiten limpiar la listar y eliminar un elemento seleccionado. 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I QPGusrG$inGen" pyt on Q example tree"ie'dnd.py import py&t( py&t(.require3N2.0N8 import &t( class TreeTie'@n@Example) T-0GET1 M ^ 3N4[BT0EEB4/@E5B0/>N# &t(.T-0GETB1-4EB>:@GET# 08# 3NtextGplainN# 0# 18# 3NTE6TN# 0# 28# 3N1T0:?GN# 0# ;8# _

1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC

Q close t e 'indo' and quit def deleteBe"ent3self# 'id&et# e"ent# dataM?one8) &t(.mainBquit38 return &t(.7-51E def clearBselected3self# $utton8) selection M self.tree"ie'.&etBselection38 model# iter M selection.&etBselected38 if iter) model.remo"e3iter8 return def BBinitBB3self8) Q Areate a ne' 'indo' self.'indo' M &t(.>indo'3&t(.>:?@/>BT/P5ETE58 self.'indo'.setBtitle3E.05 Aac eE8 self.'indo'.setBsizeBrequest3200# 2008 self.'indo'.connect3EdeleteBe"entE# self.deleteBe"ent8 self.scrolled'indo' M &t(.1crolled>indo'38 self."$ox M &t(.TFox38 self. $ox M &t(.+FuttonFox38 self."$ox.pac(Bstart3self.scrolled'indo'# True8 self."$ox.pac(Bstart3self. $ox# 7alse8 self.$0 M &t(.Futton3NAlear -llN8 self.$1 M &t(.Futton3NAlear 1electedN8 self. $ox.pac(Bstart3self.$08 self. $ox.pac(Bstart3self.$18 Q create a liststore 'it one strin& column to use as t e model self.liststore M &t(.5ist1tore3str8 Q create t e TreeTie' usin& liststore self.tree"ie' M &t(.TreeTie'3self.liststore8 Q create a Aell0enderer to render t e data self.cell M &t(.Aell0endererText38 Q create t e TreeTie'Aolumns to display t e data self.t"column M &t(.TreeTie'Aolumn3N.05N# self.cell# textM08 Q add columns to tree"ie' self.tree"ie'.appendBcolumn3self.t"column8 self.$0.connectBo$ject3Nclic(edN# &t(.5ist1tore.clear# self.liststore8 self.$1.connect3Nclic(edN# self.clearBselected8

IJ II IR IS ID R0 R1 R2 R; RC RJ RI RR RS RD S0 S1 S2 S; SC SJ SI SR SS SD D0 D1 D2 D; DC DJ DI DR DS DD 100 101 102 10; 10C 10J 10I 10R 10S 10D 110 111 112

Q ma(e tree"ie' searc a$le self.tree"ie'.setBsearc Bcolumn308 Q -llo' sortin& on t e column self.t"column.setBsortBcolumnBid308 Q -llo' ena$le dra& and drop of ro's includin& ro' mo"e self.tree"ie'.ena$leBmodelBdra&Bsource3 &t(.&d(.F.TT/?1B4-1K# self.T-0GET1# &t(.&d(.-AT:/?B@E7-.5Tb &t(.&d(.-AT:/?B4/TE8 self.tree"ie'.ena$leBmodelBdra&Bdest3self.T-0GET1# &t(.&d(.-AT:/?B@E7-.5T8 self.tree"ie'.connect3Edra&BdataB&etE# self.dra&BdataB&etBdata8 self.tree"ie'.connect3Edra&BdataBrecei"edE# self.dra&BdataBrecei"edBdata8 self.scrolled'indo'.add3self.tree"ie'8 self.'indo'.add3self."$ox8 self.'indo'.s o'Ball38 def dra&BdataB&etBdata3self# tree"ie'# context# selection# tar&etBid# etime8) treeselection M tree"ie'.&etBselection38 model# iter M treeselection.&etBselected38 data M model.&etB"alue3iter# 08 selection.set3selection.tar&et# S# data8 def dra&BdataBrecei"edBdata3self# tree"ie'# context# x# y# selection# info# etime8) model M tree"ie'.&etBmodel38 data M selection.data dropBinfo M tree"ie'.&etBdestBro'BatBpos3x# y8 if dropBinfo) pat # position M dropBinfo iter M model.&etBiter3pat 8 if 3position MM &t(.T0EEBT:E>B@0/PBFE7/0E or position MM &t(.T0EEBT:E>B@0/PB:?T/B/0BFE7/0E8) model.insertB$efore3iter# ^data_8 else) model.insertBafter3iter# ^data_8 else) model.append3^data_8 if context.action MM &t(.&d(.-AT:/?B4/TE) context.finis 3True# True# etime8 return

11; def main38) 11C &t(.main38 11J 11I if BBnameBB MM EBBmainBBE) 11R tree"ie'dndex M TreeTie'@n@Example38 11S main38 El resultado de la ejecucin del pro&rama de ejemplo tree&ie*!n!.py se ilustra en Figura 1(.<, Ejemp o !e Arrastrar y ;o tar en )ree#ie*) #igura 12.A. E)e"plo de 3rrastrar y %oltar en Tree$ie(

5a cla"e para permitir tanto arrastrar y soltar externo como la reor&anizacin interna de filas es la or&anizacin de los o$jeti"os 3el atri$uto T-0GET1 de la l<nea 118. 1e crea y usa un o$jeti"o espec<fico de la aplicacin 34[BT0EEB4/@E5B0/>8 para indicar un arrastar y soltar dentro del TreeTie' esta$leciendo la $andera &t(.T-0GETB1-4EB>:@GET. Esta$leciendo %ste como el primer o$jeti"o para el destino del arrastre ar9 que se intente acerlo coincidir primero con los o$jeti"os del ori&en de arrastre. @espu%s# las acciones de fuente de arrastre de$en incluir &t(.&d(.-AT:/?B4/TE y &t(.&d(.-AT:/?B@E7-.5T 3"%anse las l<neas R2URJ8. Auando el destino reci$e los datos de la fuente# si la accin @ra&Aontext es &t(.&d(.-AT:/?B4/TE# entonces se indica a la fuente que $orre los datos 3en este caso la fila8 llamando al m%todo del @ra&Aontext finis 38 3"%anse las l<neas 10DU1108. .n TreeTie' proporciona un conjunto de funciones internas que estamos apro"ec ando para arrastrar# soltar y eliminar los datos. 12.1G. Tree'odel%ort y Tree'odel#ilter 5os o$jetos Tree4odel1ort y Tree4odel7ilter son modelos de 9r$ol que se interponen entre el Tree4odel de $ase 3$ien un Tree1tore o un 5ist1tore8 y el TreeTie' que proporciona un modelo modificado mientras retiene la estructura ori&inal del modelo $ase. Estos modelos interpuestos implementan las interfaces Tree4odel y Tree1orta$le pero no proporcionan nin&2n m%todo para insertar o eliminar filas del modelo. Estas se de$en insertar o eliminar del almac%n su$yacente. Tree4odel1ort proporciona un modelo cuyas filas est9n siempre ordenadas# mientras que Tree4odel7ilter proporciona un modelo que contiene un su$conjunto de las filas del modelo $ase. 1i se desea# estos modelos pueden encadenarse en una sucesin ar$itraria\ es decir# un Tree4odel7ilter podr<a tener un Tree4odel1ort ijo# que podr<a tener otro Tree4odel7ilter ijo# y as< sucesi"amente. 4ientras aya un almac%n Tree1tore o 5ist1tore en el extrremo final de la cadena# todo de$er<a funcionar. En PyGTK 2.0 y 2.2 los o$jetos Tree4odel1ort y Tree4odel7ilter no soportan el protocolo de mapeado de Pyt on para Tree4odel. 12.1G.1. Tree'odel%ort 8'odelo de Krbol Erdenado9 Tree4odel1ort mantiene un modelo ordenado del modelo ijo especificado en su constructor. El uso principal de un Tree4odel1ort el el de proporcionar m2ltiples "istas de un modelo que puedan ser ordenadas de forma distinta. 1i se tienen m2ltiples "istas del mismo modelo entonces cualquier acti"idad de ordenacin se "e reflejada en todas las

"istas. -l usar un Tree4odel1ort el almac%n $ase permanecen en su estado ori&inal# mientras que los modelos ordenados a$sor$en toda la acti"idad de ordenacin. Para crear un Tree4odel1ort se a de usar el constructor) treemodelsort M &t(.Tree4odel1ort3child."odel8 donde child_model es un Tree4odel. 5a mayor<a de los m%todos de un Tree4odel1ort tienen que "er con la con"ersin de los caminos de 9r$ol e iteradores Tree:ter desde el modelo ijo al modelo ordenado y "ice"ersa) sortedBpat M treemodelsort.con"ertBc ildBpat BtoBpat 3child.path8 c ildBpat M treemodelsort.con"ertBpat BtoBc ildBpat 3sorted.path8 Estos m%todos de con"ersin de caminos de"uel"en ?one si el camino dado no puede ser con"ertido en un camino del modelo ordenado o el modelo ijo respecti"amente. 5os m%todos de con"ersin de los iteradores Tree:ter son) sortedBiter M treemodelsort.con"ertBc ildBiterBtoBiter3sorted.iter# child.iter8 c ildBiter M treemodelsort.con"ertBiterBtoBc ildBiter3child.iter# sorted.iter8 5os m%todos de con"ersin de iteradores Tree:ter duplican el ar&umento con"ertido 3es tanto el "alor de retorno como el primer ar&umento8 de$ido a cuestiones de compati$lidad con "ersiones anteriores\ se de$en fijar el primer ar&umento como ?one y simplemente utilizar el "alor de"uelto. Por ejemplo) sortedBiter M treemodelsort.con"ertBc ildBiterBtoBiter3?one# c ildBiter8 c ildBiter M treemodelsort.con"ertBiterBtoBc ildBiter3?one# sortedBiter8 -l i&ual que los m%todos de con"ersin de caminos# estos m%todos de"uel"en ?one si el Tree:ter dado no puede ser con"ertido. 1e puede o$tener el Tree4odel ijo usando el m%todo &etBmodel38. .n ejemplo sencillo que utiliza un o$jeto Tree4odel1ort es treemo!e sort.py. Figura 1(.9, Ejemp o !e )ree,o!e ;ort ilustra el resultado de ejecutar el pro&rama y a=adir seis filas) #igura 12.F. E)e"plo de Tree'odel%ort

En cada una de las columnas de las "entanas se puede acer clic( para cam$iar el orden de los elementos de forma independiente al de otras "entanas. Auando se pulsa el $otn E-dd a 0o'E se a=ade una nue"a fila al 5ist1tore $ase y la nue"a fila se muestra en cada TreeTie' como la fila seleccionada. 12.1G.!. Tree'odel#ilter 8'odelo de 5rbol -iltrado9 ota El o$jeto Tree4odel7ilter est9 disponi$le a partir de la "ersin 2.C de PyGTK y posteriores.

.n o$jeto Tree4odel7ilter proporciona "arias formas de modificar la "isualizacin del Tree4odel de $ase# y permiten) mostrar un su$conjunto de las filas del modelo ijo en $ase a datos $ooleanos en una Ecolumna "isi$leE# o en funcin del "alor de retorno de una Efuncin "isi$leE# que toma el modelo ijo# un iterador Tree:ter que apunta a la fila del modelo ijo# y datos de usuario. En am$os casos si el "alor $ooleano es T0.E la fila se mostrar9\ de otro modo# la fila quedar9 oculta. usar un nodo raiz "irtual para proporcionar una "ista de un su$9r$ol de los desdendientes de una fila en el modelo ijo. Esto 2nicamente tiene sentido si el almac%n su$yacente es del tipo Tree1tore. sintetizar las columnas y datos de un modelo en $ase a los datos del modelo ijo. Por ejemplo# se puede proporcionar una columna cuyos datos son calculados a partir de los datos de "arias columnas del modelo ijo. .n o$jeto Tree4odel7ilter se crea usando el m%todo de Tree4odel) treemodelfilter M treemodel.filterBne'3rootM?one8 donde root es un camino de 9r$ol en treemodel que especifica la raiz "irtual del modelo o ?one si se "a a usar el nodo ra<z de treemodel. -l esta$lecer una Era<z "irtualE cuando se crea el Tree4odel7ilter# se puede limitar la "ista del modelo a las filas ijas de la fila Era<zE en la jerarqu<a del modelo ijo. Esto# naturalmente# solamente es 2til cuando el modelo ijo est9 $asado en un Tree1tore. Por ejemplo# si se desea proporcionar una "ista parcial del contenido de una unidad de A@0/4# independiente del resto de elementos del ordenador. 5os modos de "isi$ilidad son m2tuamente excluyentes y 2nicamente se pueden fijar una "ez. Es decir# una "ez que se a esta$lecido una funcin o columna de "isi$ilidad no puede ser cam$iada y el modo alternati"o no puede esta$lecerse. El modo de "isi$ilidad m9s simple extrae un "alor $ooleano de una columna en el modelo ijo para determinar si la fila de$er<a mostrarse. 5a columna de "isi$ilidad se detemina usando) treemodelfilter.setB"isi$leBcolumn3colu"n8 donde column es el n2mero de columna en el Tree4odel ijo# del que extraer los "alores $ooleanos. Por ejemplo# el si&uiente fra&mento de cdi&o usa los "alores de la tercera columna para determinar la "isi$ilidad de las filas) ... treestore M &t(.Tree1tore3str# str# E&$ooleanE8 ... modelfilter M treestore.filterBne'38 modelfilter.setB"isi$leBcolumn328 ... @e esta manera# se mostrar9 cualquier fila de treestore que ten&a un "alor T0.E en la tercera columna. 1i se tiene criterios de "isi$ilidad m9s complicados# una funcin de "isi$ilidad de$er<a proporcionar suficientes posi$ilidades)

treemodelfilter.setB"isi$leBfunc3-unc# dataM?one8 donde func es la funcin llamada para cada una de las filas del modelo ijo y determinar si se de$e mostrar y data son datos de usuario pasados a func. func de$er<a de"ol"er T0.E si la fila de$e ser mostrada. 5a si&natura de func es) def func3model# iter# user_data8 donde model es el Tree4odel ijo# iter es un Tree:ter que apunta a una fila en model y user_data son los datos data entre&ados. 1i se acen cam$ios en los criterios de "isi$ilidad se de$er<a acer la llamada) treemodelfilter.refilter38 para forzar un refiltrado de las filas del modelo ijo. Por ejemplo# el si&uiente fra&mento de cdi&o ilustra el uso de un Tree4odel7ilter que muestra filas en $ase a una comparacin entre el "alor de la tercera columna y los contenidos de los datos de usuario) ... def matc Btype3model# iter# udata8) "alue M model.&etB"alue3iter# 28 return "alue in udata ... s o'B"als M ^N/PE?N# N?E>N# N0E1/N_ liststore M &t(.5ist1tore3str# str# str8 ... modelfilter M liststore.filterBne'38 modelfilter.setB"isi$leBfunc3matc Btype# s o'B"als8 ... El pro&rama treemo!e +i ter.py ilustra el uso del m%todo setB"isi$leBfunc38. Figura 1(.1$, Ejemp o !e #isi8i i!a! en )ree,o!e Fi ter muestra el resultado de la ejecucin del pro&rama. #igura 12.1G. E)e"plo de $isibilidad en Tree'odel#ilter

Aonmutando los $otones de la parte inferior se cam$ian los contenidos del TreeTie' para mostrar 2nicamente las filas que coinciden con uno de los $otones acti"os. .na funcin de modificacin proporciona otro ni"el de control so$re la "isualizacin en el TreeTie' asta el punto en el que es posi$le sintetizar una o m9s columnas 3incluso todas8# que son representadas por el Tree4odel7ilter. Toda"<a es preciso usar un modelo ijo que sea un almac%n Tree1tore o 5ist1tore para determinar el n2mero de filas y la jerarqu<a# pero las columnas pueden ser las que se especifiquen en el m%todo) treemodelfilter.setBmodifyBfunc3types# -unc# dataM?one8 donde types es una secuencia 3lista or tupla8 que especifica los tipos de las columnas que

se representan# func es una funcin llamada para de"ol"er el "alor para una fila y columna y data es un ar&umento que pasar a func. 5a si&natura de func es) def func3model# iter# column# user_data8 donde model es el Tree4odel7ilter# iter es un Tree:ter que apunta a una fila del modelo# column es el n2mero de la columna para el que se precisa un "alor y user_data es el par9metro data. func de$e de"ol"er un "alor que coincida con el tipo de column. .na funcin de modificacin es 2til cuando se quiere proporcionar una columna de datos que necesita ser &enerada utilizando los datos de las columnas del modelo ijo. Por ejemplo# si se tu"iese una columna que contiene fec as de nacimiento y se quisiese mostrar una columna de edades# una funcin de modificacin podr<a &enerar la informacin de edad usando la fec a de nacimiento y la fec a actual. /tro ejemplo ser<a el decidir qu% ima&en mostrar en $ase al an9lisis de los datos 3por ejemplo# el nom$re de un arc i"o8 de una columna. Este efecto tam$i%n se puede conse&uir utilizando el m%todo TreeTie'Aolumn setBcellBdataBfunc38. Generalmente# dentro de la funcin de modificacin# se tendr9 que con"ertir el Tree4odel7ilter Tree:ter a un iterador Tree:ter del modelo ijo aciendo uso de) c ildBiter M treemodelfilter.con"ertBiterBtoBc ildBiter3-ilter.iter8 ?aturalmente# tam$i%n es necesario o$tener el modelo ijo usando) c ildBmodel M treemodelfilter.&etBmodel38 Estos m%todos dan acceso a la fila del modelo ijo y a sus "alores para &enerar el "alor de la fila y columna especificadas del Tree4odel7ilter. Tam$i%n ay un m%todo para con"ertir un Tree:ter ijo a un Tree:ter de un modelo filtrado y m%todos para con"ertir caminos del modelo filtrado a y desde caminos de los 9r$oles ijo) filterBiter M treemodelfilter.con"ertBc ildBiterBtoBiter3child.iter8 c ildBpat M treemodelfilter.con"ertBpat BtoBc ildBpat 3-ilter.path8 filterBpat M treemodelfilter.con"ertBc ildBpat BtoBpat 3child.path8 ?aturalmente# es posi$le com$inar los modos de "isi$ilidad y la funcin de modificacin para filtrar y sintetizar columnas. Para o$tener incluso un mayor control so$re la "ista ser<a necesario utilizar un Tree4odel personalizado. 12.11. El 'odelo de Krbol GenCrico 8GenericTree'odel9 En el momento en el que se encuentra que los modelo de 9r$ol est9ndar Tree4odels no son suficientemente potentes para cu$rir las necesidades de una aplicacin se puede usar la clase GenericTree4odel para construir modelos Tree4odel personalizados en Pyt on. 5a creacin de un GenericTree4odel puede ser de utilidad cuando existen pro$lemas de rendimiento con los almacenes est9ndar Tree1tore y 5ist1tore o cuando se desea tener una interfaz directa con una fuente externa de datos 3por ejemplo# una $ase de datos o el sistema de arc i"os8 para e"itar la copia de datos dentro y fuera de los almacenes Tree1tore o 5ist1tore.

12.11.1. $isin general de GenericTree'ode Aon GenericTree4odel se construye y &estiona un modelo propio de datos y se proporciona acceso externo a tra"%s de la interfaz est9ndar Tree4odel al definir un conjunto de m%todos de clase. PyGTK implementa la interfaz Tree4odel y ace que los nue"os m%todos Tree4odel sean llamados para proporcionar los datos del modelo existente. 5os detalles de implementacin del modelo personalizado de$en mantenerse ocultos a la aplicacin externa. Ello si&nifica que la forma en la que se identifica el modelo# &uarda y o$tiene sus datos es desconocido a la aplicacin. En &eneral# la 2nica informacin que se &uarda fuera del GenericTree4odel son las referencia de fila que se encapsulan por los iteradores Tree:ter externos. [ estas referencias no son "isi$les a la aplicacin. Examinemos en detalle la interfaz GenericTree4odel que es necesario proporcionar. 12.11.!. 7a Inter-a4 GenericTree'odel 5a interfaz GenericTree4odel consiste en los si&uientes m%todos que de$en implementarse en el modelo de 9r$ol personalizado) def onB&etBfla&s3self8 def onB&etBnBcolumns3self8 def onB&etBcolumnBtype3self# index8 def onB&etBiter3self# path8 def onB&etBpat 3self# rowref8 def onB&etB"alue3self# rowref# column8 def onBiterBnext3self# rowref8 def onBiterBc ildren3self# parent8 def onBiterB asBc ild3self# rowref8 def onBiterBnBc ildren3self# rowref8 def onBiterBnt Bc ild3self# parent# n8 def onBiterBparent3self# child8 @e$e ad"ertirse que estos m%todos dan soporte a toda la interfaz de Tree4odel inclu<da) def def def def def def def def def def def def def def def def def &etBfla&s38 &etBnBcolumns38 &etBcolumnBtype3index8 &etBiter3path8 &etBiterBfromBstrin&3path.string8 &etBstrin&BfromBiter3iter8 &etBiterBroot38 &etBiterBfirst38 &etBpat 3iter8 &etB"alue3iter# colu"n8 iterBnext3iter8 iterBc ildren3parent8 iterB asBc ild3iter8 iterBnBc ildren3iter8 iterBnt Bc ild3parent# n8 iterBparent3child8 &et3iter# column# ...8

def foreac 3func# user_data8 Para ilustrar el uso de GenericTree4odel modificaremos el -ilelisting.py y "eremos cmo se crean los m%todos de la -ilelistingJgt".py muestra los arc i"os de una carpeta con un arc i"o es una carpeta o no# el nom$re de arc i"o# el tama=o del del 2ltimo cam$io. pro&rama de ejemplo interfaz. El pro&rama pix$uf que indica si el mismo# el modo y ora

El m%todo onB&etBfla&s38 de$er<a de"ol"er un "alor que es una com$inacin de) &t(.T0EEB4/@ E5B:TE01BPE01 5os Tree:ters so$re"i"en a todas las se=ales emitidas por el 9r$ol. :1T &t(.T0EEB4/@ El modelo es solamente una lista# y nunca tiene ijos E5B5:1TB/?5[ 1i el modelo tiene referencias de fila que son "9lidas entre cam$ios de fila 3reordenacin# adicin o $orrado8 entonces se d$e esta$lecer &t(.T0EEB4/@E5B:TE01BPE01:1T. :&ualmente# si el modelo es una lista entonces de de$e fijar &t(.T0EEB4/@E5B5:1TB/?5[. @e otro modo# se de$e de"ol"er 0 si el modelo no tiene referencias de fila persistentes y es un modelo de 9r$ol. Para nuestro ejemplo# el modelo es una lista con iteradores Tree:ter persitentes. def onB&etBfla&s3self8) return &t(.T0EEB4/@E5B5:1TB/?5[b&t(.T0EEB4/@E5B:TE01BPE01:1T El m%todo onB&etBnBcolumns38 de$er<a de"ol"er el n2mero de columnas que el modelo exporta a la aplicacin. ?uestro ejemplo mantiene una lista de los tipos de las columnas# de forma que de"ol"emos la lon&itud de la lista) class 7ile5ist4odel3&t(.GenericTree4odel8) ... columnBtypes M 3&t(.&d(.Pix$uf# str# lon&# str# str8 ... def onB&etBnBcolumns3self8) return len3self.columnBtypes8 El m%todo onB&etBcolumnBtype38 de$er<a de"ol"er el tipo de la columna con el "alor de <ndice index especificado. Este m%todo es llamado &eneralmente desde una TreeTie' cuando se esta$lece su modelo. 1e puede# $ien crear una lista o tupla que conten&a la informacin de tipos de datos de las columnas o $ien &enerarla al "uelo. En nuestro ejemplo) def onB&etBcolumnBtype3self# n8) return self.columnBtypes^n_ 5a interfaz GenericTree4odel con"ierte el tipo de Pyt on a un GType# de forma que el si&uiente cdi&o) flm M 7ile5ist4odel38 print flm.onB&etBcolumnBtype318# flm.&etBcolumnBtype318

mostrar<a) gtype NstrNL gGType &c ararray 3IC8L 5os si&uientes m%todos usan referencias de fila que se &uardan como datos pri"ados en un Tree:ter. 5a aplicacin no puede "er la referencia de fila en un Tree:ter por lo que se puede usar cualquier elemento 2nico que se desee como referencia de fila. Por ejemplo# en un modelo que contiene filas como tuplas# se podr<a usar la identificacin de tupla como referencia de la fila. /tro ejemplo ser<a el uso de un nom$re de arc i"o como referencia de fila en un modelo que represente los arc i"os de un directorio. En am$os casos la referencia de fila no se modifica con los cam$ios en el modelo# as< que los Tree:ters se podr<an marcar como persistentes. 5a interfaz de aplicacin de PyGTK GenericTree4odel extraer9 esas referencias de fila desde los Tree:ters y encapsular9 las referencias de fila en Tree:ters se&2n sea necesario. En los si&uientes m%todos ro'ref se refiere a una referencia de fila interna. El m%todo onB&etBiter38 de$er<a de"ol"er una ro'ref del camino de 9r$ol indicado por path. El camino de 9r$ol se representar9 siempre mediante una tupla. ?uestro ejemplo usa la cadena del nom$re de arc i"o como ro'ref. 5os nom$res de arc i"o se &uardan en una lista en el modelo# de manera que tomamos el primer <ndice del camino como <ndice al nom$re de arc i"o) def onB&etBiter3self# pat 8) return self.files^pat ^0__ Es necesario ser co erente en el uso de las referencias de fila# puesto que se o$tendr9n referencias de fila tras las llamadas a los m%todos de GenericTree4odel que toman ar&umentos con iteradores Tree:ter) onB&etBpat 38# onB&etB"alue38# onBiterBnext38# onBiterBc ildren38# onBiterB asBc ild38# onBiterBnBc ildren38# onBiterBnt Bc ild38 y onBiterBparent38. El m%todo onB&etBpat 38 de$er<a de"ol"er un camino de 9r$ol dada una ro'ref. Por ejemplo# si&uiendo con el ejemplo anterior donde el nom$re de arc i"o se usa como ro'ref# se podr<a definir el m%todo onB&etBpat 38 as<) def onB&etBpat 3self# ro'ref8) return self.files.index3ro'ref8 Este m%todo localiza el <ndice de la lista que contiene el nom$re de arc i"o en rowref. Es o$"io "iendo este ejemplo que una eleccin juiciosa de la referencia de fila ar9 la implementacin m9s eficiente. 1e podr<a usar# por ejemplo# un diccionario de Pyt on para traducir una rowref a un camino. El m%todo onB&etB"alue38 de$er<a de"ol"er los datos almacenados en la fila y columna especificada por rowref y la columna column. En nuestro ejemplo) def onB&etB"alue3self# ro'ref# column8) fname M os.pat .join3self.dirname# ro'ref8 try) filestat M statcac e.stat3fname8 except /1Error)

return ?one mode M filestat.stBmode if column is 0) if stat.1B:1@:03mode8) return folderp$ else) return filep$ elif column is 1) return ro'ref elif column is 2) return filestat.stBsize elif column is ;) return oct3stat.1B:4/@E3mode88 return time.ctime3filestat.stBmtime8 tiene que extraer la informacin de arc i"o asociada y de"ol"er el "alor adecuado en funcin de qu% columna se especifique. El m%todo onBiterBnext38 de$er<a de"ol"er una rerferencia de fila a la fila 3en el mismo ni"el8 posterior a la especificada porrowref. En nuestro ejemplo) def onBiterBnext3self# ro'ref8) try) i M self.files.index3ro'ref8!1 return self.files^i_ except :ndexError) return ?one El <ndice del nom$re de arc i"o rowref es determinado y se de"uel"e el si&uiente nom$re de arc i"o o ?one si no existe un arc i"o despu%s. El m%todo onBiterBc ildren38 de$er<a de"ol"er una referencia de fila a la primera fila ija de la fila especificada por rowref. 1i rowref es ?one entonces se de"uel"e una referencia a la primera fila de ni"el superior. 1i no existe una fila ija se de"uel"e ?one. En nuestro ejemplo) def onBiterBc ildren3self# ro'ref8) if ro'ref) return ?one return self.files^0_ Puesto que el modelo es una lista 2nicamente la fila superior puede tener filas 3rowrefM?one8. 1e de"uel"e ?one si rowref contiene un nom$re de arc i"o. ijas

El m%todo onBiterB asBc ild38 de$er<a de"ol"er T0.E si la fila especificada por rowref tiene filas ijas o 7-51E en otro caso. ?uestro ejemplo de"uel"e 7-51E puesto que nin&una fila puede tener ijas) def onBiterB asBc ild3self# ro'ref8) return 7alse

El m%todo onBiterBnBc ildren38 de$er<a de"ol"er el n2mero de fijas ijas que tiene la fila especificada por rowref. 1i rowref es ?one entonces se de"uel"e el n2mero de las filas de ni"el superior. ?uestro ejemplo de"uel"e 0 si rowref no es ?one) def onBiterBnBc ildren3self# ro'ref8) if ro'ref) return 0 return len3self.files8 El m%todo onBiterBnt Bc ild38 de$er<a de"ol"er una referencia de fila a la nU%sima fila ija de la fila especificada por parent. 1i parent es ?one entonces se de"uel"e una referencia a la nU%sima fila de ni"el superior. ?uestro ejemplo de"uel"e la nU%sima fila de ni"el superior si parent es ?one. En otro caso de"uel"e ?one) def onBiterBnt Bc ild3self# ro'ref# n8) if ro'ref) return ?one try) return self.files^n_ except :ndexError) return ?one El m%todo onBiterBparent38 de$er<a de"ol"er una referencia de fila a la fila padre de la fila especificada por rowref. 1i rowref apunta a una fila de ni"el superior se de$e de"ol"er ?one. ?uestro ejemplo siempre de"uel"e ?one asumiendo que rowref de$e apuntar a una fila de ni"el superior) def onBiterBparent3c ild8) return ?one Este ejemplo se "e de una "ez en el pro&rama +i e isting=gtm.py. Figura 1(.11, Programa !e Ejemp o !e ,o!e o !e >r8o .en?rico muestra el resultado de la ejecucin del pro&rama. #igura 12.11. Progra"a de E)e"plo de 'odelo de Krbol GenCrico

12.11./. 3dicin y Eli"inacin de #ilas El pro&rama +i e isting=gtm.py calcula la lista de nom$res de arc i"o mientras se crea una instancia de 7ile5ist4odel. 1i se desea compro$ar la existencia de nue"os arc i"os de forma peridica y a=adir o eliminar arc i"os del modelo se podr<a# $ien crear un nue"o modelo 7ile5ist4odel de la misma carpeta# o $ien se podr<an incorporar m%todos para a=adir y eliminar filas del modelo. @ependiendo del tipo de modelo que se est% creando se necesitar<a a=adir unos m%todos similares a los de los modelos Tree1tore y 5ist1tore) insert38 insertB$efore38 insertBafter38 prepend38

append38 remo"e38 clear38 ?aturalmente# ni todos ni cualquiera de estos m%todos neceista ser implementado. 1e pueden crear m%todos propios que se relacionen de manera m9s ajustada al modelo. .tilizando el pro&rama de ejemplo anterior para ilustrar la adicin de m%todos para eliminar y a=adir arc i"os# implementemos esos m%todos) def def add3-ilena"e8 remo"e3iter8

El m%todo remo"e38 elimina el arc i"o especificado por iter. -dem9s de eliminar la fila del modelo el m%todo tam$i%n de$er<a eliminar el arc i"o de la carpeta. ?aturalmente# si el usuario no tiene permisos para eliminar el arc i"o no se de$er<a eliminar tampoco la fila. Por ejemplo) def remo"e3self# iter8) pat M self.&etBpat 3iter8 pat name M self.&etBpat name3pat 8 try) if os.pat .exists3pat name8) os.remo"e3pat name8 del self.files^pat ^0__ self.ro'Bdeleted3pat 8 except /1Error) pass return -l m%todo se le pasa un iterador Tree:ter que a de ser con"ertido a un camino que se usa para o$tener el camino del arc i"o usando el m%todo &etBpat name38. Es posi$le que el arc i"o ya aya sido eliminado por lo que de$emos compro$ar si existe antes de intentar su eliminacin. 1i se emite una excepcin /1Error durante la eliminacin del arc i"o# pro$a$lemente se de$a a que es un directorio o que la usuaria no tiene los pri"ile&ios necesarios para elimnarlo. 7inalmente# el arc i"o se elimina y la se=al Ero'UdeletedE se emite desde el m%todo ro'sBdeleted38. 5a se=al EfileUdeletedE notifica a las TreeTie's que usan el modelo que %ste a cam$iado# por lo que pueden actualizar su estado interno y mostrar el modelo actualizado. El m%todo add38 necesita crear un arc i"o con el nom$re dado en la carpeta actual. 1i se crea el arc i"o su nom$re se a=ade a la lista de arc i"os del modelo. Por ejemplo) def add3self# filename8) pat name M os.pat .join3self.dirname# filename8 if os.pat .exists3pat name8) return try) fd M file3pat name# N'N8 fd.close38 self.dirBctime M os.stat3self.dirname8.stBctime

files M self.files^1)_ ! ^filename_ files.sort38 self.files M ^N..N_ ! files pat M 3self.files.index3filename8#8 iter M self.&etBiter3pat 8 self.ro'Binserted3pat # iter8 except /1Error) pass return Este ejemplo sencillo se ase&ura de que el arc i"o no existe y lue&o intenta a$rir el arc i"o para escritura. 1i tiene %xito# el arc i"o se cierra y el nom$re de arc i"o ordenado en la lista de arc i"os. 5a ruta y el iterador Tree:ter de la fila de arc i"o a=adida se o$tienen para usarlos en el m%todo ro'Binserted38 que emite la se=al Ero'UinsertedE. 5a se=al Ero'U insertedE se usa para notificar a las TreeTie's que usan el modelo que necesitan actualizar su estado interno y re"isar su "isualizacin. 5os otros m%todos mencionados anteriormente 3por ejemplo# append y prepend8 no tienen sentido en el ejemplo# puesto que el modelo mantiene la lista de arc i"os ordenada. /tros m%todos que puede merecer la pena implementar en un Tree4odel que erede de GenericTree4odel son) setB"alue38 reorder38 s'ap38 mo"eBafter38 mo"eB$efore38

5a implementacin de estos m%todos es similar a de los m%todos anteriores. Es necesario sincronizar el modelo con el estado externo y lue&o notificar a las TreeTie's cuando el modelo cam$ie. 5os si&uientes m%todos se usan para notificar a las TreeTie's de cam$ios en el modelo emitiendo la se=al apropiada) def ro'Bc an&ed3path# iter8 Q fila cam$i def ro'Binserted3path# iter8 Q fila insertada def ro'B asBc ildBto&&led3path# iter8 Q cam$io en la existencia de ijas en la fila def ro'Bdeleted3path8 Q fila eliminada def ro'sBreordered3path# iter# ne(.order8 Q filas reordenadas 12.11.2. Gestin de 'e"oria .no de los pro$lemas de GenericTree4odel es que los Tree:ters &uardan una referencia a un o$jeto de Pyt on de"uelto por el modelo de 9r$ol personalizado. Puesto que se puede crear e inicializar un Tree:ter en cdi&o en A y que permanezca en la pila# no es posi$le sa$er cu9ndo se a destruido el Tree:ter y ya no se usa la referencia al o$jeto de Pyt on. Por lo tanto# el o$jeto de Pyt on referenciado en un Tree:ter incrementa por defecto su cuenta de referencias# pero no se decrementa cuando se destruye el Tree:ter. Esto ase&ura que el o$jeto de Pyt on no ser9 destruido mientras est9 en uso por un Tree:ter# lo que podr<a causar una "iolacin de se&mento. @es&raciadamente# la cuenta de referencias

extra lle"a a la situacin en la que# como $ueno# el o$jeto de Pyt on tendr9 un contador de referencias excesi"o# y como malo# nunca se li$erar9 esa memoria incluso cuando ya no se usa. Este 2ltimo caso lle"a a p%rdidas de memoria y el primero a p%rdidas de referencias. Para pre"er la situacin en la que el Tree4odel personalizado mantiene una referencia al o$jeto de Pyt on asta que ya no se dispone de %l 3es decir# el Tree:ter ya no es "9lido porque el modelo a cam$iado8 y no ay necesidad de perder referencias# el GenericTree4odel tiene la propiedad Elea(UreferencesE. Por defecto Elea(UreferencesE es T0.E para indicar que el GenericTree4odel pierde referencias. 1i Elea(UreferencesE se esta$lece a 7-51E entonces el contador de referencias del o$jeto de Pyt on no se incrementar9 cuando se referencia en un Tree:ter. Esto implica que el Tree4odel propio de$e mantener una referencia a todos los o$jetos de Pyt on utilizados en los Tree:ters asta que el modelo sea destruido. @es&raciadamente# incluso esto no permite la proteccin frente a cdi&o errneo que intenta utilizar un Tree:ter &uardado en un GenericTree4odel diferente. Para prote&erse frente a este caso la aplicacin de$er<a mantener referencias a todos los o$jetos de Pyt on referenciados desde un Tree:ter desde cualquier instancia de un GenericTree4odel. ?aturalmente# esto tiene finalmente el mismo resultado que la p%rdida de referencias. En PyGTK 2.C y posteriores los m%todos in"alidateBiters38 y iterBisB"alid38 est9n disponi$les para ayudar en la &estin de los Tree:ters y sus referencias a o$jetos de Pyt on) &enerictreemodel.in"alidateBiters38 result M &enerictreemodel.iterBisB"alid3iter8 Estas son particularmente 2tiles cuando la propiedad Elea(UreferencesE est9 fijada como 7-51E. 5os modelos de 9r$ol deri"ados de GenericTree4odel est9n prote&idos de pro$lemas con Tree:ters o$soletos porque se comprue$a autom9ticamente la "alidez de los iteradores con el modelo de 9r$ol. 1i un modelo de 9r$ol personalizado no soporta iteradores persistentes 3es decir# &t(.T0EEB4/@E5B:TE01BPE01:1T no est9 acti"ado en el resultado del m%todo Tree4odel.&etBfla&s38 8 entonces puede llamar al m%todo in"alidateBiters38 para in"alidar los Tree:ters restantes cuando cam$ia el modelo 3por ejemplo# tras insertar una fila8. El modelo de 9r$ol tam$i%n puede des acerse de cualquier o$jeto de Pyt on que fue referenciado por Tree:ters tras llamar al m%todo in"alidateBiters38. 5as aplicaciones pueden usar el m%todo iterBisB"alid38 para determinar si un Tree:ter es a2n "9lido en el modelo personalizado. 12.11.;. Etras Inter-aces 5os modelos 5ist1tore y Tree1tore soportan las interfaces Tree1orta$le# Tree@ra&1ource y Tree@ra&@est adem9s de la interfaz Tree4odel. 5a clase GenericTree4odel unicamente soporta la interfaz Tree4odel. Esto parece ser as< dada la referencia directa al modelo en el ni"el de A por las "istas TreeTie' y los modelos Tree4odel1ort y Tree4odel7ilter models. 5a creacin y uso de Tree:ters precisa cdi&o de unin en A que a&a de enlace con el modelo de 9r$ol personalizado en Pyt on que tiene los datos. Ese cdi&o de conexin lo aporta la clase GenericTree4odel y parece que no ay una forma alternati"a de acerlo puramente en Pyt on puesto que las TreeTie's y los otros modelo llaman a las funciones de

Gt(Tree4odel en A y pasan sus referencias al modelo de 9r$ol personalizado. 5a interfaz Tree1orta$le tam$i%n necesitar<a cdi&o de enlace en A para funcionar con el mecanismo de ordenacin predeterminado de TreeTie'Aolumn# que se explica en la seccin 9r!enacin !e Fi as !e ,o!e o !e >r8o . 1in em$ar&o# un modelo personalizado puede acer su propia ordenacin y una aplicacin puede &estionar el uso de los criterios de ordenacin manejando los clic so$re las ca$eceras de las TreeTie'Aolumns y llamando a los m%todos personalizados de ordenacin del modelo. El modelo completa la actualizacin de las "istas TreeTie' emitiendo la se=al Ero'sUreorderedE utilizando el m%todo de Tree4odel ro'sBreordered38. -s<# pro$a$lemente no es necesario que GenericTree4odel implemente la interfaz Tree1orta$le. @e la misma manera# la clase GenericTree4odel no necesita implementar las interfaces Tree@ra&1ource y Tree@ra&@est puesto que el modelo de 9r$ol personalizado puede implementar sus propias interfaces de arrastrar y soltar y la aplicacin puede majenar las se=ales de TreeTie' adecuadas y llamar a los m%todos propios del modelo se&2n sea necesario. 12.11.>. :tili4acin de GenericTree'odel 5a clase GenericTree4odel de$er<a usarse como 2ltimo recurso. Existen mecanismos muy poderosos en el &rupo est9ndar de o$jetos TreeTie' que de$er<an ser suficientes para la mayor parte de aplicaciones. 1in duda que existen aplicaciones que pueden requerir el suo de GenericTree4odel pero se de$er<a pro$ar antes a utilizar lo si&uiente) 7unciones de Aomo se ilustra en la seccin 7uncin de @atos de Aelda# las funciones de @atos de Aelda datos de celda se pueden usar para modificar e incluso &enerar los datos de una columna de TreeTie'. 1e pueden crear de forma efecti"a tantas columnas con datos &enerados como se precise. Esto proporciona un &ran control so$re la presentacin de los datos a partir de una fuente de datos su$yacente. 4odelo de En PyGTK 2.C# el Tree4odel7ilter que se descri$e en la seccin er$ol 7iltrado Tree4odel7ilter proporciona un &ran ni"el de control so$re la "isualizacin 3Tree4odel7ilte de las columnas y filas de un Tree4odel ijo# incluida la presentacin de r8 2nicamente las filas ijas de una fila. 5as columnas de datos tam$i%n pueden ser &eneradas de forma similar al caso de las 7unciones de @atos de Aelda# pero aqu< el modelo parece ser un Tree4odel con el n2mero y tipo de columnas especificado# mientras que la funcin de datos de celda deja intactas las columnas del modelo y simplemente modifica la "isualizacin en una "ista TreeTie'. 1i se aca$a usando un GenericTree4odel se de$e tener en cuenta que) la interfaz Tree4odel completa de$e ser creada y de$e funcionar tal como se document. +ay sutilezas que pueden conducir a errores. Por el contrario# los Tree4odels est9ndar est9n muy re"isados. la &estin de referencias a o$jetos de Pyt on utilizados por iteradores Tree:ter puede ser complicada# especialmente en el caso de pro&ramas que se ejecuten durante muc o tiempo y con &ran "ariedad de "isualizaciones.

es necesaria la adicin de una interfaz para a=adir# $orrar y cam$iar los contenidos de las filas. +ay cierta complicacin con la traduccin de los Tree:ter a o$jetos de Pyt on y a las filas del modelo en esta interfaz. la implementacin de las interfaces de ordenacin y arrastrar y soltar exi&en un esfuerzo considera$le. 5a aplicacin posi$lemente necesite implicarse en acer que estas interfaces sean completamente funcionales. Captulo 1;. ue0os Controles de PyGTK !.!

Tabla de contenidos 1J.1. Portapapeles 3Alip$oard8 1J.1.1. Areacin de un o$jeto Alip$oard 3Portapapeles8 1J.1.2. .tilizacin de Alip$oards con elementos Entry# 1pin$utton y TextTie' 1J.1.;. :ncorporacin de datos en un portapapeles 1J.1.C. /$tencin de los Aontenidos del Portapapeles 1J.1.J. Ejemplo de Portapapeles El o$jeto Alip$oard 3portapapeles8 a sido a=adido en PyGTK 2.2. Gt(Alip$oard esta$a disponi$le en GTK! 2.0 pero no era incluido en PyGTK 2.0 de$ido a que no se trata$a de un G/$ject completo. 1e a=adieron tam$i%n al&unos o$jetos nue"os al mdulo &t(.&d( en PyGTK 2.2 pero no se descri$ir9n en este tutorial. T%ase el 4anual de 0eferencia de PyGTK 2 para o$tener informacin adicional so$re los o$jetos &t(.&d(.@isplay# &t(.&d(.@isplay4ana&er y &t(.&d(.1creen. 1;.1. Portapapeles 8Clipboard9 .n Alip$oard 3portapapeles8 aporta una zona de almacenamiento que permite compartir datos entre procesos o entre distintos controles del mismo proceso. Aada Alip$oard se identifica con un nom$re 3una cadena de texto8 codificada como un &d(.-tom. Es posi$le utilizar cualquier nom$re para identificar un portapapeles 3Alip$oard8 y se crear9 uno nue"o en caso de que no exista. Para que se pueda compartir un o$jeto Alip$oard entre distintos procesos# es preciso que cada uno de ellos conozca el nom$re del mismo. 5os elementosAlip$oard est9n ec os so$re las interfaces de seleccin y 1election@ata. El portapapeles usado por defecto por los controles TextTie'# 5a$el y Entry es EA5:PF/-0@E. /tros portapapeles comunes son EP0:4-0[E y E1EA/?@-0[E# que se corresponden con las selecciones primaria y secundaria 3>in;2 las i&nora8. Estos o$jetos pueden i&ualmente ser especificados utilizando los o$jetos &t(.&d(.-tom si&uientes) &t(.&d(.1E5EAT:/?BA5:PF/-0@# &t(.&d(.1E5EAT:/?BP0:4-0[ y &t(.&d(.1E5EAT:/?B1EA/?@-0[. Para mayor informacin "%ase la !ocumentacin !e re+erencia !e gt6.g!6.Atom. 1;.1.1. Creacin de un ob)eto Clipboard 8Portapapeles9 5os o$jetos Alip$oard se crean mediante el constructor) clip$oard M &t(.Alip$oard3display# selection8 donde display es el &t(.&d(.@isplay asociado con el Alip$oard denominado por selection. 5a

funcin auxiliar que si&ue crea un portapapeles 3Alip$oard8 por defecto) clip$oard M &t(.clip$oardB&et3selection8

aciendo del &t(.&d(.@isplay

7inalmente# un Alip$oard tam$i%n puede crearse utilizando el m%todo de la clase >id&et) clip$oard M 'id&et.&etBclip$oard3selection8 El control 'id&et de$e a$er sido realizado y a de formar parte de una "entana de una jerarqu<a de "entana de primer ni"el. 1;.1.!. :tili4acin de Clipboards con ele"entos EntryD %pinbutton y Text$ie( 5os controles Entry# 1pinFutton y TextTie' poseen men2s emer&entes que proporcionan la capacidad de copiar y pe&ar el texto seleccionado desde el portapapeles NA5:PF/-0@N as< como pe&arlo desde el mismo. -dem9s# se dispone de com$inaciones de teclas que sir"en de atajos para cortar# copiar y pe&ar. Aortar se acti"a con Control!L\ copiar con Control!C\ y pe&ar con Control!$. Esos controles 3Entry y 1pinFutton8 implementan la interfaz Edita$le# de manera que poseen los si&uientes m%todos para cortar# copiar y pe&ar de y acia el portapapeles EA5:PF/-0@E) edita$le.cutBclip$oard38 edita$le.copyBclip$oard38 edita$le.pasteBclip$oard38 .na etiqueta 5a$el que sea selecciona$le 3su propiedad Eselecta$leE es T0.E8 tam$i%n permite la copia del texto seleccionado al portapapeles EA5:PF/-0@E utilizando un men2 emer&ente o la com$inacin de teclas r9pidas Control!C. 5os TextFuffers poseen m%todos simiares# aunque permiten indicar el portapapeles que se a de usar) text$uffer.copyBclip$oard3clipboard8 El texto de la seleccin ser9 copiado al portapapeles especificado por clipboard. text$uffer.cutBclip$oard3clipboard# de-ault.editable8 El texto seleccionado ser9 copiado a clipboard. 1i default_editable es T0.E# entonces el texto seleccionado ser9 $orrado del TextFuffer. En otro caso# cutBclip$oard38 funcionar9 como el m%todo copyBclip$oard38. text$uffer.pasteBclip$oard3clipboard# o0erride.location# de-ault.editable8 1i default_editable es T0.E# los contenidos del portapapeles clipboard ser9n insertados el TextFuffer en la posicin indicada por el iterador Text:ter override_location. default_editable es 7-51E# entonces pasteBclip$oard38 no insertar9 los contenidos clipboard. 1i override_location es ?one los contenidos del portapapeles clipboard insertar9n en la posicin del cursor. en 1i de se

5os TextFuffers tam$i%n tienen dos m%todos para &estionar un conjunto de o$jetos Alip$oard que se esta$lecen de forma autom9tica con los contenidos de la seleccin "i&ente) text$uffer.addBselectionBclip$oard3clipboard8 Q a=adir portapapeles de seleccin text$uffer.remo"eBselectionBclip$oard3clipboard8 Q eliminar portapapeles de seleccin Auando se a=ade un TextFuffer a una "ista de texto 3TextTie'8 se a=ade autom9ticamente el portapapeles EP0:4-0[E a los portapapeles de seleccin. 5a aplicacin puede a=adir otros portapapeles a con"eniencia 3por ejemplo# el portapapeles EA5:PF/-0@E8. 1;.1./. Incorporacin de datos en un portapapeles 1e pueden esta$lecer los datos de un portapapeles Alip$oard de forma pro&ram9tica utilizando los m%todos) clip$oard.setB'it Bdata3targets# get.-unc# clear.-unc# user.data8 clip$oard.setBtext3text# lenMU18 El m%todo setB'it Bdata38 indica que destinos se soportan para los datos seleccionados y proporciona las funciones 3get_func y clear_func8# que se llaman al solicitar o cuando cam$ian los datos del portapapeles. user_data se pasa a get_func o clear_func cuando son llamadas. targets es una lista de tuplas de tres elementos que contiene) una cadena que representa un destino soportado por el portapapeles. un "alor de $anderas utilizado para arrastrar y soltar 32sese 08. un entero asi&nado por la aplicacin que se pasa como par9metro al manejador de se=al para ayudar en la identificacin del tipo de destino. 5as si&naturas de get_func y clear_func son) def &etBfunc3clip$oard# selectiondata# info# data8) def clearBfunc3clip$oard# data8) donde clipboard es el portapapeles de la clase Alip$oard# selectiondata es un o$jeto 1election@ata en el que poner los datos# info es el entero asi&nado por la aplicacin asi&nado al destino# y data son datos de usuario user_data. setBtext38 es un m%todo auxiliar que usa a su "ez el m%todo setB'it Bdata38 para asi&nar los datos de texto en un portapapeles Alip$oard con los destinos) E1T0:?GE 3cadena8# ETE6TE 3texto8# EA/4P/.?@BTE6TE 3texto compuesto8# y E.T7SB1T0:?GE 3cadena .T7US8. .sa funciones internas &et y clear para &estionar los datos. setBtext38 equi"ale a) def myBsetBtext3self# text# lenMU18) tar&ets M ^ 3E1T0:?GE# 0# 08# 3ETE6TE# 0# 18# 3EA/4P/.?@BTE6TE# 0# 28# 3E.T7SB1T0:?GE# 0# ;8 _ def textB&etBfunc3clip$oard# selectiondata# info# data8)

selectiondata.setBtext3data8 return def textBclearBfunc3clip$oard# data8) del data return self.setB'it Bdata3tar&ets# textB&etBfunc# textBclearBfunc# text8 return .na "ez que se introducen datos en un portapapeles# %stos estar9n disponi$les asta que se termine el pro&rama o se cam$ien los datos en el portapapeles. Para proporcionar el comportamiento t<pico de cortar al portapapeles la aplicacin tendr9 que eliminar el texto u o$jeto correspondiente tras copiarlo al portapapeles. 1;.1.2. Ebtencin de los Contenidos del Portapapeles 5os contenidos de un portapapeles Alip$oard se pueden o$tener utilizando los si&uientes m%todos) clip$oard.requestBcontents3target# callback# user.dataM?one8 5os contenidos especificados por target son o$tenidos de forma as<ncrona en la funcin indicada por callback# que es llamada con user_data. 5a si&natura de callback es) def call$ac(3clip$oard# selectiondata# data8) donde selectiondata es un o$jeto 1election@ata con los contenidos del portapapeles clipboard. data son datos de usuario user_data. El m%todo requestBcontents38 es la forma m9s &eneral de o$tener los contenidos de un portapapeles Alip$oard. El si&uiente m%todo auxiliar recupera los contenidos de texto de un portapapeles Alip$oard) clip$oard.requestBtext3callback# user.dataM?one8 1e de"uel"e la cadena de texto a la retrollamada en "ez de un o$jeto 1electiondata. 1e puede compro$ar los destinos disponi$les para el portapapeles Alip$oard utilizando el m%todo) clip$oard.requestBtar&ets3callback# user.dataM?one8 5os destinos se de"uel"en a la funcin de retrollamada como tuplas de o$jetos &t(.&d(.-tom. 1e proporcionan dos m%todos auxiliares que de"uel"en los contenidos del portapapeles Alip$oard de forma s<ncrona) selectiondata M clip$oard.'aitBforBcontents3tar&et8 text M clip$oard.'aitBforBtext38

1;.1.;. E)e"plo de Portapapeles Para ilustrar el uso de un portapapeles Alip$oard el pro&rama de ejemplo c ip8oar!.py si&ue los elementos de texto que se copian o cortan al cortapapeles EA5:PF/-0@E y &uarda las 2ltimas diez entradas del cortapapeles. +ay diez $otones que proporcionan acceso al texto de las entradas &uardadas. 5a etiqueta del $otn muestra los primeros dieciseis caracteres del texto almacenado y las etiquetas de ayuda 3pistas8 muestran los destinos que ten<a la entrada ori&inal. Auando se pulsa un $otn de entrada se car&a el texto correspondiente# que puede ser editado. - su "ez# ell $otn $ajo la "entana de texto permite &uardar los contenidos de la "entana de texto al portapapeles.. Figura 17.1, Programa !e ejemp o !e Portapape es ilustra el resultado de la ejecucin del pro&rama c ip8oar!.py) #igura 1;.1. Progra"a de e)e"plo de Portapapeles

El pro&rama de ejemplo consulta el portapapeles cada 1.J se&undos para "er si los contenidos an cam$iado. El pro&rama podr<a modificarse para duplicar el conjunto completo de destinos disponi$les y tomar lue&o control del portapapeles utilizando el m%todo setB'it Bdata38. Posteriormente# si otro pro&rama fija los contenidos del portapapeles# se llamar9 a la funcin clear_func# que se puede usar para recar&ar los contenidos del portapapeles y retomar la propiedad del mismo. Captulo 1>. ue0os Controles de PyGTK !.2

Tabla de contenidos 1I.1. /$jetos de -ccilmn 3-ction8 y Grupo de -cciones 3-ctionGroup8 1I.1.1. -cciones 3-ctions8 1I.1.2. Grupos de -cciones 3-ctionGroups8 1I.2. Aontroles de 5ista @esple&a$le 3Aom$oFox8 y 5ista @esple&a$le con Entrada 3Aom$oFoxEntry8 1I.2.1. Aontroles Aom$oFox 1I.2.2. Aontroles Aom$oFoxEntry 1I.;. Aontroles Fotn de Aolor y de 7uente 3AolorFutton y 7ontFutton8 1I.;.1. Aontrol Fotn de Aolor 3AolorFutton8 1I.;.2. Aontrol Fotn de 7uente 37ontFutton8 1I.C. Aontroles de Entrada con Aompletado 3EntryAompletion8 1I.J. Aontroles de Expansin 3Expander8 1I.I. 1elecciones de -rc i"os mediante el uso de Aontroles $asados en el 1elector de -rc i"os 7ileA ooser 1I.R. El &estor de :nterfaces de .suario .:4ana&er 1I.R.1. Perspecti"a &eneral 1I.R.2. Areacin de un &estor .:4ana&er 1I.R.;. -dicin y Eliminacin de Grupos de -cciones 3-ctionGroups8 1I.R.C. @escripciones de la :nterfaz de .suario 1I.R.J. -dicin y Eliminacin de @escripciones de :nterfaz de .suario 1I.R.I. -cceso a los Aontroles de la :nterfaz de .suario 1I.R.R. Ejemplo sencillo de Gestor de :nterfaz .:4ana&er

1I.R.S. Aom$inacin de @escripciones de :nterfaz de .suario 1I.R.D. 1e=ales de .:4ana&er En PyGTK 2.C se an a=adido unos cuantos controles y o$jetos auxiliares nue"os# inclu<dos) -ction 3-ccin8# 0adio-ction 3-ccin de Exclusin 42tua8# To&&le-ction 3-ccin Fiestado8 U o$jetos que representan acciones que puede tomar la usuaria. 5as acciones contienen informacin necesaria para crear controles dele&ados 3proxy8 3por ejemplo) iconos# elementos de men2 y elementos de $arra de erramientas8. -ctionGroup 3Grupo de -cciones8 U un o$jeto que contiene -ctions que est9n relacionadas de al&una manera# por ejemplo# acciones para a$rir# cerrar e imprimir un documento. Forder 3Forde8 U un o$jeto que contiene los "alores de un $orde. AolorFutton 3Fotn de Aolor8 U un $otn usado para laznar un di9lo&o de seleccin de Aolor 3Aolor1election@ialo&8. Aom$oFox 35ista desple&a$le8 U un control que proporciona una lista de elementos entre los que ele&ir. 1ustituye al men2 de opciones /ption4enu. Aom$oFoxEntry 35ista con entrada8 U un control que proporciona un campo de entrada de texto con una lista desple&a$le de elementos entre los que ele&ir. 0emplaza al control de lista desple&a$le Aom$o. EntryAompletion 3Entrada con completado8 U un o$jeto que proporciona completado a un control de entrada Entry. Expander 3Elemento de Expansin8 U un contenedor que puede mostrar u ocultar sus ijos en respuesta a su pulsacin de $otn. 7ileA ooser 31elector de 7ic eros8 U una interfaz para seleccionar fic eros. 7ileA ooser>id&et 3Aontrol de 1eleccin de 7ic eros8 U un control que implementa la interfaz 7ileA ooser. 1ustituye al control 7ile1election. 7ileA ooser@ialo& 3@i9lo&o de 1eleccin de 7ic eros8 U un di9lo&o utilizado para las accines E-rc i"oG-$rirE y E-rc i"oGGuardarE. 1ustituye a 7ile1election@ialo&. 7ile7ilter 37iltro de 7ic eros8 U un o$jeto usado para filtrar arc i"os en $ase a un conjunto interno de re&las. 7ontFutton 3Fotn de 7uentes8 U un $otn que lanza el di9lo&o de seleccin de fuentes 7ont1election@ialo&. :con:nfo 3:nformacin de :cono8 U un o$jeto que contiene informacin so$re un icono de un tema :conT eme. :conT eme 3Tema de :conos8 U un o$jeto que proporciona $2squeda de iconos por nom$re y tama=o. Tool:tem 3Elemento &en%rico8# ToolFutton 3Fotn8# 0adioToolFutton 3Fotn de exclusin8# 1eparatorTool:tem 31eparador8# To&&leToolFutton 3Fotn $iestado8 U controles que se pueden a=adir a una $arra de erramientas Tool$ar. Todos estos sustituyen a los anteriores elementos de Tool$ar. Tree4odel7ilter 34odelo de er$ol 7iltrado8 U un o$jeto que proporciona un potente mecanismo para transformar la representacin de un modelo Tree4odel su$yacente. 1e descri$e en la seccin 1eccin de Tree4odel7ilter. .:4ana&er 3Gestor de :nterfaz de .suario8 U un o$jeto que proporciona una manera de construir men2s y $arras de erramientas a partir de una descripcin de la interfaz en 645. Tam$i%n tiene m%todos para &estionar la com$inacin y separacin

de m2ltiples descripciones de interfaces de usuario. 1>.1. Eb)etos de 3cciMNn 83ction9 y Grupo de 3cciones 83ctionGroup9 5os o$jetos -ction y -ctionGroup tra$ajan de forma conjunta para pro"eer a las aplicaciones de imlO&enes# texto# retrollamadas y aceleradores a los menlns y $arras de erramientas. El o$jeto .:4ana&er utiliza o$jetos -ction y -ctionGroup para construir de forma automlOtica dic as $arras de menln y erramientas a partir de su descripcilmn en 645. -sl# resulta muc o mlOs sencilla la creacilmn y construccilmn de menlns y $arras de erramientas mediante .:4ana&er de la manera en la que se descri$e en una seccilmn posterior. 5as secciones que si&uen# acerca de los o$jetos -ction y -ctionGroup# descri$en clmmo se pueden utilizar lostos directamente# aunque# en su lu&ar y siempre que sea posi$le# se recomienda el uso de la clase .:4ana&er. 1>.1.1. 3cciones 83ctions9 .n o$jeto -ction 3accilmn8 representa una accilmn que el usuario puede realizar utlizando la interfaz de una aplicacilmn. Aontiene informacilmn utilizada por los elementos intermedios de la interfaz 3por ejemplo# elementos de menln 4enu:tem o elementos de $arra de erramientas Tool$ar8 para presentar dic a accilmn al usuario. Existen dos su$clases de la clase -ction) To&&le-ctio n 3accilmn Es una accilmn -ction que permite conmutar entre dos estados. conmuta$le 8 0adio-ction .na accilmn -ction que puede a&ruparse de manera que solamente una de 3accilmn con ellas puede estar acti"a. exclusilmn8 Por ejemplo# el elemento de menln estlOndar -rc i"oUL1alir puede ser representado mediante un icono# un texto mnemlmnico y un acelerador. Auando se acti"a# el elemento de menln dispara una retrollamada que podrla cerrar la aplicacilmn. @e la misma manera# un $otlmn 1alir de una $arra de erramientas Tool$ar podrla compartir con aquel el icono# el texto mnemlmnico y la retrollamada. -m$os elementos de la interfaz podrlan ser elementos dele&ados 3proxies8 de la misma accilmn -ction. 5os controles de $otlmn normal 3Futton8# $otlmn conmutado 3To&&leFutton8 y $otlmn de exclusilmn 30adioFutton8 pueden actuar como dele&ados 3proxies8 de una accilmn 3-ction8# aunque no existe soporte para ellos en la clase .:4ana&er. 1>.1.1.1. CreaciMNn de acciones 5as acciones -ction se crean aciendo uso del constructor) action M &t(.-ction3na"e# label# tooltip# stock.id8 name 3nom$re8 es una cadena que identifica la accilmn 3-ction8 dentro de un &rupo 3-ctionGroup8 o en la especificacilmn de un &estor de interfaz 3.:4ana&er8. label y tooltip son cadenas de texto usadas respecti"amente como etiqueta y texto de ayuda en los o$jetos dele&ados 3proxy8. 1i label es ?one entonces stock_id a de ser una cadena de

texto que especifique un elemento de serie 31toc( item8 del que se o$tendrlO la etiqueta. 1i tooltip es ?one# entonces la accilmn 3-ction8 no dispondrlO de texto de ayuda. Aomo "eremos en la seccilmn correspondiente a &rupos de acciones 3 Action.roups8 es muc o mlOs flOcil la creacilmn de o$jetos de accilmn utilizando al&unos mlotodos de la clase -ctionGroup) action&roup.addBactions3entries# user.dataM?one8 action&roup.addBto&&leBactions3entries# user.dataM?one8 action&roup.addBradioBactions3entries# 0alueM0# on.changeM?one# user.dataO one8 4lOs adelante profundizaremos en lostos# aunque primeramente descri$iremos clmmo usar una accilmn 3-ction8 con un $otlmn 3Futton8 para ilustrar las operaciones $lOsicas necesarias para conectar una accilmn 3-ction8 a un o$jeto dele&ado. 1>.1.1.!. :so de acciones El procedimiento $lOsico para usar una accilmn 3-ction8 con un $otlmn 3Futton8 como o$jeto dele&ado se ilustra en el pro&rama de ejemplo simp eaction.py. El $otlmn 3Futton8 se conecta a la accilmn 3-ction8 con el mlotodo) action.connectBproxy3proxy8 donde proxy es un control dele&ado del tipo) elemento de menln 4enu:tem# elemento de $arra de erramientas Tool:tem o $otlmn Futton. .na accilmn -ction tiene una selpal# la selpal Eacti"ateE que se dispara cuando la accilmn 3-ction8 se acti"a# &eneralmente como resultado de la acti"acilmn de un control dele&ado 3por ejemplo# cuando se pulsa so$re un $otlmn de una $arra de erramientas ToolFutton8. 1implemente se de$e conectar una retrollamada a esta selpal para &estionar la acti"acilmn de cualquiera de los controles dele&ados. Este es el clmdi&o fuente del pro&rama de ejemplo simp eaction.py) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R QPGusrG$inGen" pyt on import py&t( py&t(.require3N2.0N8 import &t( class 1imple-ction) def BBinitBB3self8) Q Areacilmn de la "entana principal 'indo' M &t(.>indo'38 'indo'.setBsizeBrequest3R0# ;08 'indo'.connect3NdestroyN# lam$da ') &t(.mainBquit388 Q Areacilmn de un &rupo de aceleradores accel&roup M &t(.-ccelGroup38 Q -lpadimos el &rupo de aceleradores a la "entana principal 'indo'.addBaccelB&roup3accel&roup8

1S 1D Q Areacilmn de una accilmn para salir del pro&rama usando un elemento de serie 20 action M &t(.-ction3NHuitN# ?one# ?one# &t(.1T/AKBH.:T8 21 Q Aonexilmn de una retrollamada a la accilmn 22 action.connect3Nacti"ateN# self.quitBc$8 2; 2C Q Areacilmn de un &rupo -ctionGroup llamado 1imple-ction 2J action&roup M &t(.-ctionGroup3N1imple-ctionN8 2I Q -dicilmn de la accilmn al &rupo con un acelerador 2R Q ?one si&nifica que se utilice el acelerador el elemento de serie 2S action&roup.addBactionB'it Baccel3action# ?one8 2D ;0 Q +acer que la accilmn use el &rupo de aceleradores ;1 action.setBaccelB&roup3accel&roup8 ;2 ;; Q Aonectar el acelerador a la accilmn ;C action.connectBaccelerator38 ;J ;I Q Arear el $otlmn para usarlo como control dele&ado para la accilmn ;R quit$utton M &t(.Futton38 ;S Q alpadimos el $otlmn a la "entana principal ;D 'indo'.add3quit$utton8 C0 C1 Q Aonectamos la accilmn a su control dele&ado C2 action.connectBproxy3quit$utton8 C; CC 'indo'.s o'Ball38 CJ return CI CR def quitBc$3self# $8) CS print N1aliendo del pro&ramaN CD &t(.mainBquit38 J0 J1 if BBnameBB MM NBBmainBBN) J2 sa M 1imple-ction38 J; &t(.main38 El ejemplo crea una accilmn 3-ction8 3llnea 208 que usa un elemento de serie que aporta el texto de etiqueta# con un mnemlmnico# un icono# un acelerador y un dominio de traduccilmn. 1i no se usa un elemento de serie# serla necesario especificar en su lu&ar una etiqueta. 5a llnea 22 conecta la selpal Eacti"ateE del la accilmn action al mlotodo self.quitBc$38 de forma que sea in"ocado cuando la accilmn -ction es acti"ada por el $otlmn %uitbutton. 5a llnea C2 conecta %uitbutton a action como control dele&ado. Auando se pulsa so$re %uitbutton loste acti"arlO action y# por tanto# llamarlO al mlotodo self.quitBc$38. El ejemplo simp eaction.py usa $astante clmdi&o 3llneas 1J# 1R# ;1 y ;C para esta$lecer el acelerador del $otlmn8. El proceso es similar para los elementos 4enu:tem y Tool:tem.

Figura 16.1, Ejemp o ;imp e !e Acci@An muestra el resultado de la ejecucilmn del pro&rama simp eaction.py. #igura 1>.1. E)e"plo %i"ple de 3cciMNn

1>.1.1./. CreaciMNn de Controles inter"edios 8Proxy9 En el apartado anterior pre"io "imos clmmo es posi$le la conexilmn de un control existente a una accilmn 3-ction8 como elemento dele&ado. En loste "eremos como es posi$le crear un control dele&ado utilizando los mlotodos de la clase -ction) menuitem M action.createBmenuBitem38 toolitem M action.createBtoolBitem38 El ejemplo 8asicaction.py ilustra una accilmn -ction compartida por un elemento de menln 34enu:tem8# un $otlmn de $arra de erramientas 3ToolFutton8 y un $otlmn ordinario 3Futton8. El elemento de menln 34enu:tem8 y el $otlmn de la $arra de erramientas 3ToolFutton8 se crearlOn usando los mlotodos indicados. El clmdi&o fuente del pro&rama de ejemplo 8asicaction.py es el si&uiente) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I QPGusrG$inGen" pyt on import py&t( py&t(.require3N2.0N8 import &t( class Fasic-ction) def BBinitBB3self8) Q Areacilmn de la "entana principal 'indo' M &t(.>indo'38 'indo'.connect3NdestroyN# lam$da ') &t(.mainBquit388 "$ox M &t(.TFox38 "$ox.s o'38 'indo'.add3"$ox8 Q Areacilmn de un &rupo de aceleradores accel&roup M &t(.-ccelGroup38 Q -dicilmn del &rupo a la "entana principal 'indo'.addBaccelB&roup3accel&roup8 Q Areacilmn de una accilmn para salir del pro&rama utilizando un elemento de serie action M &t(.-ction3NHuitN# NBHuit mePN# NHuit t e Pro&ramN# &t(.1T/AKBH.:T8 action.setBproperty3Ns ortUla$elN# NBHuitN8 Q Aonexilmn de una retrollamada a la accilmn action.connect3Nacti"ateN# self.quitBc$8

2R 2S 2D ;0 ;1 ;2 ;; ;C ;J ;I ;R ;S ;D C0 C1 C2 C; CC CJ CI CR CS CD J0 J1 J2 J; JC JJ JI JR JS JD I0 I1 I2 I; IC IJ II IR IS ID R0 R1 R2 R; RC

Q Areacilmn de un &rupo -ctionGroup llamado Fasic-ction action&roup M &t(.-ctionGroup3NFasic-ctionN8 Q -&re&amos la accilmn al &rupo con un acelerador Q ?one si&nifica que se usa el acelerador del elemento de serie action&roup.addBactionB'it Baccel3action# ?one8 Q +acemos que la accilmn use el &rupo de aceleradores action.setBaccelB&roup3accel&roup8 Q Areacilmn de una $arra de menln menu$ar M &t(.4enuFar38 menu$ar.s o'38 "$ox.pac(Bstart3menu$ar# 7alse8 Q Areacilmn de la accilmn para -rc i"o y el elemento de menln fileBaction M &t(.-ction3N7ileN# NB7ileN# ?one# ?one8 action&roup.addBaction3fileBaction8 fileBmenuitem M fileBaction.createBmenuBitem38 menu$ar.append3fileBmenuitem8 Q Areacilmn del menln de -rc i"o fileBmenu M &t(.4enu38 fileBmenuitem.setBsu$menu3fileBmenu8 Q Areacilmn de un elemento dele&ado menuitem M action.createBmenuBitem38 fileBmenu.append3menuitem8 Q Areacilmn de una $arra de erramientas tool$ar M &t(.Tool$ar38 tool$ar.s o'38 "$ox.pac(Bstart3tool$ar# 7alse8 Q Areacilmn de un elemento dele&ado de la $arra de erramientas toolitem M action.createBtoolBitem38 tool$ar.insert3toolitem# 08 Q Areacilmn y empaquetado de un control de Etiqueta la$el M &t(.5a$el3NNN 1elect 7ileULHuit meP or clic( t e tool$ar Huit $utton or clic( t e Huit $utton $elo' or press Aontrol!q to quit. NNN8 la$el.s o'38 "$ox.pac(Bstart3la$el8

RJ RI Q Areacilmn de un $otlmn para usarlo como otro control dele&ado RR quit$utton M &t(.Futton38 RS Q add it to t e 'indo' RD "$ox.pac(Bstart3quit$utton# 7alse8 S0 S1 Q Aonexilmn de la accilmn a su control dele&ado S2 action.connectBproxy3quit$utton8 S; Q 1e esta$lece el texto de ayuda despulos de que se alpade el elemento a la $arra SC action.setBproperty3NtooltipN# action.&etBproperty3NtooltipN88 SJ tooltips M &t(.Tooltips38 SI tooltips.setBtip3quit$utton# action.&etBproperty3NtooltipN88 SR SS 'indo'.s o'38 SD return D0 D1 def quitBc$3self# $8) D2 print N1aliendo del pro&ramaN D; &t(.mainBquit38 DC DJ if BBnameBB MM NBBmainBBN) DI $a M Fasic-ction38 DR &t(.main38 Este ejemplo presenta un &rupo de acciones -ctionGroup como contenedor de las acciones -ction que se usan en el pro&rama. El apartado so$re &rupos de acciones Action.roups se adentrarlO en mayor detalle en su uso. El clmdi&o de las llneas DU1C esta$lece una "entana principal que contiene una TFox. 5as llneas 1IU;J esta$lecen la accilmn -ction EHuitE 3salir8 de la misma manera que en el pro&rama de ejemplo simp eaction.py y la alpaden con el acelerador de serie &t(.1T/AKBH.:T 3llnea ;28 al &rupo de accilmn -ctionGroup EFasic-ctionE 3creado en la llU nea 2D8. Es de ad"ertir el ec o de que# a diferencia del ejemplo simp eaction.py# aqul no es necesario llamar al mlotodo connectBaccelerator38 para la accilmn puesto que se ace de forma automlOtica cuando se llama al mlotodo createBmenuBitem38 en la llnea J;. 5as llneas ;SUC0 crean una $arra de menln 34enuFar8 y la empaquetan en la TFox. 5as llU neas C;UCC crean una accilmn -ction 3file_action8 para el menln 7ile y la alpaden al &rupo actiongroup. 5os elementos de menln 7ile y Huit son creados en las llneas CJ y J; y alpadidos a la $arra de menlns 3 menubar8 y al menln 3file_menu8 respecti"amente en las llneas CI y JC. :&ualmente se crea una $arra de erramientas 3Tool$ar8 que se alpade a la TFox en las llU neas JRUJD. El elemento de la $arra de erramientas Tool:tem que actlna como dele&ado se crea y alpade a la $arra de erramientas en las llneas I2UI;. +a de ad"ertirse que el texto de ayuda de la accilmn -ction de$e esta$lecerse 3llnea SC8 tras a$er alpadido el elemento de la $arra de erramientas Tool:tem a la propia $arra de erramientas 3Tool$ar8 para que pueda ser usado. @e la misma manera# el texto de ayuda del $otlmn Futton de$e alpadirse de forma manual 3llneas SCUSI8.

Figura 16.0, Ejemp o B@Bsico !e Acci@An muestra el pro&rama de ejemplo 8asicaction.py en accilmn) #igura 1>.!. E)e"plo =MPsico de 3cciMNn

Es posi$le desconectar un control dele&ado 3proxy8 de una accilmn 3-ction8 usando el mlotodo) action.disconnectBproxy3proxy8 1>.1.1.2. Propiedades de 3cciMNn .na accilmn -ction tiene una serie de propiedades que controlan la representacilmn y funcionamiento de sus controles dele&ados. 5as mlOs importantes entre ellas son las propiedades Esensiti"eE y E"isi$leE. 5a propiedad Esensiti"eE determina la sensi$ilidad de los controles dele&ados. 1i Esensiti"eE es 7-51E los controles dele&ados no pueden acti"arse y normalmente se representarlOn en&risecidos. @e la misma manera# la propiedad E"isi$leE determina si los controles dele&ados son o no "isi$les. 1i la propiedad E"isi$leE de una accilmn -ction es 7-51E entonces sus controles dele&ados permanecerlOn ocultos. Aomo "eremos en el si&uiente apartado# la sesi$ilidad o "isi$ilidad de una accilmn -ction tam$ilon estlO controlada por la sensi$ilidad o "isi$ilidad del &rupo de acciones -ctionGroup al que pertenece. Por lo tanto# para que una accilmn -ction sea "isi$le o sensi$le tanto sus propiedades como las del &rupo -ctionGroup al que pertenece de$en concordar. Para esta$lecer la sensi$ilidad o "isi$ilidad efecti"a de una accilmn -ction se de$en usar los si&uientes mlotodos) result M action.isBsensiti"e38 result M action.isB"isi$le38 El nom$re asi&nado a una accilmn -ction se almacena en su propiedad EnameE# que se esta$lece en el momento en que se crea la accilmn -ction. 1e puede o$tener dic o nom$re usando el mlotodo) name M action.&etBname38 /tras propiedades que controlan la "isualizacilmn de los controles dele&ados de una accilmn -ction son) E ideUifUemptyE EisUimportantE 1i es T0.E# se ocultan los dele&ados de menln "aclos para esta accilmn. 1i es T0.E# los elementos de $arra de erramientas Tool:tem dele&ados para esta accilmn muestran su texto en el modo &t(.T//5F-0BF/T+B+/0:f. E"isi$leU 1i es T0.E# el elemento de $arra de erramientas Tool:tem es "isi$le orizontalE cuando la $arra de erramientas tiene orientacilmn orizontal. E"isi$leU"erticalE 1i es T0.E# el elemento de la $arra de erramientas Tool:tem es "isi$le

cuando la $arra de erramientas tiene orientacilmn "ertical. /tras propiedades de interlos son) 5a etiqueta usada para los elementos de menln y $otones que acti"an esta accilmn. Es ortU .na etiqueta mlOs $re"e que puede usarse en $otones de $arras de la$elE erramientas y en $otones. Estoc(UidE El Elemento de 1erie utilizado para o$tener el icono# etiqueta y acelerador que se usarlO en los controles que representen esta accilmn. EtooltipE .n texto de ayuda para esta accilmn. -d"ilortase que el pro&rama de ejemplo 8asicaction.py anula la etiqueta de &t(.1T/AKBH.:T sustituylondola por EBHuit mePE y fija la propiedad Es ortUla$elE a EBHuitE. 5a etiqueta corta se usa para las etiquetas del $otlmn de $arra de erramientas ToolFutton y para la del $otlmn Futton# pero se usa la etiqueta completa en el caso del elemento de menln 4enu:tem. Tam$ilon es de reselpar que no es posi$le esta$lecer el texto de ayuda de un elemento Tool:tem asta que es alpadido a su $arra de erramientas 3Tool$ar8. 1>.1.1.;. 3cciones y 3celeradores .na accilmn -ction tiene tres mlotodos usados para esta$lecer un acelerador) action.setBaccelB&roup3accel.group8 action.setBaccelBpat 3accel.path8 action.connectBaccelerator38 lqstos# ademlOs del mlotodo &t(.-ctionGroup.addBactionB'it Baccel38# de$erlan ser suficientes en los casos en los que se aya de esta$lecer un acelerador. .n &rupo de aceleracilmn -ccelGroup de$e esta$ecerse siempre para una accilmn-ction. El mlotodo setBaccelBpat 38 es llamado por el mlotodo &t(.-ctionGroup.addBactionB'it Baccel38. 1i se usa setBaccelBpat 38 entonces el camino del acelerador de$erla utilizar el formato por defecto) Eg-ctionsLGnom$reBdelB&rupoBdeBaccionesGnom$reBdeBlaBaccilmnE. 7inalmente# el mlotodo connectBaccelerator38 es llamado para completar la confi&uracilmn de un acelerador. ota .na accilmn -ction de$e tener un &rupo -ccelGroup y un camino de acelerador asociado a lol antes de la llamada a connectBaccelerator38. Puesto que el mlotodo connectBaccelerator38 puede ser llamado "arias "eces 3por ejemplo# una "ez por cada control dele&ado8# el nlnmero de llamadas es almacenado# de forma que se produzca un nlnmero i&ual de llamadas al mlotodo disconnectBaccelerator38 antes de que se elimine el acelerador. Tal como se ilustrlm en los pro&ramas de ejemplo anteriores# un acelerador de una accilmn Ela$elE

-ction puede ser usado por todos los controles dele&ados. .na accilmn -ction de$erla ser parte de un &rupo -ctionGroup para poder usar el camino de acelerador por defecto# que tiene el formato) Eg-ctionsLGnom$reBdelB&rupoBdeBaccionesGnom$reBdeBlaBaccilmnE. 5a forma mlOs sencilla de alpadir un acelerador es usar el mlotodo &t(.-ctionGroup.addBactionB'it Baccel38 y el si&uiente mlotodo &eneral) Arear un &rupo de aceleradores -ccelGroup y alpadirlo a la "entana principal. Arear un nue"o &rupo de acciones -ctionGroup Arear una accilmn -ction que especifique un elemento de 1erie con un acelerador. -lpadir la accilmn -ction al &rupo -ctionGroup utilizando el mlotodo &t(.-ctionGroup.addBactionB'it Baccel38 especificando ?one para usar el acelerador del elemento de 1erieo una cadena de acelerador acepta$le por la funcilmn &t(.acceleratorBparse38. Esta$lecer el &rupo -ccelGroup para la accilmn -ction usando el mlotodo &t(.-ction.setBaccelB&roup38. Aompletar la confi&uracilmn del acelerador usando el mlotodo &t(.-ction.connectBaccelerator38. Aualquier control dele&ado creado por o conectado a la accilmn -ction ele&ida utilizarlO el acelerador asl esta$lecido. 1>.1.1.>. 3cciones Con"utables Tal como se mencionlm pre"iamente# una accilmn To&&le-ction es una su$clase de -ction que permite la conmutacilmn entre dos estados. El constructor de una accilmn del tipo To&&le-ction requiere los mismos parlOmetros que una del tipo -ction) to&&leaction M &t(.To&&le-ction3na"e# label# tooltip# stock.id8 -demlOs de los mlotodos de la clase -ction# tam$ilon dispone de los si&uientes mlotodos propios de To&&le-ction) to&&leaction.setBacti"e3is.acti0e8 isBacti"e M to&&leaction.&etBacti"e38 esta$lecer u o$tener el "alor actual de toggleaction. is_active es un "alor $ooleano. Es posi$le conectarse a la selpal Eto&&ledE especificando una retrollamada con la si&natura) def to&&ledBc$3toggleaction# user_data8 5a selpal Eto&&ledE se emite cuando un elemento de accilmn To&&le-ction cam$ia su estado. .n control elemento de menln 4enu:tem dele&ado de una accilmn To&&le-ction se mostrarlO por defecto como un elemento de menln con marca de "erificacilmn 3A ec(4enu:tem8. Para que un elemento dele&ado 4enu:tem se muestre como un elemento de menln del tipo exclusilmn 30adio4enu:tem8 se a de esta$lecer la propiedad Edra'UasUradioE como T0.E usando el mlotodo)

to&&leaction.setBdra'BasBradio3dra(.as.radio8 1e puede usar el si&uiente mlotodo para determinar si los elementos de menln 4enu:tem de una accilmn conmuta$le To&&le-ction se mostrarlOn como elementos de menln del tipo exclusilmn 0adio4enu:tem) dra'BasBradio M to&&leaction.&etBdra'BasBradio38 1>.1.1.@. 3cciones con ExclusiMNn .na accilmn con exclusilmn 0adio-ction es una su$clase de una accilmn conmuta$le To&&le-ction que puede ser a&rupada de manera que solamente una de las acciones 0adio-ction estlO acti"a al mismo tiempo. 5os controles dele&ados correspondiente son 0adio4enu:tem y 0adioToolFutton para $arras de menln y de erramientas# respecti"amente. El constructor de una accilmn 0adio-ction posee los mismos ar&umentos que una accilmn de la clase -ction# con el alpadido de un "alor entero lnnico que se usa para identificar la accilmn 0adio-ction dentro de un &rupo) radioaction M &t(.0adio-ction3name# la$el# tooltip# stoc(Bid# "alue8 El &rupo de una 0adio-ction se puede esta$lecer con el mlotodo) radioaction.setB&roup3group8 donde group es otra accilmn del tipo 0adio-ction al que se de$e a&rupar radioaction. El &rupo que contiene una accilmn 0adio-ction puede o$tenerse con el mlotodo) &roup M radioaction.&etB&roup38 que de"uel"e la lista de o$jetos 0adio-ction que incluye radioaction. El "alor del miem$ro actualmente acti"o del &rupo puede o$tenerse con el mlotodo) acti"eB"alue M radioaction.&etBcurrentB"alue38 1e puede conectar una retrollamada a la selpal Ec an&edE para reci$ir notificacilmn del momento en el que cam$ia el miem$ro acti"o del &rupo de acciones 0adio-ction. ?lmtese que lnnicamente es necesario conectarse a uno de los o$jetos 0adio-ction para se&uir los cam$ios. 5a si&natura de la retrollamada es) def c an&edBc$3radioaction# current# user_data8 donde current es el elemento 0adio-ction actualmente acti"o en el &rupo. 1>.1.1.A. :n e)e"plo de 3cciones El pro&rama de ejemplo actions.py ilustra el uso de los o$jetos de accilmn 3-ction8# accilmn conmuta$le 3To&&le-ction8 y accilmn con exclusilmn 30adio-ction8. Figura 16.1, Ejemp o !e Acciones muestra el pro&rama de ejemplo en funcionamiento)

#igura 1>./. E)e"plo de 3cciones

Este ejemplo es suficientemente parecido a 8asicaction.py como para que no sea precisa una descripcilmn detallada del mismo. 1>.1.!. Grupos de 3cciones 83ctionGroups9 Tal como se mencionlm en el apartado anterior# los o$jetos -ction relacionados de$erlan alpadirse a un &rupo -ctionGroup de manera que se dispon&a de un control conjunto so$re su "isi$ilidad y sensi$ilidad. Por ejemplo# en una aplicacilmn de procesamiento de textos# los elementos de menln y los $otones de la $arra de erramientas que especifican la justificacilmn del texto podrlan estar a&rupados en un -ctionGroup. Es de esperar que una interfaz de usuario ten&a mlnltiples o$jetos -ctionGroup que a$arquen los di"ersos aspectos de la aplicacilmn. Por ejemplo# las acciones &lo$ales tales como la creacilmn de nue"os documentos# a$rir y &uardar un documento y salir de la aplicacilmn pro$a$lemente formen un &rupo -ctionGroup# mientras que acciones tales como la modificacilmn de la "ista del documento formarlan otro. 1>.1.!.1. CreaciMNn de grupos de acciones 83ctionGroups9 .n -ctionGroup se crea mediante el constructor) action&roup M &t(.-ctionGroup3na"e8 donde name es un nom$re lnnico para el &rupo -ctionGroup. El nom$re de$erla ser lnnico puesto que se usa para construir el camino de acelerador por defecto de sus o$jetos -ction. El nom$re de un &ction'roup puede o$tenerse usando el mlotodo) name M action&roup.&etBname38 u o$teniendo el contenido de la propiedad EnameE. 1>.1.!.!. 3diciMNn de 3cciones Tal como se ilustra en el apartado Acciones# se puede alpadir una accilmn -ction existente a un &rupo -ctionGroup utilizando uno de los mlotodos si&uientes) action&roup.addBaction3action8 action&roup.addBactionB'it Baccel3action# accelerator8 donde action es la accilmn -ction que se "a a alpadir y accelerator es una especificacilmn de cadena de acelerador que resulte acepta$le a la funcilmn &t(.acceleratorBparse38. 1i accelerator es ?one se usarlO el acelerador 3si existe8 asociado con la propiedad Estoc(UidE de action. Tal como se indiclm anteriormente# el mlotodo addBactionB'i Baccel38 es el preferi$le si se desea utilizar aceleradores.

El &rupo -ctionGroup ofrece tres mlotodos para acer mlOs sencilla la creacilmn y adicilmn de o$jetos de accilmn 3-ction8 a un &rupo de accilmn 3-ctionGroup8) action&roup.addBactions3entries# user.dataM?one8 action&roup.addBto&&leBactions3entries# user.dataM?one8 action&roup.addBradioBactions3entries# 0alueM0# on.changeM?one# user.dataM?one8 El parlOmetro entries es una secuencia de tuplas de entradas de acciones que aportan la informacilmn necesaria para crear las acciones que se alpaden al &rupo -ctionGroup. El o$jeto 0adio-ction con el "alor value se fija inicialmente como acti"o. on_change es una retrollamada que estlO conectada a la selpal Ec an&edE del primer o$jeto 0adio-ction del &rupo. 5a si&natura de on_changed es) def onBc an&edBc$3radioaction# current# user_data8 5as tuplas de entradas de o$jetos -ction contienen) El nom$re de la accilmn. @e$e especificarse. .n identificador de elemento estlOndar 3stoc( id8 para la accilmn. /pcionalmente puede tener el "alor por defecto ?one si se especifica una etiqueta. 5a etiqueta para la accilmn. /pcionalmente puede tener el "alor por defecto ?one si se a especificado un identificador de elemento estlOndar 3stoc( id8. El acelerador para la accilmn# en el formato comprensi$le para la funcilmn &t(.acceleratorBparse38. /pcionalmente puede tener el "alor por defecto de ?one. El texto de ayuda de la accilmn. /pcionalmente puede tener el "alor por defecto de ?one. 5a funcilmn de retrollamada in"ocada cuando se acti"a la accilmn acti"ated. /pcionalmente puede tener el "alor por defecto ?one. Aomo mlnimo se de$e especificar un "alor para el campo name y un "alor $ien en el campo stock id o el campo label. 1i se especifica una etiqueta entonces se puede indicar ?one como identificador de elemento estlOndar 3stoc( id8 si no se usa uno. Por ejemplo# la si&uiente llamada al mlotodo) action&roup.addBactions3^3NquitN# &t(.1T/AKBH.:T# NBHuit mePN# ?one# NHuit t e Pro&ramN# quitBc$8_8 alpade una accilmn a actiongroup para salir del pro&rama. 5as tuplas de entradas para los o$jetos To&&le-ction son similares a las tuplas de entradas para o$jetos -ction sal"o que existe un campo optati"o adicional flag que contiene un "alor $ooleano que indica si la accilmn estlO acti"a. El "alor por defecto del campo flag es 7-51E. Por ejemplo# la si&uiente llamada) action&roup.addBto&&leBactions3^3Nmute# ?one# NB4uteN# NgcontrolLmN# N4ute t e "olumeN# muteBc$# True8_8 alpade un o$jeto To&&le-ction al &rupo actiongroup y lo confi&ura inicialmente para que estlo acti"o.

5as tuplas de entradas para o$jetos 0adio-ction son semejantes a las de los o$jetos -ction pero incorporan un campo value en "ez del campo callback) El nom$re de la accilmn. @e$e ser especificado. .n identificador de elemento estlOndar 3stoc( id8 para la accilmn. /pcionalmente puede tener el "alor por defecto ?one si se especifica una etiqueta. 5a etiqueta para la accilmn. /pcionalmente puede tener el "alor por defecto ?one si se a especificado un identificador de elemento estlOndar 3stoc( id8. El acelerador para la accilmn# en el formato comprensi$le para la funcilmn &t(.acceleratorBparse38. /pcionalmente puede tener el "alor por defecto de ?one. El texto de ayuda de la accilmn. /pcionalmente puede tener el "alor por defecto de ?one. El "alor 3value8 que se de$e tener el o$jeto de accilmn con exclusilmn. /pcionalmente tiene el "alor por defecto de 0. 1iempre se de$erla especificar en las aplicaciones. Por ejemplo# el si&uiente fra&mento de clmdi&o) radioactionlist M ^3NamN# ?one# NB-4N# NgcontrolLaN# N-4 0adioN# 08 3NfmN# ?one# NB74N# NgcontrolLfN# N74 0adioN# 18 3Nss$N# ?one# NB11FN# NgcontrolLsN# N11F 0adioN# 28_ action&roup.addBradioBactions3radioactionlist# 0# c an&edBc$8 crea tres o$jetos 0adio-ction y esta$lece NamN como la accilmn inicialmente acti"a y c an&edBc$ como la retrollamada empleada cuando cualquiera de las acciones se acti"e. 1>.1.!./. EbtenciMNn de iconos Para o$tener un o$jeto de accilmn 3-ction8 de un &rupo -ctionGroup se utiliza el mlotodo) action M action&roup.&etBaction3action.na"e8 Es posi$le otener una lista de o$jetos -ction contenidos en un -ctionGroup con el mlotodo) actionlist M action&roup.listBactions38 1>.1.!.2. Control de las 3cciones 5a sensi$ilidad y "isi$ilidad de todos los o$jetos -ction de un &rupo de acciones -ctionGroup puede controlarse esta$leciendo los "alores de los atri$utos correspondientes. 5os si&uientes mlotodos facilitan la o$tencilmn y esta$lecimiento de los "alores de las propiedades) isBsensiti"e M action&roup.&etBsensiti"e38 action&roup.setBsensiti"e3sensiti"e8 isB"isi$le M action&roup.&etB"isi$le38 action&roup.setB"isi$le3"isi$le8

7inally you can remo"e an -ction from an -ctionGroup usin& t e met od) action&roup.remo"eBaction3action8 1>.1.!.;. :n e)e"plo de grupo de acciones 83ctionGroup9 El pro&rama de ejemplo actiongroup.py reproduce la $arra de menln y $arra de erramientas del pro&rama de ejemplo actions.py utilizando los mlotodos de -ctionGroup. -demlOs el pro&rama incluye $otones para controlar la sensi$ilidad y "isi$ilidad de los elementos de menln y los elementos de la $arra de erramientas. Figura 16.(, Ejemp o !e Action.roup muestra el pro&rama el funcionamiento) #igura 1>.2. E)e"plo de 3ctionGroup

1>.1.!.>. %eMQales de los grupos de acciones 83ctionGroup9 .na aplicacilmn puede rastrear la conexilmn y eliminacilmn de controles dele&ados en o$jetos del tipo -ction dentro de un &rupo -ctionGroup utilizando las selpales EconnectU proxyE y EdiconnectUproxyE. 5as si&naturas de las retrollamadas de$en ser) def connectBproxyBc$3actiongroup# action# proxy# user_params8 def disconnectBproxyBc$3actiongroup# action# proxy# user_params8 Esto permite que se puedan rastrear cam$ios que permiten acer modificaciones adicionales al nue"o control dele&ado en el momento en que es conectado o para actualizar al&una otra parte de la interfaz de usuario cuando se desconecta uno de los controles dele&ados. 5as selpales EpreUacti"ateE y EpostUacti"ateE permiten a las aplicaciones acer un proceso adicional inmediatamente antes o despulos de que se aya acti"ado una accilmn. 5as si&naturas de las retrollamadas son) def preBacti"ateBc$3action&roup# action# userBparams8 def postBacti"ateBc$3action&roup# action# userBparams8 Estas selpales son utilizadas fundamentalmente por la clase .:4ana&er para pro"eer notificacilmn &lo$al para todos los o$jetos -ction en o$jetos -ctionGroup utilizados por ella. 1>.!. Controles de 7ista Besplegable 8Co"bo=ox9 y 7ista Besplegable con Entrada 8Co"bo=oxEntry9 1>.!.1. Controles Co"bo=ox El control Aom$oFox sustituye el o$soleto /ption4enu con un control potente que utiliza un Tree4odel 3&eneralmente un 5ist1tore8 que proporciona los elementos de la lista que se mostrar9n. El Aom$oFox implementa la interfaz Aell5ayout# que proporcina di"ersos

m%todos para &estionar la "isualizacin de los elementos de la lista. .no o m9s met ods for mana&in& t e display of t e list items. /ne or more Aell0enderers se pueden empaquetar en un Aom$oFox para personalizar la "isualizacin de los elementos de la lista. 1>.!.1.1. :so =5sico de Co"bo=ox 5a forma sencilla de crear y po$lar un Aom$oFox es utilizar la funcin auxiliar) com$o$ox M &t(.com$oB$oxBne'Btext38 Esta funcin crea una Aom$oFox y su almac%n 5ist1tore asociado y lo empaqueta con un Aell0endererText. 5os si&uientes m%todos auxiliares se usan para po$lar o eliminar los contenidos de la Aom$oFox y su 5ist1tore) com$o$ox.appendBtext3text8 com$o$ox.appendBtext3text8 com$o$ox.insertBtext3position# text8 com$o$ox.remo"eBtext3position8 donde text es la cadena que se a=adir9 a la Aom$oFox y position es el <ndice donde se insertar9 o eliminar9 el texto text. En la mayor<a de los casos las funciones y m%todos auxiliares es todo lo que se necesitar9. El pro&rama de ejemplo com8o8ox8asic.py demuestra el uso de las anteriores funciones y m%todos. Figura 16.7, %om8oBox B:sica ilustra el pro&rama en ejecucin) #igura 1>.;. Co"bo=ox =5sica

@esafortunadamente# los desarrolladores de GTK! no proporcionan un m%todo con"eniente para o$tener el texto acti"o. Ese parecer<a un m%todo 2til# pero ser9 necesario crear uno propio simila a) def &etBacti"eBtext3com$o$ox8) model M com$o$ox.&etBmodel38 acti"e M com$o$ox.&etBacti"e38 if acti"e g 0) return ?one return model^acti"e_^0_ El <ndice del elemento acti"o se o$tiene a tra"%s del m%todo) acti"e M com$o$ox.&etBacti"e38 El elemento acti"o se puede esta$lecer con el m%todo) com$o$ox.setBacti"e3index8 donde index es un entero mayor que U2. 1i index es U1 no ay elemento acti"o y el control

Aom$oFox estar9 en $lanco. 1i index es menor que U1# la llamada ser9 i&norada. 1i index es mayor que U1 el elemento de la lista con dic o <ndice ser9 mostrado. 1e puede conectar a la se=al Ec an&edE de un Aom$oFox para reci$ir notificacin del cam$io del elemento acti"o. 5a si&natura del manejador de Ec an&edE es) def c an&edBc$3com$o$ox# ...8) donde ... representa cero o m9s ar&umentos pasados al m%todo G/$ject.connect38. 1>.!.1.!. :so 30an4ado de Co"bo=ox 5a creacin de una lista Aom$oFox mediante la funcin &t(.com$oB$oxBne'Btext38 es aproximadamente equi"alente al si&uiente cdi&o) liststore M &t(.5ist1tore3str8 com$o$ox M &t(.Aom$oFox3liststore8 cell M &t(.Aell0endererText38 com$o$ox.pac(Bstart3cell# True8 com$o$ox.addBattri$ute3cell# NtextN# 08 Para sacar partido de la potencia de las "ariadas clases de o$jetos Tree4odel y Aell0enderer es necesario construir una Aom$oFox utilizando el constructor) com$o$ox M &t(.Aom$oFox3"odelM?one8 donde model es un modelo Tree4odel. 1i se crea una lista Aom$oFox sin asociarle un Tree4odel es posi$le a=adirlo a posteriori utilizando el m%todo) com$o$ox.setBmodel3"odel8 1e puede o$tener el Tree4odel asociado con el m%todo) model M com$o$ox.&etBmodel38 -l&unas de las cosas que se pueden acer con una Aom$oFox son) Aompartir el mismo Tree4odel con otras Aom$oFoxes y TreeTie's. 4ostrar im9&enes y texto en los elementos de la Aom$oFox. .tilizar un Tree1tore o 5ist1tore existente como modelo para los elementos de la lista de la Aom$oFox. .tilizar un Tree4odel1ort para disponer de una lista de Aom$oFox ordenada. .tilizar un Tree4odel7ilter para usar un su$9r$ol de un Tree1tore como fuente de elementos de la lista de la Aom$oFox. .sar un Tree4odel7ilter para utilizar un su$conjunto de las filas de un Tree1tore o 5ist1tore como elementos de la lista de la Aom$oFox. .tilizar una funcin de datos de celda para modificar o sintetizar la "isualizacin de los elementos de la lista. El uso de los o$jetos Tree4odel y Aell0enderer se detalla en el capCtu o !e %ontro es !e #ista !e >r8o .

5os elementos de la lista de la Aom$oFox se pueden mostrar en una ta$la si se tiene un &ran n2mero de elementos que "isualizar. En otro caso# la lista tendr9 flec as de desplazamiento si la lista no puede ser mostrada en su totalidad. El si&uiente m%todo se usa para determinar el n2mero de columnas que se mostrar9n) com$o$ox.setB'rapB'idt 3(idth8 donde width es el n2mero de columnas de la ta$la que muestra los elementos de la lista. Por ejemplo# el pro&rama com8o8ox*rap.py muestra una lista de J0 elementos en J columnas. Figura 16.6, %om8oBox con una 2isposicin Asocia!a ilustra el pro&rama en accin) #igura 1>.>. Co"bo=ox con una Bisposicin 3sociada

Aon un &ran n2mero de elementos# di&amos# por ejemplo# J0# el uso del m%todo setB'rapB'idt 38 tendr9 un mal rendimiento de$ido al c9lculo de la disposicin en ta$la. Para tener una nocin del efecto se puede modificar el pro&rama com8o8ox*rap.py en su l<nea 1S de forma que muestre 1J0 elementos. for n in ran&e31J08) Ejecute el pro&rama para o$tener una idea aproximada del tiempo de inicializacin. 5ue&o modif<quelo comentando la l<nea 1R) Qcom$o$ox.setB'rapB'idt 3J8 Ejecute y cronometre de nue"o. @e$er<a ejecutarse si&nificati"amente m9s r9pido. .nas 20 "eces m9s r9pido. -dem9s del m%todo &etBacti"e38 antes descrito# se puede o$tener un iterador Tree:ter que se=ala la fila acti"a mediante el m%todo) iter M com$o$ox.&etBacti"eBiter38 Tam$i%n se puede esta$lecer el elemento de la lista acti"a usando un iterador Tree:ter con el m%todo) com$o$ox.setBacti"eBiter3iter8 5os m%todos setBro'BspanBcolumn38 y setBcolumnBspanBcolumn38 permiten la especificacin de un n2mero de columna de un Tree4odel que contiene el n2mero de filas o columnas que de$e a$arcar el elemento de la lista en una disposicin de ta$la. @es&raciadamente# en GTK! 2.C estos m%todos funcionan mal. Puesto que Aom$oFox implementa la interfaz Aell5ayout# que tiene capacidades similares a las de una TreeTie'Aolumn 3"%ase la seccin !e )ree#ie*%o umn para m9s informacin8. En resumen# la interfaz proporciona) com$o$ox.pac(Bstart3cell# expandMTrue8 com$o$ox.pac(Bend3cell# expandMTrue8

com$o$ox.clear38 5os dos primeros m%todos empaquetan un Aell0enderer en la Aom$oFox y el m%todo clear38 elimina todos los atri$utos de todos los Aell0enderers. 5os si&uientes m%todos) com$o$oxentry.addBattri$ute3cell# attribute# colu"n8 com$o$oxentry.setBattri$utes3cell# ...8 esta$lecen los atri$utos del Aell0enderer indicado por cell. El m%todo addBattri$ute38 toma una cadena de nom$re de atri$uto attribute 3p.e. NtextN8 y un n2mero entero de columna column de la columna en el Tree4odel usado# para fijar el atri$uto attribute. 5os ar&umentos restante del m%todo setBattri$utes38 son pares atri$utoMcolumna 3p.e. textM18. 1>.!.!. Controles Co"bo=oxEntry El control Aom$oFoxEntry sustituye al control Aom$o. Es una su$clase del control Aom$oFox y contiene un control ijo de entrada Entry que o$tiene sus contenidos seleccionando un elemento en la lista desple&a$le o introduciendo texto directamente en la entrada $ien desde el teclado o pe&9ndolo desde un portapapeles Alip$oard o una seleccin. 1>.!.!.1. :so =5sico de Co"bo=oxEntry Aomo la Aom$oFox# la Aom$oFoxEntry se puede crear con la funcin auxiliar) com$o$oxentry M &t(.com$oB$oxBentryBne'Bentry38 .na Aom$oFoxEntry se de$e rellenar utilizando los m%todos auxiliares de Aom$oFox descritos en 4so B:sico !e %om8oBox. Puesto que un control Aom$oFoxEntry es un control Fin# su control ijo de entrada Entry est9 disponi$le utilizando el atri$uto Ec ildE o el m%todo &etBc ild38) entry M com$o$oxentry.c ild entry M com$o$oxentry.&etBc ild38 1e puede o$tener el texto de la entrada Entry utilizando su m%todo &etBtext38. -l i&ual que Aom$oFox# es posi$le se&uir los cam$ios del elemento acti"o de la lista conect9ndose a la se=al Ec an&edE. @es&raciadamente# esto no permite se&uir los cam$ios en la entrada Entry que se acen por entrada directa. Auando se ace una entrada directa al control Entry se emite la se=al Ec an&edE# pero el <ndice de"uelto por el m%todo &etBacti"e38 ser9 U1. Para se&uir todos los cam$ios del texto de la entrada Entry text# ser9 necesario utilizar la se=al Ec an&edE de la entrada Entry. Por ejemplo) def c an&edBc$3entry8) print entry.&etBtext38

com$o$oxentry.c ild.connect3Nc an&edN# c an&edBc$8 imprimir9 el texto tras cada cam$io en el control ijo Entry. Por ejemplo# el pro&rama com8o8oxentry8asic.py muestra el uso de la -P: auxiliar. Figura 16.", %om8oBoxEntry B:sica ilustra la ejecucin del pro&rama) #igura 1>.@. Co"bo=oxEntry =5sica

/$s%r"ese que cuando se modifica el texto de la entrada Entry de$ido a la seleccin de un elemento de la lista desple&a$le se llama dos "eces al manejador de la se=al Ec an&edE) una "ez cuando se elimina el texto# y# otra cuando el texto se esta$lece desde el elemento seleccionado de la lista. 1>.!.!.!. :so 30an4ado de Co"bo=oxEntry El constructor de una Aom$oFoxEntry es) com$o$oxentry M &t(.Aom$oFoxEntry3"odelM?one# colu"nMU18 donde model es un Tree4odel y column es el n2mero de la columna en el modelo model que se usar9 para fijar los elementos de la lista. 1i no se indica la columna el "alor predeterminado es U1 que si&nifica que el texto de la columna no est9 especificado. 5a creacin de una Aom$oFoxEntry utilizando la &t(.com$oB$oxBentryBne'Btext38 es equi"alente al si&uiente cdi&o) liststore M &t(.5ist1tore3str8 com$o$oxentry M &t(.Aom$oFoxEntry3liststore# 08 5a Aom$oFoxEntry a=ade un par de m%todos que se usan para esta$lecer y recuperar el n2mero de columna del Tree4odel que se usar9 para fijar las cadenas de los elementos de la lista) com$o$oxentry.setBtextBcolumn3text.colu"n8 textBcolumn M com$o$oxentry.&etBtextBcolumn38 5a columna de texto tam$i%n se puede o$tener y especificar utilizando la propiedad EtextU columnE. T%ase la ;eccin !e 4so A&an5a!o !e %om8oBox para m9s informacin so$re el uso a"anzado de una Aom$oFoxEntry. ota 5a aplicacin de$e esta$lecer la columna de texto para que la Aom$oFoxEntry fije los contenidos de la entrada Entry desde la lista desple&a$le. 5a columna de texto 2nicamente puede determinarse una "ez# $ien utilizando el constructor o utilizando el m%todo setBtextBcolumn38. -l crear una Aom$oFoxEntry %sta se empaqueta con un nue"o Aell0endererText que no es accesi$le. El atri$uto NtextN del Aell0endererText se esta$lece como un efecto colateral de la funcin auxiliar

determinacin de la columna de texto utilizando el m%todo setBtextBcolumn38. 1e pueden empaquetar Aell0enderers adicionales en una Aom$oFoxEntry para la "isualizacin en la lista desple&a$le. T%ase la ;eccin !e 4so A&an5a!o !e %om8oBox para m9s informacin. 1>./. Controles =otn de Color y de #uente 8Color=utton y #ont=utton9 1>./.1. Control =otn de Color 8Color=utton9 El control AolorFutton proporciona una forma cmoda de mostrar un color en un $otn. ]ste# al ser pulsado# a$re un di9lo&o de seleccin de color 3Aolor1election@ialo&8. 0esulta 2til para mostrar y esta$lecer los colores en un di9lo&o de preferencias de usuario. .n $otn AolorFutton se encar&a de confi&urar# mostrar y o$tener el resultado del di9lo&o Aolor1election@ialo&. El control AolorFutton se crea con el constructor) color$utton M &t(.AolorFutton3colorM&t(.&d(.Aolor30#0#088 El color inicial se puede especificar con el par9metro color# aunque se puede determinar posteriormente con el m%todo) color$utton.setBcolor3color8 El t<tulo del di9lo&o Aolor1election@ialo& mostrado al pulsar el $otn se puede determinar y o$tener con los m%todos) color$utton.setBtitle3title8 title M color$utton.&etBtitle38 5a opacidad del color se determina utilizando el canal alp a. 5os si&uientes m%todos o$tienen y fijan la opacidad del color en un ran&o de 0 3transparente8 a IJJ;J 3opaco8) alp a M color$utton.&etBalp a38 color$utton.setBalp a3alpha8 @e forma predeterminada se i&nora el "alor alp a# dado que la propiedad EuseBalp aE es 7-51E. El "alor de dic a propiedad EuseBalp aE se puede alterar y o$tener con los m%todos) color$utton.setBuseBalp a3use.alpha8 useBalp a M color$utton.&etBuseBalp a38 1i EuseBalp aE es T0.E 3"erdadero8# entonces el di9lo&o Aolor1election@ialo& muestra un deslizador que modifica la opacidad y muestra el color so$re un fondo en damero. Es posi$le detectar los cam$ios en el color seleccionado conect9ndose a la se=al EcolorU setE# que se emite cada "ez que la usuaria modifica el color. 5a si&natura de la retrollamada es) def colorBsetBc$3color$utton# userBdata8)

El pro&rama de ejemplo co or8utton.py ilustra el uso del $otn a AolorFutton. Figura 16.<, Ejemp o !e Botn !e %o or = %o orButton muestra el pro&rama en ejecucin. #igura 1>.A. E)e"plo de =otn de Color J Color=utton

1>./.!. Control =otn de #uente 8#ont=utton9 -l i&ual que AolorFutton# el control Fotn de fuente 7ontFutton es un control auxiliar que proporciona una "isualizacin de la fuente actualmente seleccionada y# cuando se pulsa so$re %l# a$re un di9lo&o de seleccin de fuente 7ont1election@ialo&. El $otn 7ontFutton se encar&a de confi&urar# mostrar y o$tener el resultado de la llamada al di9lo&o 7ont1election@ialo&. Este control se crea con el constructor) font$utton M &t(.7ontFutton3-ontna"eM?one8 donde fontname es una cadena que especifica la fuente actual del di9lo&o 7ont1election@ialo&. Por ejemplo# el nom$re de la fuente podr<a ser N1ans 12N# N1ans Fold 1CN# o 4onospace :talic 1CN. Aomo m<nimo es necesario indicar la familia y tama=o de la fuente. 5a fuente actual tam$i%n se puede modificar y o$tener con los m%todos) result M font$utton.setBfontBname3-ontna"e8 fontname M font$utton.&etBfontBname38 donde result de"uel"e T0.E o 7-51E para indicar si se pudo cam$iar la fuente con %xito. El control 7ontFutton posee una serie de m%todos y propiedades asociadas que modifican la "isualizacin de la fuente actual en el $otn 7ontFutton. 5as propiedades Es o'UsizeE y Es o'UstyleE contienen "alores $ooleanos que controlan si se muestra el tama=o y estilo de la fuente en la etiqueta del $otn. 5os m%todos si&uientes modifican y o$tienen el "alor de estas propiedades) font$utton.setBs o'Bstyle3sho(.style8 s o'Bstyle M font$utton.&etBs o'Bstyle38 font$utton.setBs o'Bsize3sho(.si4e8 s o'Bsize M font$utton.&etBs o'Bsize38 @e forma alternati"a# es posi$le usar el tama=o y estilo actuales en la etiqueta del $otn para ilustrar inmediatamente la seleccin de fuente. Para ello tenemos las propiedades EuseUsizeE y EuseUfontE y sus m%todos asociados) font$utton.setBuseBfont3use.-ont8 useBfont M font$utton.&etBuseBfont38 font$utton.setBuseBsize3use.si4e8

useBsize M font$utton.&etBuseBsize38 El uso de la fuente actual en la etiqueta resulta 2til a pesar de los cam$ios ine"ita$les que produce en el tama=o del $otn# sin em$ar&o# no ocurre lo mismo con el tama=o de la fuente# especialmente si se usan tama=os muy &randes o muy peque=os. /$s%r"ese adem9s que# si se cam$ian las propiedades EuseUfontE o EuseUsizeE a T0.E y posteriormente se "uel"en a cam$iar a 7-51E# se retiene el 2ltimo "alor de fuente y tama=o "isi$le. Por ejemplo# si EuseUfontE y EuseUsizeE son T0.E y la fuente actual es 4onospace :talic 20# entonces la etiqueta de 7ontFutton se muestra usando la fuente 4onospace :talic 20\ si entonces cam$iamos EuseUfontE y EuseUsizeE a 7-51E y la fuente actual a 1ans 12 la etiquteta toda"<a mostrar9 la fuente 4onospace :talic 20. .se el pro&rama de ejemplo +ont8utton.py para "er cmo funciona todo esto. 7inalmente# el t<tulo del di9lo&o de seleccin de fuente 7ont1election@ialo& se puede modificar y o$tener con los m%todos) font$utton.setBtitle3title8 title M font$utton.&etBtitle38 -l i&ual que un $otn AolorFutton# es posi$le se&uir los cam$ios en la fuente actual conect9ndose a la se=al EfontUsetE que se emite cuando la usuaria modifica la fuente. 5a si&natura de la funcin de retrollamada es la que si&ue) def fontBsetBc$3font$utton# userBdata8) El pro&rama de ejemplo +ont8utton.py ilustra el uso del control 7ontFutton. En %l se pueden modificar las propiedades EuseUfontE# EuseUsizeE# Es o'UsizeE y Es o'UstyleE mediante $otones $iestado. Figura 16.9, Ejemp o !e Botn !e Fuente = FontButton muestra el pro&rama en ejecucin. #igura 1>.F. E)e"plo de =otn de #uente J #ont=utton

1>.2. Controles de Entrada con Co"pletado 8EntryCo"pletion9 .n control EntryAompletion es un o$jeto que se usa con un control de entrada Entry para proporcionar la funcionalidad de completado. Auando la usuaria escri$e en la entrada Entry# el EntryAompletion mostrar9 una "entana con un conjunto de cadenas que coinciden con el texto parcial del Entry. .n EntryAompletion se crea con el constructor) completion M &t(.EntryAompletion38 1e puede usar el m%todo Entry. setBcompletion38 para asociar un EntryAompletion a una entrada Entry) entry.setBcompletion3co"pletion8

5as cadenas usadas por el EntryAompletion para $uscar coincidencias se o$tienen desde un Tree4odel 3&eneralmente un almac%n de lista 5ist1tore8# que de$e ser asi&nado usando el m%todo) completion.setBmodel3"odel8 El EntryAompletion implementa la interfaz Aell5ayout# al i&ual que la TreeTie'Aolumn# para manejar la "isulizacin de los datos del Tree4odel. El si&uiente m%todo confi&ura una EntryAompletion de la manera m9s a$itual 3una lista de cadenas8) completion.setBtextBcolumn3column8 Este m%todo es equi"alente a) cell M Aell0endererText38 completion.pac(Bstart3cell8 completion.addBattri$ute3cell# NtextN# column8 Para esta$lecer el n2mero de caracteres que de$en ser introducidos antes de que EntryAompletion comience a mostrar coincidencias se puede usar el m%todo) completion.setBminimumB(eyBlen&t 3length8 El pro&rama de ejemplo entrycompletion.py demuestra el uso de EntryAompletion. 7i&ura 1I.10# VEntrada con Aompletado 3EntryAompletion8W ilustra el pro&rama en ejecucin. #igura 1>.1G. Entrada con Co"pletado 8EntryCo"pletion9

El pro&rama comienza con un peque=o n2mero de cadenas para el completado que puede ser aumentado escri$iendo en el campo de entrada y presionando la tecla Enter. 1i la cadena es 2nica entonce se a&re&a a la lista de cadenas de completado. 5a funcin de coincidencias preconstruida no diferencia entre may2sculas y min2sculas. 1i se necesita una funcin m9s especializada# se puede usar el si&uiente m%todo para instalar una funcin propia) completion.setBmatc Bfunc3func# user_data8 5a si&natura de func es) def func3completion# (eyBstrin&# iter# data8) donde key_string contiene el texto actual de la entrada Entry# iter es un iterador Tree:ter que se=ala la fila del modelo Tree4odel# y data son datos de usuario user_data. func de$e de"ol"er T0.E si la cadena de completado de la fila tiene que ser desple&ada. El fra&mento de cdi&o mostrado a continuacin usa una funcin de coincidencia para

desple&ar los nom$res de completado que comienzan con el contenido de la entrada y tienen el sufijo dado# en este caso# un nom$re terminado en .pn& para un arc i"o P?G. ... completion.setBmatc Bfunc3endBmatc # 30# N.pn&N88 ... def endBmatc 3completion# entrystr# iter# data8) column# suffix M data model M completion.&etBmodel38 modelstr M model^iter_^column_ return modelstr.starts'it 3entrystr8 and modelstr.ends'it 3suffix8 ... Por ejemplo# si el usuario teclea NfooN y el modelo de completado contiene cadenas como Nfoo$ar.pn&N# Nsmiley.pn&N# Nfoot.pn&N y Nfoo.tifN# las cadenas Nfoo$ar.pn&N y Nfoot.pn&N de$er<an mostrarse como alternati"as. 1>.;. Controles de Expansin 8Expander9 El control Expander es un contenedor $astante simple que permite mostrar u ocultar su control ijo aciendo clic en un tri9n&ulo similar al de un TreeTie'. 1e crean nue"os Expander con el constructor) expander M &t(.Expander3labelM?one8 donde label es una cadena de texto utilizada como etiqueta del expansor. 1i label es ?one o no se especifica# no se crea nin&una etiqueta. -lternati"amente# se puede usar la funcin) expander M &t(.expanderBne'B'it Bmnemonic3labelM?one8 que esta$lece el car9cter de la etiqueta precedido por un &uin $ajo como atajo de teclado mnemnico. El control Expander usa la -P: de Aontainer para a=adir y eliminar su control ijo) expander.add3(idget8 expander.remo"e3(idget8 El control ijo se puede o$tener utilizando el atri$uto de Fin Ec ildE o el m%todo &etBc ild38. 5a opcin que controla la interpretacin de los &uiones $ajos de la etiqueta se puede o$tener y cam$iar con los m%todos) useBunderline M expander.&etBuseBunderline38 expander.setBuseBunderline3useBunderline8 1i se desea usar etiquetas de marcado de Pan&o 3"%ase la -e+erencia !e ,arcas !e Pango para m9s detalles8 en la cadena de la etiqueta se usan los si&uientes m%todos para

esta$lecer y o$tener el estado de la propiedad EuseUmar(upE) expander.setBuseBmar(up3use."arkup8 useBmar(up M expander.&etBuseBmar(up38 7inalmente# se puede utilizar cualquier control como control de etiqueta utilizando el m%todo si&uiente) expander.setBla$elB'id&et3label.(idget8 Hue permite# por ejemplo# poder utilizar una +Fox empaquetada con una ima&en y un texto de etiqueta. 1e puede o$tener y esta$lecer el estado del Expander utilizando los m%todos) expanded M expander.&etBexpanded38 expander.setBexpanded3expanded8 1i expanded es T0.E entonces e muestra el control ijo. En la mayor<a de los casos Expander ace autom9ticamente lo que se desea# al re"elar y ocultar el control ijo. En al&unos casos la aplicacin puede necesitar la creacin de un control ijo en el momento de la expancin. 1e puede usar la se=al Enotify))expandedE para se&uir los cam$ios en el estado de tri9n&ulo expansor. El manejador de la se=al puede entonces crear o modificar el control ijo se&2n se necesite. El pro&rama de ejemplo expan!er.py muestra el uso de Expander. Figura 16.11, %ontro !e Expansin ilustra la ejecucin del pro&rama) #igura 1>.11. Control de Expansin

El pro&rama crea una etiqueta 5a$el que contiene la ora actual y la muestra cuando se expande el expansor. 1>.>. %elecciones de 3rchi0os "ediante el uso de Controles basados en el %elector de 3rchi0os #ileChooser El nue"o modo de seleccionar arc i"os en PyGTK 2.C es el uso de "ariantes del control 7ileA ooser. 5os dos o$jetos que implementan esta nue"a interfaz en PyGTK 2.C son el control de 1eleccin de -rc i"o 7ileA ooser>id&et y el di9lo&o de 1eleccin de -rc i"o 7ileA ooser@ialo&. Este 2ltimo es el di9lo&o completo con la "entana y $otones f9cilmente definidos. El primero es un control 2til para em$e$er en otro control. Tanto el 7ileA ooser>id&et como el 7ileA ooser@ialo& poseen los medios necesarios para na"e&ar por el 9r$ol del sistema de arc i"os y seleccionar fic eros. El aspecto de los controles depende de la accin utilizada para a$rir el control. Para crear un nue"o di9lo&o de seleccin de arc i"os y seleccionar un arc i"o existente 3como en la opcin de una aplicacin t<pica -rc i"oUL-$rir 8# se usa)

c ooser M &t(.7ileA ooser@ialo&3titleM?one#actionM&t(.7:5EBA+//1E0B-AT:/?B/PE?# buttonsM3&t(.1T/AKBA-?AE5#&t(.0E1P/?1EBA-?AE5#&t(.1T/AKB/PE?#&t(.0E1 Para crear un nue"o di9lo&o de seleccin de arc i"os para seleccionar un nue"o nom$re de arc i"o 3como en la opcin de una aplicacin t<pica -rc i"oULGuardar 8# se usa)

c ooser M &t(.7ileA ooser@ialo&3titleM?one#actionM&t(.7:5EBA+//1E0B-AT:/?B1-TE# buttonsM3&t(.1T/AKBA-?AE5#&t(.0E1P/?1EBA-?AE5#&t(.1T/AKB/PE?#&t(.0E1 En los ejemplos anteriores# los dos $otones 3los elementos de serie Aancelar y -$rir8 se crean y conectan a sus respuestas respecti"as 3las respuestas est9ndar Aancelar y /K8. Para fijar la carpeta que se mostrar9 en el selector de arc i"os se usa el m%todo) c ooser.setBcurrentBfolder3pathna"e8 Para esta$lecer el nom$re de arc i"o su&erido# tal como lo introducir<a un usuario 3la t<pica situacin -rc i"oULGuardar como 8# se usa el m%todo) c ooser.setBcurrentBname3na"e8 El m%todo anterior no necesita que exista el nom$re de arc i"o. 1i se quiere seleccionar un arc i"o existente concreto 3tal como en la situacin -rc i"oUL-$rir 8# se de$e usar el m%todo) c ooser.setBfilename3-ilena"e8 Para o$tener el nom$re que a seleccionado la usuaria o so$re la que a ec o clic se usa el m%todo) filename M c ooser.&etBfilename38 Es posi$le permitir selecciones m2ltiples 32nicamente &t(.7:5EBA+//1E0B-AT:/?B/PE?8 utilizando el m%todo) c ooser.setBselectBmultiple3select."ultiple8 donde select_mutiple de$e ser T0.E para permitir selecciones m2ltiples. En este caso# se necesitar9 utilizar el m%todo si&uiente para o$tener una lista de los nom$res de arc i"o seleccionados) filenames M c ooser.&etBfilenames38 .na caracter<stica importante de todos los selectores de arc i"os es la capacidad de a=adir filtros de seleccin de arc i"os. El filtro se a=ade con el m%todo) c ooser.addBfilter3-ilter8 En el ejemplo anterior# filter de$e ser una instancia de la clase 7ile7ilter. El panel izquierdo del selector de arc i"os da una lista de atajos a al&unas carpetas tales como :nicio# 7ilesystem# A@0/4# etc. Es posi$le a=adir una carpeta a la lista de estos para la accin

atajos y eliminarla de ella con los si&uientes m%todos) c ooser.addBs ortcutBfolder3-older8 c ooser.remo"eBs ortcutBfolder3-older8 donde folder es la ruta de la carpeta. El pro&rama de ejemplo -ilechooser.py ilustra el uso del control de seleccin de arc i"os. 7i&ura 1I.12# VEjemplo de 1eleccin de -rc i"osW muestra el resultado de la ejecucin) #igura 1>.1!. E)e"plo de %eleccin de 3rchi0os

El cdi&o fuente del pro&rama de ejemplo -ilechooser.py es) 1 2 ; C J I R S D 10 11 12 1; 1C 1J 1I 1R 1S 1D 20 21 22 2; 2C 2J 2I 2R 2S 2D ;0 ;1 ;2 ;; ;C QPGusrG$inGen" pyt on Q ejemplo filec ooser.py import py&t( py&t(.require3N2.0N8 import &t( Q Aompro$amos la presencia del nue"o py&t() esta es una clase nue"a de PyGt( 2.C if &t(.py&t(B"ersion g 32#;#D08) print EPyGt( 2.;.D0 or later required for t is exampleE raise 1ystemExit dialo& M &t(.7ileA ooser@ialo&3E/pen..E# ?one# &t(.7:5EBA+//1E0B-AT:/?B/PE?# 3&t(.1T/AKBA-?AE5# &t(.0E1P/?1EBA-?AE5# &t(.1T/AKB/PE?# &t(.0E1P/?1EB/K88 dialo&.setBdefaultBresponse3&t(.0E1P/?1EB/K8 filter M &t(.7ile7ilter38 filter.setBname3E-ll filesE8 filter.addBpattern3EZE8 dialo&.addBfilter3filter8 filter M &t(.7ile7ilter38 filter.setBname3E:ma&esE8 filter.addBmimeBtype3Eima&eGpn&E8 filter.addBmimeBtype3Eima&eGjpe&E8 filter.addBmimeBtype3Eima&eG&ifE8 filter.addBpattern3EZ.pn&E8 filter.addBpattern3EZ.jp&E8 filter.addBpattern3EZ.&ifE8

;J ;I ;R ;S ;D C0 C1 C2 C; CC

filter.addBpattern3EZ.tifE8 filter.addBpattern3EZ.xpmE8 dialo&.addBfilter3filter8 response M dialo&.run38 if response MM &t(.0E1P/?1EB/K) print dialo&.&etBfilename38# NselectedN elif response MM &t(.0E1P/?1EBA-?AE5) print NAlosed# no files selectedN dialo&.destroy38

1>.@. El gestor de Inter-aces de :suario :I'anager 1>.@.1. Perspecti0a general .:4ana&er proporciona una manera de crear men2s y $arras de erramientas a partir de una descripcin similar a 645. .:4ana&er usa o$jetos -ctionGroup para &estionar los o$jetos -ction que proporcionan la estructura de control de los elementos del men2 y la $arra de erramientas. -l usar el &estor .:4ana&er se pueden introducir y eliminar din9micamente m2ltiples acciones y descripciones de la :nterfaz de .suario. Ello permite modificar los men2s y las $arras de erramientas con los cam$ios de modo de la aplicacin 3por ejemplo# si cam$ia de edicin de texto a edicin de im9&enes8# o en el caso de que se a=adan o eliminen caracter<sticas accesorias de la aplicacin. 1e puede usar .:4ana&er para crear los men2s y $arras de erramientas de la interfaz de usuario de una aplicacin as<) 1e crear una instancia de .:4ana&er 1e extrae el &rupo de atajos -ccelGroup del .:4ana&er y se a=ade a la "entana de ni"el superior 1e crean las instancias de Grupo de -cciones 3-ctionGroup8 y se rellenan pertinentemente con instancias de acciones -ction. 1e a=aden las instancias de -ctionGroup al .:4ana&er en el orden en el que se desee que aparezcan las instancias de acciones 3-ction8. 1e a=aden las descripciones 645 de la interfaz al &estor .:4ana&er. Es necesario ase&urarse de que todas las acciones -ction referenciadas por las descripciones 645 est9n disponi$les en las instancias de los &rupos -ctionGroup del .:4ana&er. 1e extraen# por nom$re# las referencias a los controles de $arra de men2s# men2 y $arra de erramientas para utilizarlas en la construccin de la interfaz de usuario. 1e modifica din9micamente la interfaz de usuario a=adiendo y eliminando las descripciones de :nterfaz de .suario y a=adiendo# reordenando y eliminando las instancias asociadas de &rupos de acciones 3-ctionGroup8. 1>.@.!. Creacin de un gestor :I'anager 5as instancias de .:4ana&er se crean con el constructor)

uimama&er M &t(..:4ana&er38 5os nue"os .:4ana&er se crean con un &rupo de atajos 3-ccelGroup8 asociado# que puede o$tenerse con el m%todo) accel&roup M uimana&er.&etBaccelB&roup38 El &rupo de atajos 3-ccelGroup8 de$er<a a=adirse a la "entana de ni"el superior de la aplicacin para que las usuarias de la aplicacin puedan usar los atajos de la accin 3-ction8. Por ejemplo) 'indo' M &t(.>indo'38 ... uimana&er M &t(..:4ana&er38 accel&roup M uimana&er.&etBaccelB&roup38 'indo'.addBaccelB&roup3accel&roup8 1>.@./. 3dicin y Eli"inacin de Grupos de 3cciones 83ctionGroups9 Tal como se descri$e en ;eccin 16.1.0, .rupos !e Acciones DAction.roupsE# los &rupos de acciones -ctionGroups pueden llenarse con acciones 3-ctions8 utilizando los m%todos auxiliares addBactions38# addBto&&leBactions38 y addBradioBactions38. 5os &rupos de acciones 3-ctionGroup8 se pueden usar desde un &estor .:4ana&er una "ez que an sido a=adidos a su lista de &rupo de acciones 3-ctionGroup8 con el m%todo) uimana&er.insertBactionB&roup3action.group# pos8 donde pos es el <ndice de la posicin en la que de$er<a insertarse action_group. .n &estor de interfaces .:4ana&er puede contener "arios &rupos de acciones 3-ctionGroups8 con nom$res de acciones 3-ction8 repetidos. Por ello es importante el orden de los o$jetos -ctionGroup# puesto que la $2squeda de una accin 3-ction8 finaliza cuando se encuentra la primera accin 3-ction8 con el nom$re dado. Ello implica que las acciones que est9n en o$jetos -ctionGroup que est9n situados antes ocultan a los que est9n colocados despu%s. 5as acciones referenciadas en una descripcin 645 de la interfaz de usuario de$en a=adirse al .:4ana&er antes que la propia descripcin. 1e puede eliminar un &rupo de acciones -ctionGroup de un &estor de interfaz de usuario .:4ana&er con el m%todo) uimana&er.remo"eBactionB&roup3action.group8 1e puede o$tener la lista de los o$jetos -ctionGroup asociados con un determinado .:4ana&er con el m%todo) action&rouplist M uimana&er.&etBactionB&roups38 1>.@.2. Bescripciones de la Inter-a4 de :suario 5as descripciones de la :nterfaz de .suario aceptadas por .:4ana&er son simples

definiciones 645 con los si&uientes elementos) ui "enubar El elemento ra<z de una descripcin de una :nterfaz de .suario. 1e puede omitir. Puede contener elementos "enubar# popup# toolbar y accelerator. Elemento de ni"el superior que descri$e una estructura de $arra de men2 34enuFar8 y puede contener elementos 'enuIte"# separator# placeholder y "enu. Tiene un atri$uto opcional name 3nom$re8 que# si se omite# toma el "alor Emenu$arE. Elemento de ni"el superior que descri$e una estructura de men2 emer&ente 34enu8 y que puede contener elementos "enuite"# separator# placeholder# y "enu. Tiene un atri$uto opcional name 3nom$re8 que# si se omite# toma el "alor EpopupE. Elemento de ni"el superior que descri$e una estructura de $arra de erramientas 3Tool$ar8 y que puede contener otros elementos toolite"# separator y placeholder. Posee un atri$uto opcional name 3nom$re8 que# si se omite# toma el "alor Etool$arE. Elemento que identifica una posicin dentro de un "enubar# toolbar# popup o "enu. Este elemento puede contener otros elementos "enuite"# separator# placeholder# y "enu. 5os elementos Placeholder se usan al incorporar descripciones de :nterfaz de .suario para permitir# por ejemplo# la construccin de un men2 a partir de descripciones de :nterfaz de usuario utilizando nom$res de contenedores placeholder compartidos. Posee un atri$uto opcional name 3nom$re8# que# si se omite# toma el "alor Eplace olderE. Elemento que descri$e una estructura de men2 4enu y puede contener otros elementos "enuite"# separator# placeholder y "enu. .n elemento "enu tiene un atri$uto o$li&atorio action que denomina un o$jeto de accin -ction que se usar9 en la creacin del 4enu. /pcionalmente puede incluir los atri$utos name 3nom$re8 y position 3posicin8. 1i no se especifica name se usa el "alor correspondiente al elemento action como nom$re. El atri$uto position puede tomar el "alor EtopE 3superior8 o E$ottomE 3inferior8# us9ndose %ste 2ltimo si no se especifica position. Elemento que escri$e un elemento de men2 4enu:tem. El elemento "enuite" posee un atri$uto o$li&atorio action que denomina un o$jeto de accin -ction que se usa para crear el elemento de men2 4enu:tem. Tam$i%n posee los atri$utos optati"os name 3nom$re8 y position 3posicin8. 1i no se indica name entonces se usa el nom$re correspondiente al elemento action. El atri$uto position puede tomar el "alor EtopE 3superior8 o el "alor E$ottomE 3inferior8# us9ndose %ste 2ltimo si no se especifica position. Elemento que descri$e un elemento de $arra de erramientas Tool:tem. El elemento toolite" posee un atri$uto o$li&atorio action que denomina un o$jeto de accin -ction que se usa para crear la $arra de erramientas Tool$ar. Tam$i%n posse los atri$utos optati"os name 3nom$re8 y position 3posicin8. 1i no se indica name entonces se usa el nom$re correspondiente al elemento action. El atri$uto position puede tomar el "alor EtopE 3superior8 o el "alor E$ottomE 3inferior8# us9ndose %ste 2ltimo si no se especifica position. Elemento que descri$e un separador de elemento de men2 1eparator4enu:tem o un separador de elemento de $arra de erramientas

popup

toolbar

placehold er

"enu

"enuite"

toolite"

separator

1eparatorTool:tem se&2n corresponda. accelerat Elemento que descri$e un atajo de teclado 3acelerador8. El elemento or accelerator posee un atri$uto o$li&atorio action que denomina un o$jeto de accin -ction que define la com$inacin de teclas del atajo y que se acti"a con el atajo. Tam$i%n tiene un atri$uto opcional de nom$re name. 1i no se especifica name se usa el nom$re de action como nom$re. Aomo ejemplo# una descripcin de :nterfaz de .suario que se podr<a usar para la creacin de una interfaz similar a la de Figura 16.(, Ejemp o !e Action.roup es) guiL gmenu$ar nameME4enuFarEL gmenu actionME7ileEL gmenuitem actionMEHuitEGL gGmenuL gmenu actionME1oundEL gmenuitem actionME4uteEGL gGmenuL gmenu actionME0adioFandEL gmenuitem actionME-4EGL gmenuitem actionME74EGL gmenuitem actionME11FEGL gGmenuL gGmenu$arL gtool$ar nameMETool$arEL gtoolitem actionMEHuitEGL gseparatorGL gtoolitem actionME4uteEGL gseparator nameMEsep1EGL gplace older nameME0adioFand:temsEL gtoolitem actionME-4EGL gtoolitem actionME74EGL gtoolitem actionME11FEGL gGplace olderL gGtool$arL gGuiL /$s%r"ese que esta descripcin simplemente usa los nom$res de los elementos action como nom$res de la mayor<a de los elementos# en lu&ar de especificar sus atri$utos name. Tam$i%n es desaconseja$le el uso del elemento ui puesto que parece innecesario. 5a jerarqu<a de o$jetos que se crea al usar una descripcin de :nterfaz de .suario es muy parecida a la jerarqu<a de elementos 645 exceptuando que los elementos contenedores placeholder se introducen en sus elementos padre. 1e puede acceder a un control de la jerarqu<a creada por una descripcin de :nterfaz de .suario mediante su ruta# que se compone del nom$re del elemento de control y sus elementos anteriores separados por $arras inclinadas 3EGE8. Por ejemplo# si se usa la descripcin anterior# estas ser<an rutas "9lidas de al&unos controles)

G4enuFar G4enuFarG7ileGHuit G4enuFarG0adioFandG11F GTool$arG4ute GTool$arG0adioFand:temsG74 +ay que o$ser"ar que el nom$re de los contenedores placeholder de$en incluirse en la ruta. Generalmente simplemente se acceder9 a los controles de ni"el superior 3por ejemplo# EG4enuFarE y EGTool$arE8 pero es posi$le que sea necesario acceder a otros controles de ni"el inferior para# por ejemplo# cam$iar una propiedad. 1>.@.;. 3dicin y Eli"inacin de Bescripciones de Inter-a4 de :suario .na "ez que se confi&ura un &estor de :nterfaz de .suario .:4ana&er con un &rupo de acciones -ctionGroup entonces es posi$le a=adir una descripcin de :nterfaz de .suario e inte&rarla con la interfaz existente mediante los si&uientes m%todos) mer&eBid M uimana&er.addBuiBfromBstrin&3bu--er8 mer&eBid M uimana&er.addBuiBfromBfile3-ilena"e8 donde buffer es una cadena que contiene una descripcin de :nterfaz de .suario y filename es el arc i"o que contiene una descripcin de :nterfaz de .suario. -m$os m%todos de"uel"en un identificador merge_id que consiste en un "alor entero 2nico. 1i falla el m%todo se emite la excepcin GError. El identificador merge_id puede usarse para eliminar la descripcin de :nterfaz de .suario del &estor .:4ana&er con el m%todo) uimana&er.remo"eBui3"erge.id8 5os mismos m%todos se pueden usar m9s de una "ez para a=adir descripciones adicionales# que se incorporar9n para o$tener una descripcin 645 de :nterfaz de .suario com$inada. 1e a$lar9 m9s de las :nterfaces de .suario com$inadas de forma m9s detallada en la seccin ;eccin 16.".<, %om8inacin !e 2escripciones !e Fnter+a5 !e 4suario. 1e puede a=adir un elemento sencillo de :nterfaz de .suario a la descripcin existente con el m%todo) uimana&er.addBui3"erge.id# path# na"e# action# type# top8 donde merge_id es un "alor entero 2nico# path es la ruta donde se a=adir9 el nue"o elemento# action es el nom$re de una accin -ction o ?one para a=adir un elemento separator# type es el tipo de elemento que se a de a=adir y top 3superior8 es un "alor $ooleano. 1i top es T0.E el elemento se a=adir9 antes que sus elementos ermanos# y despu%s en caso contrario. merge_id se o$tendr<a con el m%todo) mer&eBid M uimana&er.ne'Bmer&eBid38 5os "alores enteros de"ueltos por el m%todo ne'Bmer&eBid38 son montonamente crecientes.

path 3ruta8 es una cadena compuesta por el nom$re del elemento y los nom$res de sus ancestros unidos por una $arra inclinada 3EGE8 pero sin incluir el nudo optati"o ra<z EGuiE. Por ejemplo# EG4enuFarG0adioFandE es la ruta del elemento "enu llamado E0adioFandE de la si&uiente descripcin de :nterfaz de .suario) gmenu$ar nameME4enuFarEL gmenu actionME0adioFandEL gGmenuL gGmenu$arL El "alor de type 3tipo8 de$e ser uno de los si&uientes) &t(..:B4-?-G El tipo del elemento de :nterfaz de .suario 3menuitem# toolitem o E0B-.T/ separator8 se esta$lece en funcin del contexto. &t(..:B4-?-G .na $arra de men2. E0B4E?.F-0 &t(..:B4-?-G .n men2. E0B4E?. &t(..:B4-?-G .na $arra de erramientas. E0BT//5F-0 &t(..:B4-?-G E0BP5-AE+/5 .n contenedor 3place older8. @E0 &t(..:B4-?-G .n men2 emer&ente. E0BP/P.P &t(..:B4-?-G .n elemento de men2. E0B4E?.:TE4 &t(..:B4-?-G .n elemento de $arra de erramientas. E0BT//5:TE4 &t(..:B4-?-G E0B1EP-0-T/ .n separador. 0 &t(..:B4-?-G E0B-AAE5E0-T .n atajo o acelerador. /0 addBui38 falla sin a"iso si el elemento no es a=adido. El uso de addBui38 es de un ni"el tan $ajo que se de$er<an usar siempre en su lu&ar los m%todos auxiliares addBuiBfromBstrin&38 y addBuiBfromBfile38. 5a adicin de un elemento o una descripcin de :nterfaz de .suario pro"oca la actualizacin de la jerarqu<a de controles en una funcin ociosa 3idle8. 1e puede ase&urar que la jerarqu<a de controles se a actualizado antes de acceder a ella utilizando el m%todo) uimana&er.ensureBupdate38

1>.@.>. 3cceso a los Controles de la Inter-a4 de :suario 1e accede a un control de la jerarqu<a de controles de la :nterfaz de .suario mediante el m%todo) 'id&et M uimana&er.&etB'id&et3path8 donde path 3ruta8 es una cadena que contiene el nom$re del elemento control y sus ancestros de la forma que se descri$e en ;eccin 16.".(, 2escripciones !e a Fnter+a5 !e 4suario. Por ejemplo# dada la si&uiente descripcin de :nterfaz de .suario) gmenu$ar nameME4enuFarEL gmenu actionME7ileEL gmenuitem actionMEHuitEGL gGmenuL gmenu actionME1oundEL gmenuitem actionME4uteEGL gGmenuL gmenu actionME0adioFandEL gmenuitem actionME-4EGL gmenuitem actionME74EGL gmenuitem actionME11FEGL gGmenuL gGmenu$arL gtool$ar nameMETool$arEL gtoolitem actionMEHuitEGL gseparatorGL gtoolitem actionME4uteEGL gseparator nameMEsep1EGL gplace older nameME0adioFand:temsEL gtoolitem actionME-4EGL gtoolitem actionME74EGL gtoolitem actionME11FEGL gGplace olderL gGtool$arL que aya sido a=adida al &estor .:4ana&er uimanager# es posi$le acceder a la $arra de men2s 34enuFar8 y $arra de erramientas 3Tool$ar8 para su uso en una "entana de aplicacin 3>indo'8 utilizando el cdi&o que si&ue) 'indo' M &t(.>indo'38 "$ox M &t(.TFox38 menu$ar M uimana&er.&etB'id&et3NG4enuFarN8 tool$ar M uimana&er.&etB'id&et3NGTool$arN8 "$ox.pac(Bstart3meun$ar# 7alse8 "$ox.pac(Bstart3tool$ar# 7alse8 @e la misma forma# se accede a los controles de los ni"eles inferiores mediante sus rutas.

Por ejemplo# se accede al elemento de la clase 0adioToolFutton llamado E11FE as<) ss$ M uimana&er.&etB'id&et3NGTool$arG0adioFand:temsG11FN8 Para facilitar las cosas# se pueden o$tener todos los controles de ni"el superior de un determinado tipo mediante el m%todo) tople"els M uimana&er.&etBtople"els3type8 donde type especifica el tipo de los controles que se de"ol"er9n usando una com$inacin de las $anderas) &t(..:B4-?-GE0B4E?.F-0# &t(..:B4-?-GE0BT//5F-0 y &t(..:B4-?-GE0BP/P.P. 1e puede usar el m%todo &t(.>id&et.&etBname38 para determinar qu% control de ni"el superior se tiene. 1e puede o$tener la accin -ction que usa el control auxiliar asociado con un elemento de :nterfaz de .suario usando el m%todo) action M uimana&erB&etBaction3path8 donde path 3ruta8 es una cadena que contiene la ruta a un elemento de la :nterfaz de .suario de uimanager. 1i el elemento no posee una accin -ction asociada entonces se de"uel"e ?one. 1>.@.@. E)e"plo sencillo de Gestor de Inter-a4 :I'anager uimanager.py es un ejemplo sencillo de pro&rama que ilustra el uso de un &estor de interfaz de usuario .:4ana&er. Figura 16.11, Programa senci o !e .estor !e Fnter+a5 !e 4suario 4F,anager muestra el pro&rama en funcionamiento. #igura 1>.1/. Progra"a sencillo de Gestor de Inter-a4 de :suario :I'anager

El pro&rama de ejemplo uimanager.py usa la descripcin 645 de ;eccin 16.".6, Acceso a os %ontro es !e a Fnter+a5 !e 4suario. El texto de las dos etiquetas se cam$ian como respuesta a la acti"acin de la accin $iestado 3To&&le-ction8 E4uteE y de las acciones de exclusin m2tua 30adio-ction8 E-4E# E74E and E11FE. Todas las acciones est9n contenidas en un 2nico &rupo de acciones 3-ctionGroup8 que permite que se pueda conmutar la sensi$ilidad y "isi$ilidad de todos los controles auxiliares de las acciones mediante los $otones $iestado E1ensiti"eE y ETisi$leE. El uso del elemento contenedor placeholder se descri$e posteriormente en ;eccin 16.".<, %om8inacin !e 2escripciones !e Fnter+a5 !e 4suario. 1>.@.A. Co"binacin de Bescripciones de Inter-a4 de :suario 5a com$inacin de descripciones de :nterfaz de .suario se ace en funcin del nom$re de los elementos 645. Tal como se indic m9s arri$a# los elementos indi"iduales de la jerarqu<a pueden ser accedidos usando un nom$re de ruta que est9 formado por el nom$re del elemento y los nom$res de sus ancestros. Por ejemplo# si usamos la descripcin de :nterfaz de .suario de ;eccin 16.".(, 2escripciones !e a Fnter+a5 !e 4suario# el elemento toolite" E-4E tiene la ruta EGTool$arG0adioFand:temsG-4E mientras que el elemento "enuite" E74E tiene la ruta EG4enuFarG0adioFandG74E.

1i se com$ina una descripcin de :nterfaz de .suario con esa descripcin de :nterfaz entonces sus elementos se a=aden como elementos del mismo ni"el que los elementos existentes. Por ejemplo# si la descripcin de :nterfaz de .suario) gmenu$ar nameME4enuFarEL gmenu actionME7ileEL gmenuitem actionME1a"eE positionMEtopEGL gmenuitem actionME?e'E positionMEtopEGL gGmenuL gmenu actionME1oundEL gmenuitem actionME5oudnessEGL gGmenuL gmenu actionME0adioFandEL gmenuitem actionMEAFEGL gmenuitem actionME1 ort'a"eEGL gGmenuL gGmenu$arL gtool$ar nameMETool$arEL gtoolitem actionME1a"eE positionMEtopEGL gtoolitem actionME?e'E positionMEtopEGL gseparatorGL gtoolitem actionME5oudnessEGL gseparatorGL gplace older nameME0adioFand:temsEL gtoolitem actionMEAFEGL gtoolitem actionME1 ort'a"eEGL gGplace olderL gGtool$arL se a=ade a nuestra descripcin de :nterfaz de .suario de ejemplo) gmenu$ar nameME4enuFarEL gmenu actionME7ileEL gmenuitem actionMEHuitEGL gGmenuL gmenu actionME1oundEL gmenuitem actionME4uteEGL gGmenuL gmenu actionME0adioFandEL gmenuitem actionME-4EGL gmenuitem actionME74EGL gmenuitem actionME11FEGL gGmenuL gGmenu$arL gtool$ar nameMETool$arEL gtoolitem actionMEHuitEGL gseparatorGL gtoolitem actionME4uteEGL gseparator nameMEsep1EGL

gplace older nameME0adioFand:temsEL gtoolitem actionME-4EGL gtoolitem actionME74EGL gtoolitem actionME11FEGL gGplace olderL gGtool$arL se crear<a la si&uiente descripcin de :nterfaz de .suario com$inada) gmenu$ar nameME4enuFarEL gmenu nameME7ileE actionME7ileEL gmenuitem nameME?e'E actionME?e'EGL gmenuitem nameME1a"eE actionME1a"eEGL gmenuitem nameMEHuitE actionMEHuitEGL gGmenuL gmenu nameME1oundE actionME1oundEL gmenuitem nameME4uteE actionME4uteEGL gmenuitem nameME5oudnessE actionME5oudnessEGL gGmenuL gmenu nameME0adioFandE actionME0adioFandEL gmenuitem nameME-4E actionME-4EGL gmenuitem nameME74E actionME74EGL gmenuitem nameME11FE actionME11FEGL gmenuitem nameMEAFE actionMEAFEGL gmenuitem nameME1 ort'a"eE actionME1 ort'a"eEGL gGmenuL gGmenu$arL gtool$ar nameMETool$arEL gtoolitem nameME?e'E actionME?e'EGL gtoolitem nameME1a"eE actionME1a"eEGL gtoolitem nameMEHuitE actionMEHuitEGL gseparatorGL gtoolitem nameME4uteE actionME4uteEGL gseparator nameMEsep1EGL gplace older nameME0adioFand:temsEL gtoolitem nameME-4E actionME-4EGL gtoolitem nameME74E actionME74EGL gtoolitem nameME11FE actionME11FEGL gtoolitem nameMEAFE actionMEAFEGL gtoolitem nameME1 ort'a"eE actionME1 ort'a"eEGL gGplace olderL gseparatorGL gtoolitem nameME5oudnessE actionME5oudnessEGL gseparatorGL gGtool$arL 1i se examina el 645 resultante se puede "er que los elemnentos "enuite" E?e'E y E1a"eE se an com$inado antes que el elemento EHuitE como resultado de a$er fijado el

atri$uto EpositionE a EtopE# que si&nifica que el elemento de$e ser antepuesto. @e la misma forma# los elementos toolite" E?e'E y E1a"eE se an antepuesto a ETool$arE. /$s%r"ese que los elementos E?e'E y E1a"eE son in"ertidos en el proceso de com$inacin. El elemento toolite" E5oudnessE se a=ade tras los elementos ETool$arE y aparece el 2ltimo en la descripcin com$inada de la :nterfaz de .suario# aunque no sea as< en su propia descripcin de :nterfaz de .suario. El elemento placeholder E0adioFand:temsE en am$as :nterfaces de .suario com$ina los elementos toolite" EAFE y E1 ort'a"eE con los elementos E-4E# E74E# and E11FE. 1i no se u$iese usado el elemento placeholder E0adioFand:temsE entonces los elementos EAFE y E1 ort'a"eE se a$r<an situado tras el elemento E5oudnessE. 1e puede o$tener una representacin de la descripcin de :nterfaz de .suario utilizada por un &estor .:4ana&er con el m%todo) uidesc M uimana&er.&etBui38 El pro&rama de ejemplo uimerge.py muestra la com$inacin de las descripciones de :nterfaz de .suario anteriores. Figura 16.1(, Ejemp o 4F,erge ilustra la :nterfaz ori&inal y la com$inada) #igura 1>.12. E)e"plo :I'erge

El pro&rama de ejemplo usa tres o$jetos -ctionGroup) /$jetos -ction para los men2s E7ileE# E1oundE y E0adio FandE /$jetos -ction para los men2s EHuitE# E4uteE# E-4E# E74E# E11FE y E0adio FandE /$jetos -ction para los elementos E5oudnessE# EAFE y E1 ort'a"eE 5os controles de $otn $iestado 3To&&leFutton8 E1ensiti"eE y Tisi$leE controlan la sensi$ilidad y "isi$ilidad de 2nicamente el se&undo &rupo de acciones 3-ctionGroup8. 1>.@.F. %e+ales de :I'anager .:4ana&er posee una par de se=ales interesantes a las que se puede conectar una aplicacin. 5a se=al EactionsUc an&edE se emite cuando se a=ade o elimina un &rupo de acciones -ctionGroup de un &estor .:4ana&er. 5a si&natura de la retrollamada es) def call$ac(3uimanager# ...8 5a se=al EaddU'id&etE se emite cuando se crea un control auxiliar 4enuFar o Tool$ar. 5a si&natura de la retrollamada es) def call$ac(3uimanager# widget# ...8 donde widget es el control reci%n creado.