Publicado el 5 de Mayo del 2018
1.511 visualizaciones desde el 5 de Mayo del 2018
1,0 MB
59 paginas
Creado hace 12a (01/05/2011)
Tema 4 Interfaces gráficas con GTK
Curso de Python Avanzado
Juan Pedro Bolívar Puente
Instituto Andaluz de Astrofísica
Mayo de 2011
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
1 / 59
Índice
Introducción
1
2 Fundamentos de GTK
3 Un paseo por los “widgets”
4 Conclusiones
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
2 / 59
Índice
Introducción
Introducción
1
2 Fundamentos de GTK
3 Un paseo por los “widgets”
4 Conclusiones
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
3 / 59
Introducción
Desarrolladores ...
¿Qué hemos visto
hasta ahora?
Cosas de frikis...
Lambdas
Objetos
Metaprogramación
Estructuras infinitas
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
4 / 59
Introducción
... y usuarios
¿Qué quieren los
usuarios?
Hacer cosas
guays sin
pensar
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
5 / 59
Introducción
Las interfaces gráficas...
Las Interfaces Gráficas son la solución
Usan metáforas
Combinan visualizar y modificar
Evitan memorizar
Facilitan la multitarea
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
6 / 59
Fundamentos de GTK
Índice
Introducción
1
2 Fundamentos de GTK
3 Un paseo por los “widgets”
4 Conclusiones
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
7 / 59
Fundamentos de GTK
Frameworks de interfaces gráficas
Usamos un framework de interfaces gráficas
GTK
Gnome, Ubuntu, Novell
Qt
KDE, Kubuntu, Nokia
TkInter
Python, Tcl/Tk
Interfaces nativas...
¿WxWidgets?
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
8 / 59
Fundamentos de GTK
Framework vs Biblioteca
Librería
Componentes que
llamamos desde
nuestro código
Framework
Estructura
que llama a
nuestro código
No nos llames, ya te llamaremos
El Principio de Hollywood
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
9 / 59
Fundamentos de GTK
La base de un programa en GTK
¡El main lo ejecuta GTK!
import pygtk
pygtk . require ( ’ 2.0 ’)
import gtk
if __name__ == ’ __main__ ’:
gtk . main ()
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
10 / 59
Fundamentos de GTK
Estructura del programa
1 Crear interfaz gráfica
2 Conectar manejadores
3 Ejecutar main
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
11 / 59
Fundamentos de GTK
Eventos en GTK
La base de todo en GTK es gobject.GObject
Un GObject expone señales — e.g. ‘‘clicked’’
En cada señal podemos conectar un manejador
def handler ( o b j e t o _ e m i s o r
[ , params fijados al emitir ]
[ , params fijados al conectar ])
Una señal se emite con ...
o b j e t o _ e m i s o r . emit ( " segnal " , ...)
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
12 / 59
Fundamentos de GTK
Conectando a señales ...
Conectando señales
connect (sig, handler, ...)
connect after (sig, handler, ...)
Re-envío de señales
connect object (sig, handler, gobj)
connect object after (sig, handler, gobj)
Devuelen un hdlid que identifica la conexión
El grupo after se ejecuta después de las “normales”
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
13 / 59
Fundamentos de GTK
Manejando la conexión
Desconectando la señal
disconnect (hdlid)
Bloqueando la señal
block (hdlid)
unblock (hdlid)
¡Recuerda!
Una conexión
es un recurso
El bloqueo es
útil para evitar la
recursión infinita
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
14 / 59
Fundamentos de GTK
Un ejemplo ...
Una clase con señales ...
import gobject
class MyClass ( gobject . GObject ):
_ _ g s i g n a l s _ _ = {
’ mysig ’ : ( gobject . SIGNAL_RUN_FIRST ,
None ,
( object ,))
}
El diccionario
gsignals
permite definir las
señales de los objetos de una clase
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
15 / 59
Fundamentos de GTK
Un ejemplo ..
Usando nuestra clase ...
def m y _ h a n d l e r ( obj , param , * fixed ):
print " -- Handling signal -- "
print " Obj : " , obj
print " Param : " , param
print " Fixe : " , fixed
obj = MyClass ()
obj . connect ( ’ mysig ’ , my_handler , ’ Hola ! ’)
obj . emit ( ’ mysig ’ , None )
obj . emit ( ’ mysig ’ , ’ param ’)
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
16 / 59
Fundamentos de GTK
Las propiedades
Las propiedades son atributos “especiales” que
emiten una señal al cambiar
No confundir con property de Python
No son necesariamente físicos, se manipulan
internamente mediante una función
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
17 / 59
Fundamentos de GTK
Las propiedades
Manipulando las propiedades ...
set propertie[s] (property, ...)
get propertie[s] (property, ...)
obj . props . width = 10
var = obj . props . width
Requiere PyGTK 2.8
Controlando la emisión ...
notify (property name)
freeze notify ()
thaw notify ()
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
18 / 59
Fundamentos de GTK
Ejemplo ...
Una clase con propiedades...
class MyClass ( gobject . GObject ):
_ _ g p r o p e r t i e s _ _ = {
’ width ’ : ( object ,
’ Ancho ’ ,
’ El ancho del objeto ’ ,
gobject . P A R A M _ R E A D W R I T E )
}
def d o _ g e t _ p r o p e r t y ( self , prop ):
return getattr ( self , ’_ ’+ prop . name )
def d o _ s e t _ p r o p e r t y ( self , prop , val ):
setattr ( self , ’_ ’+ prop . name , val )
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
19 / 59
Fundamentos de GTK
Ejemplo ...
Usando las propiedades ...
a = MyClass ()
a . connect ( ’ notify :: width ’ ,
m y _ h a n d l e r )
a . props . width = 10
print a . props . width
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
20 / 59
Un paseo por los “widgets”
Índice
Introducción
1
2 Fundamentos de GTK
3 Un paseo por los “widgets”
4 Conclusiones
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
21 / 59
Un paseo por los “widgets”
¿Qué es un widget?
Widget = Window gadget
Un lenguaje gráfico universal
Ventanas, diálogos, botones, menús, pestañas, lista desplegable, caja
de texto, etiquetas, opciones, multi-opciones, ...
Se organizan jerárquicamente
Una ventana contiene una pestaña que contiene una lista que
contiene un botón que contiene una imágen ...
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
22 / 59
Un paseo por los “widgets”
En GTK...
Todo lo que hereda de gtk.Widget
Pueden estar activados o desactivados...
show () / hide ()
show all () / hide all ()
Lo aplica a todo el subárbol de la jerarquía
Tiene una interfaz extensa común...
[get,set] name, get parent, get ancestor
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
23 / 59
Un paseo por los “widgets”
Los toplevels
toplevel = raiz del árbol de widgets
Derivados de gtk.Window
GTK guarda una lista en gtk.gdk.Screen
Al cerrarse una ventana se destruye
Podemos evitar que se cierre devolviendo False en
la señal "delete-event"
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
24 / 59
Un paseo por los “widgets”
Gestión de recursos ...
Los objetos de GTK son un recurso
Se “liberan” con gtk.Object.destroy ()
Al hacerlo, emiten "destroy", que significa:
¡Borra cualquier referencia que tengas hacia mí!
El objeto sigue usable si sigue habiendo referencias
En la práctica necesario sólo en toplevels
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
25 / 59
Un paseo por los “widgets”
Recordemos al amigo with
Disponible en gfits/src/util.py
@ c o n t e x t m a n a g e r
def d e s t r o y i n g ( thing ):
try :
yield thing
finally :
thing . destroy ()
Veremos su utilidad con los diálogos...
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
26 / 59
Un paseo por los “widgets”
Nuestra primera ventana...
import gtk
win = gtk . Window ()
win . connect ( ’ destroy ’ , gtk . m ai n_ q ui t )
win . show ()
gtk . main ()
También podríamos parar el bucle
en la señal ”delete-event”
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
27 / 59
Un paseo por los “widgets”
Metiendo cosas en la ventana ...
¿Cómo organizamos los widgets dentro
de la ventana?
Primera idea:
Colocarlos en posiciones (X, Y) determinadas
Mala idea:
Las ventanas deben poder cambiar de tamaño
Juan Pedro Bolívar Puente (Instituto Andaluz de Astrofísica)
Tema 4 Interfaces gráficas con GTK
Mayo de 2011
28 / 59
Un paseo por los “widgets”
Comentarios de: Tema 4 Interfaces gráficas con GTK - Curso de Python Avanzado (0)
No hay comentarios