Académique Documents
Professionnel Documents
Culture Documents
Primavera 2015
Prlogo
El presente material ha sido elaborado en el laboratorio de sistemas embebidos UPAEP, y se ha desarrollado con la experiencia de estudiantes y
profesores que han colaborado en dicho laboratorio. Hay material propio de
clases y otro material generado a travs de proyectos de vinculacin y consultoria. Cualquier comentario o correccin favor de enviarlo por correo al
autor.
El autor
Casimiro Gmez Gonzlez
Doctor en Ingeniera Mecatrnica
correo: casimiro.gomez@upaep.mx
ndice general
1. Virtualizando Linux
1.1.
. . . . . . . . . . . . . . . . . .
1.2.
1.2.1.
Tux
1.2.2.
Distribuciones de Linux
1.3.
1.4.
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
10
Virtualizacin . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.3.1.
12
15
2.3.
24
Instalando Eclipse . . . . . . . . . . . . . . . . . . . . . . . . .
25
25
2.2.1.
Paso 1 . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.2.2.
Paso 2 y Paso 3 . . . . . . . . . . . . . . . . . . . . . .
25
2.2.3.
Paso 4 y paso 5 . . . . . . . . . . . . . . . . . . . . . .
27
Instalando PyDev . . . . . . . . . . . . . . . . . . . . . . . . .
27
3. Introduccin a Python
32
3.1.
Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
3.2.
Herencia Mltiple . . . . . . . . . . . . . . . . . . . . . . . . .
36
3.3.
Polimorsmo
. . . . . . . . . . . . . . . . . . . . . . . . . . .
37
3.4.
Encapsulacin . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
3.5.
Clases mejoradas
39
3.6.
Mtodos Especiales . . . . . . . . . . . . . . . . . . . . . . . .
40
3.7.
. . . . . . . . . . . . . . . . . . .
41
3.7.1.
Diccionarios . . . . . . . . . . . . . . . . . . . . . . . .
41
3.7.2.
Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . .
42
3.7.3.
Listas
43
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
ndice general
3.8.
Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
51
4.1.
Dependencias
4.2.
Instalando en Elementary OS
. . . . . . . . . . . . . . . . . .
51
4.3.
52
4.4.
53
4.5.
54
4.5.1.
55
Propiedades . . . . . . . . . . . . . . . . . . . . . . . .
4.6.
Cadenas
4.7.
Contenedores de Layout
4.7.1.
4.8.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cajas
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
Entrada de datos
. . . . . . . . . . . . . . . . . . . . . . . . .
UPAEP
51
56
56
57
58
Captulo 1
Virtualizando Linux
A lo largo de este curso todo el material se ejecutar en el Sistema Operativo Linux. Por ellos primero entenderemos Que es Linux? De donde
Proviene?
altruista.
En 1984 comenz el desarrollo de lo que ms tarde sera GNU/Linux
cuando la Free Software Foundation
comenz
1 Tomado
de la pgina https://www.debian.org/releases/etch/hppa/ch01s02.html.es
UPAEP
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
UPAEP
de informtica de la Universidad de Helsinki, empez a programar las primeras lneas de cdigo de un sistema operativo(nalmente llamado LINUX
) como una acin y sin poderse imaginar la gran repercusin que traera.
Hubo una primera versin no ocial de Linux 0.01, pero esta solo inclua el
comienzo del ncleo, estaba escrita en lenguaje ensamblador y asuma que
uno tena acceso a un sistema Minix para su compilacin. El 5 de octubre
de 1991, Linus anuncio la primera versin ocial de Linux (versin 0.02).
Con esta versin Linus pudo ejecutar Bash (GNU Bourne Again Shell) y gcc
(El compilador GNU de C).Desde aquel entonces se han hecho muchsimas
versiones con ayuda de programadores de todo el mundo. Linux es un sistema operativo compatible con Unix, sus dos caractersticas principales y que
los diferencian del resto de los sistemas operativos que encontramos en el
mercado son:
Es software libre, esto signica que no tenemos que pagar por el uso
del mismo.
El sistema viene acompaado del cdigo fuente (el sistema lo forman el
ncleo del sistema (kernel) mas un gran numero de libreras que hacen
posible su utilizacin).
Las plataformas en las que en un principio se puede utilizar Linux son:
Pentium, Pentium Pro, Pentium II/III/IV, Amiga y Atari, tambin existen
versiones para su utilizacin en otras plataformas, como Alpha, ARM, MIPS,
PowerPC y SPARC. En los ltimos tiempos, ciertas casas de software comercial han empezado a distribuir sus productos para Linux y la presencia del
mismo en empresas aumenta rpidamente por la excelente relacin calidadprecio que se consigue con Linux.
1.2.1.
Tux
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
10
1.2.2.
Distribuciones de Linux
Una distribucin es un conjunto de aplicaciones reunidas por un grupo, empresa o persona para permitir instalar fcilmente un sistema Linux.
En general se destacan por las herramientas para conguracin y sistemas
de paquetes de software a instalar. Una distribucin no es otra cosa, que
una recopilacin de programas y cheros, organizados y preparados para su
instalacin. Estas distribuciones se pueden obtener a travs de Internet, o
comprando los CDs de las mismas, los cuales contendrn todo lo necesario
para instalar un sistema Linux bastante completo y en la mayora de los
2 La
pgina es http://lewing.org/
UPAEP
11
casos un programa de instalacin que nos ayudara en la tarea de una primera instalacin. Casi todos los principales distribuidores de Linux, ofrecen la
posibilidad de bajarse sus distribuciones, via FTP (sin cargo alguno).
Existen muchas y variadas distribuciones creadas por diferentes empresas
y organizaciones a unos precios bastantes asequibles (si se compran los CDs,
en vez de bajrsela via FTP).
A continuacin se muestra una grca con todas las distribuciones a lo
largo de los ltimos aos. Este grco es grande.
1.3. Virtualizacin
En Informtica, virtualizacin es la creacin -a travs de software- de una
versin virtual de algn recurso tecnolgico, como puede ser una plataforma
de hardware, un sistema operativo, un dispositivo de almacenamiento u otros
recursos de red. Dicho de otra manera, se reere a la abstraccin de los
recursos de una computadora, llamada Hypervisor o VMM (Virtual Machine
Monitor) que crea una capa de abstraccin entre el hardware de la mquina
fsica (host) y el sistema operativo de la mquina virtual (virtual machine,
guest), dividindose el recurso en uno o ms entornos de ejecucin.
Esta capa de software (VMM) maneja, gestiona y arbitra los cuatro recursos principales de una computadora (CPU, Memoria, Dispositivos Perifricos
y Conexiones de Red) y as podr repartir dinmicamente dichos recursos entre todas las mquinas virtuales denidas en el computador central. Esto hace
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
12
1.3.1.
UPAEP
13
continuacin encontramos la capa de virtualizacin, con un sistema de archivos propietario y una capa de abstraccin de servicio de kernel que garantiza
el aislamiento y seguridad de los recursos entre distintos contenedores. La
capa de virtualizacin hace que cada uno de los contenedores aparezca como
servidor autnomo. Finalmente, el contenedor aloja la aplicacin o carga de
trabajo.
Virtualizar el sistema operativo es una opcin interesante si no queremos
instalar dos sistemas operativos en el mismo ordenador, pero si por el contrario lo que hacemos es instalarlo, todos los sistemas operativos que tengamos
instalados funcionaran de la misma manera que si estuvieran instalados en
distintos ordenadores.
El nico y pequeo inconveniente es que necesitamos un gestor de arranque que al encender nuestro ordenador nos d la opcin de elegir qu sistema
operativo queremos utilizar, lo que conlleva que si por ejemplo estamos en
Windows y queremos cambiar a GNU/Linux deberamos reiniciar nuestro
ordenador. La virtualizacin por el contrario permite cambiar de sistema
operativo como si se tratase de cualquier otro programa, sin embargo, esta
agilidad tiene la desventaja de que un sistema operativo virtualizado no es
tan potente como uno que ya estuviera instalado
3 Tomado
de http://es.wikipedia.org/wiki/Virtualizacin
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
14
UPAEP
15
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
16
UPAEP
17
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
18
la versin que debe ser ubuntu y el nmero de bits coincidir con la versin
del nmero de bits bajado del archivo linux. En el paso 7 se da next.
En la gura 1.12 se pueden ver los pasos 8 (donde se establece el nombre
de la maquina virtual), el paso 9 donde se establece la carpeta donde se
c 2015 Laboratorio de Sistemas Embebidos
UPAEP
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
19
20
UPAEP
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
21
22
UPAEP
23
iso de la mquina virtual para poder correrla sin volver a instalar el sistema
operativo.
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
Captulo 2
Instalando Python y el IDE para
la programacin
Cuando compilamos un programa escrito en C o en Fortran generamos
un ejecutable. Para hacer funcionar ese ejecutable nos basta con muy poca
cosa; en el caso de un hola, mundo basta con simplemente ejecutarlo. El
sistema operativo lo considera ejecutable y simplemente cumple sus ordenes.
Esto no sucede as en los lenguajes interpretados. El cdigo en Python
nunca llega a traducirse a algo que el sistema operativo pueda entender. En
Python el programa termina convertido en un ensamblador propio que una
mquina virtual es capaz de entender y ejecutar. La consecuencia principal
de este mtodo es que es imprescindible contar con un intrprete de Python
instalado en el ordenador para poder ejecutar cdigo en Python.
Esta no es hoy en da una condicin demasiado severa. El nico sistema
operativo mayoritario que no cuenta con un intrprete de Python instalado
por omisin es Windows. Linux, Mac OSX, Solaris y AIX entre otros cuentan
con uno, aunque algunas veces compensa instalar una versin ms actualizada
que la que encontraremos en la distribucin del sistema operativo. En el caso
especial de Windows bastar con descargarse un instalador, darle doble clic
y decir que s a todo.
Cuando ejecutamos cdigo en Python lo lanzamos a un intrprete que es
capaz de entender este lenguaje. A diferencia de los lenguajes estticos como
C o Fortran en el que un compilador convierte el cdigo de programa en un
ejecutable que el sistema operativo es capaz de entender.
25
Paso 1
2.2.2.
Paso 2 y Paso 3
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
26
UPAEP
27
2.2.3.
Paso 4 y paso 5
password de tu cuenta,
enter para que inicie la instalacin
solo
Work with
debe elegirse
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
28
UPAEP
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
29
30
UPAEP
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
31
Captulo 3
Introduccin a Python
Para entender este paradigma primero tenemos que comprender qu es
una clase y qu es un objeto. Un objeto es una entidad que agrupa un estado
y una funcionalidad relacionadas. El estado del objeto se dene a travs de
variables llamadas atributos, mientras que la funcionalidad se modela a travs
de funciones a las que se les conoce con el nombre de mtodos del objeto.
Un ejemplo de objeto podra ser un coche, en el que tendramos atributos
como la marca, el nmero de puertas o el tipo de carburante y mtodos como
arrancar y parar. O bien cualquier otra combinacin de atributos y mtodos
segn lo que fuera relevante para nuestro programa.
Una clase, por otro lado, no es ms que una plantilla genrica a partir de
la cul instanciar los objetos; plantilla que es la que dene qu atributos y
mtodos tendrn los objetos de esa clase.
Volviendo a nuestro ejemplo: en el mundo real existe un conjunto de
objetos a los que llamamos coches y que tienen un conjunto de atributos
comunes y un comportamiento comn, esto es a lo que llamamos clase. Sin
embargo, mi coche no es igual que el coche de mi vecino, y aunque pertenecen
a la misma clase de objetos, son objetos distintos.
En Python las clases se denen mediante la palabra clave
class seguida
class
Coche :
""" A b s t r a c c i o n
def
de
__init__ ( s e l f ,
los
objetos
gasolina ):
c o c h e . """
33
s e l f . gasolina = gasolina
print
def
def
gasolina ,
arrancar ( s e l f ) :
if
s e l f . gasolina >
print
else :
print
0:
arranca " )
conducir ( s e l f ) :
if
s e l f . gasolina >
s e l f . gasolina
print
else :
print
se
0:
1
s e l f . gasolina ,
mueve " )
self
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
34
objeto.atributo y objeto.metodo():
mi_coche . g a s o l i n a
3
>>> mi_coche . a r r a n c a r ( )
Arranca
>>> mi_coche . c o n d u c i r ( )
Quedan
litros
>>> mi_coche . c o n d u c i r ( )
Quedan
litros
>>> mi_coche . c o n d u c i r ( )
Quedan
litros
>>> mi_coche . c o n d u c i r ( )
No
se
mueve
>>> mi_coche . a r r a n c a r ( )
No
arranca
>>>
mi_coche . g a s o l i n a
0
Como ltimo apunte recordar que en Python, como ya se coment en
repetidas ocasiones anteriormente, todo son objetos. Las cadenas, por ejemplo, tienen mtodos como upper(), que devuelve el texto en maysculas o
count(sub), que devuelve el nmero de veces que se encontr la cadena sub
en el texto.
3.1. Herencia
Hay tres conceptos que son bsicos para cualquier lenguaje de programacin orientado a objetos: el encapsulamiento, la herencia y el polimorsmo.
En un lenguaje orientado a objetos cuando hacemos que una clase (subclase) herede de otra clase (superclase) estamos haciendo que la subclase
contenga todos los atributos y mtodos que tena la superclase. No obstante
al acto de heredar de una clase tambin se le llama a menudo extender una
c 2015 Laboratorio de Sistemas Embebidos
UPAEP
35
clase.
Supongamos que queremos modelar los instrumentos musicales de una
banda, tendremos entonces una clase Guitarra, una clase Batera, una clase
Bajo, etc. Cada una de estas clases tendr una serie de atributos y mtodos,
pero ocurre que, por el mero hecho de ser instrumentos musicales, estas clases
compartirn muchos de sus atributos y mtodos; un ejemplo sera el mtodo
tocar().
Es ms sencillo crear un tipo de objeto Instrumento con las atributos y
mtodos comunes e indicar al programa que Guitarra, Batera y Bajo son
tipos de instrumentos, haciendo que hereden de Instrumento.
Para indicar que una clase hereda de otra se coloca el nombre de la clase
de la que se hereda entre parntesis despus del nombre de la clase:
class Instrumento :
def __init__ ( s e l f
def
def
precio ):
s e l f . precio = precio
tocar ( s e l f ) :
( " Estamos
tocando
musica " )
romper ( s e l f ) :
print
print
( " Eso
lo
pagas
tu " )
s e l f . precio ,
Como Bateria y Guitarra heredan de Instrumento, ambos tienen un mtodo tocar() y un mtodo romper(), y se inicializan pasando un parmetro
precio. Pero, qu ocurrira si quisiramos especicar un nuevo parmetro
tipo_cuerda a la hora de crear un objeto Guitarra? Bastara con escribir un
nuevo mtodo __init__ para la clase Guitarra que se ejecutara en lugar
del __init__ de Instrumento. Esto es lo que se conoce como sobreescribir
mtodos.
Ahora bien, puede ocurrir en algunos casos que necesitemos sobreescribir
un mtodo de la clase padre, pero que en ese mtodo queramos ejecutar el
mtodo de la clase padre porque nuestro nuevo mtodo no necesite ms que
ejecutar un par de nuevas instrucciones extra. En ese caso usaramos la sintaxis SuperClase.metodo(self, args) para llamar al mtodo de igual nombre de
la clase padre. Por ejemplo, para llamar al mtodo __init__ de Instrumento
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
36
self .
Acuatico ) :
class Terrestre :
def d e s p l a z a r ( s e l f ) :
print ( " E l a n i m a l anda " )
class Acuatico :
def d e s p l a z a r ( s e l f ) :
print ( " E l a n i m a l nada " )
class Cocodrilo ( Terrestre , Acuatico ) :
pass
c = Cocodrilo ()
c . desplazar ()
UPAEP
37
3.3. Polimorsmo
La palabra polimorsmo, del griego
poly morphos
3.4. Encapsulacin
La encapsulacin se reere a impedir el acceso a determinados mtodos
y atributos de los objetos estableciendo as qu puede utilizarse desde fuera
de la clase. Esto se consigue en otros lenguajes de programacin como Java
utilizando modicadores de acceso que denen si cualquiera puede acceder a
esa funcin o variable (public) o si est restringido el acceso a la propia clase
(private).
En Python no existen los modicadores de acceso, y lo que se suele hacer
es que el acceso a una variable o funcin viene determinado por su nombre:
si el nombre comienza con dos guiones bajos (y no termina tambin con dos
guiones bajos) se trata de una variable o funcin privada, en caso contrario
es pblica. Los mtodos cuyo nombre comienza y termina con dos guiones
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
38
bajos son mtodos especiales que Python llama automticamente bajo ciertas
circunstancias.
En el siguiente ejemplo slo se imprimir la cadena correspondiente al
mtodo publico(), mientras que al intentar llamar al mtodo __privado()
Python lanzar una excepcin quejndose de que no existe (evidentemente
existe, pero no lo podemos ver porque es privado).
c l a s s Ejemplo :
def p u b l i c o ( s e l f ) :
print ( " P u b l i c o " )
def __privado ( s e l f ) :
print ( " P r i v a d o " )
e j = Ejemplo ( )
ej . publico ()
e j . __privado ( )
Este mecanismo se basa en que los nombres que comienzan con un doble
guin bajo se renombran para incluir el nombre de la clase (caracterstica
que se conoce con el nombre de
setters.
c l a s s F e ch a ( ) :
def __init__ ( s e l f
def
def
):
s e l f . __dia = 1
getDia ( s e l f ) :
return
s e l f . __dia
setDia ( s e l f ,
if
dia > 0
and
dia ) :
dia <
31:
s e l f . __dia = d i a
else :
print
UPAEP
getters
39
m i _ f e c h a = F ec h a ( )
mi_fecha . s e t D i a ( 3 3 )
Esto se podra simplicar mediante propiedades, que abstraen al usuario
del hecho de que se est utilizando mtodos entre bambalinas para obtener
y modicar los valores del atributo:
c l a s s F e ch a ( object ) :
def __init__ ( s e l f
def
def
):
s e l f . __dia = 1
getDia ( s e l f ) :
return
s e l f . __dia
setDia ( s e l f ,
if
dia > 0
and
dia ) :
dia <
31:
s e l f . __dia = d i a
else :
print ( " E r r o r " )
d i a = property ( g e t D i a ,
setDia )
m i _ f e c h a = F ec h a ( )
m i _ f e c h a . d i a = 33
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
40
realmente un nuevo tipo, sino que todos los objetos creados a partir de clases,
fueran estas las clases que fueran, eran de tipo
instance.
__init__(self, args).-
__new__(cls, args).- Mtodo exclusivo de las clases de nuevo estilo que se ejecuta antes que __init__ y que se encarga de construir
y devolver el objeto en s. Es equivalente a los constructores de C++ o
Java. Se trata de un mtodo esttico, es decir, que existe con independencia de las instancias de la clase: es un mtodo de clase, no de objeto,
y por lo tanto el primer parmetro no es self, sino la propia clase:
cls.
__str__(self).-
__cmp__(self, otro).-Mtodo llamado cuando se utilizan los operadores de comparacin para comprobar si nuestro objeto es menor,
mayor o igual al objeto pasado como parmetro. Debe devolver un nmero negativo si nuestro objeto es menor, cero si son iguales, y un
nmero positivo si nuestro objeto es mayor. Si este mtodo no est denido y se intenta comparar el objeto mediante los operadores <, <=,
>o >= se lanzar una excepcin. Si se utilizan los operadores == o
!= para comprobar si dos objetos son iguales, se comprueba si son el
mismo objeto (si tienen el mismo id).
c 2015 Laboratorio de Sistemas Embebidos
UPAEP
__len__(self).-
41
3.7.1.
Diccionarios
D.get(k[, d])
Busca el valor de la clave k en el diccionario. Es equivalente a utilizar
D[k] pero al utilizar este mtodo podemos indicar un valor a devolver por
defecto si no se encuentra la clave, mientras que con la sintaxis D[k], de no
existir la clave se lanzara una excepcin.
D.has_key(k)
Comprueba si el diccionario tiene la clave k. Es equivalente a la sintaxis
k in D.
D.items()
Devuelve una lista de tuplas con pares clave-valor.
D.keys()
Devuelve una lista de las claves del diccionario.
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
42
D.pop(k[, d])
Borra la clave k del diccionario y devuelve su valor. Si no se encuentra
dicha clave se devuelve d si se especic el parmetro o bien se lanza una
excepcin.
D.values()
Devuelve una lista de los valores del diccionario.
3.7.2.
Cadenas
sub
en la cadena. Los
-1 si no se encontr.
sub
en la
S.join(sequence)
Devuelve una cadena resultante de concatenar las cadenas de la secuencia
sep
UPAEP
43
S.split([sep [,maxsplit]])
Devuelve una lista conteniendo las subcadenas en las que se divide nuestra
cadena al dividirlas por el delimitador sep. En el caso de que no se especique
sep, se usan espacios. Si se especica maxsplit, este indica el nmero mximo
de particiones a realizar.
3.7.3.
Listas
L.append(object)
Aade un objeto al nal de la lista.
L.count(value)
Devuelve el nmero de veces que se encontr value en la lista.
L.extend(iterable)
Aade los elementos del iterable a la lista.
L.insert(index, object)
Inserta el objeto object en la posicin index.
L.pop([index])
Devuelve el valor en la posicin index y lo elimina de la lista. Si no se
especica la posicin, se utiliza el ltimo elemento de la lista.
L.remove(value)
Eliminar la primera ocurrencia de value en la lista.
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
44
L.reverse()
Invierte la lista. Esta funcin trabaja sobre la propia lista desde la que se
invoca el mtodo, no sobre una copia.
3.8. Excepciones
Las excepciones son errores detectados por Python durante la ejecucin
del programa. Cuando el intrprete se encuentra con una situacin excepcional, como el intentar dividir un nmero entre 0 o el intentar acceder a
un archivo que no existe, este genera o lanza una excepcin, informando al
usuario de que existe algn problema.
Si la excepcin no se captura el ujo de ejecucin se interrumpe y se
muestra la informacin asociada a la excepcin en la consola de forma que el
programador pueda solucionar el problema.
Veamos un pequeo programa que lanzara una excepcin al intentar
dividir 1 entre 0.
def
def
division (a ,
return
b):
calcular ():
division (1 ,
0)
calcular ()
Si lo ejecutamos obtendremos el siguiente mensaje de error:
$
python
Traceback
e j e m p l o . py
( most
recent
call
last ):
UPAEP
" e j e m p l o . py " ,
45
line
7,
in
line
5,
in
calcular
line
2,
in
division
calcular ()
File
" e j e m p l o . py " ,
division (1 ,
File
a
0)
" e j e m p l o . py " ,
b
ZeroDivisionError :
integer
division
or
modulo
by
zero
try :
f =
except :
print
( " El
archivo
no
existe ")
Python permite utilizar varios except para un solo bloque try, de forma
que podamos dar un tratamiento distinto a la excepcin dependiendo del
tipo de excepcin de la que se trate. Esto es una buena prctica, y es tan
sencillo como indicar el nombre del tipo a continuacin del except.
try :
num =
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
46
except NameError :
print ( " La v a r i a b l e
except V a l u e E r r o r :
print ( " E l v a l o r no
no
existe ")
es
un
numero " )
try :
num =
print ( n o _ e x i s t e )
except ( NameError , V a l u e E r r o r ) :
print ( " O c u r r i o un e r r o r " )
La construccin try-except puede contar adems con una clausula else,
que dene un fragmento de cdigo a ejecutar slo si no se ha producido
ninguna excepcin en el try.
try :
num = 33
except :
print
else :
print
( "Hubo un
( " Todo
error ! ")
esta
bien " )
try :
z = x
except Z e r o D i v i s i o n E r r o r :
print ( " D i v i s i o n p o r c e r o " )
finally :
print ( " L i m p i a n d o " )
Tambin es interesante comentar que como programadores podemos crear
y lanzar nuestras propias excepciones. Basta crear una clase que herede de
Exception o cualquiera de sus hijas y lanzarla con raise.
c 2015 Laboratorio de Sistemas Embebidos
UPAEP
47
c l a s s MiError ( Exception ) :
def __init__ ( s e l f , v a l o r ) :
def
try :
if
s e l f . valor = valor
__str__ ( s e l f ) :
return
( " Error
resultado >
raise
" +
str ( s e l f
. valor ))
20:
MiError ( 3 3 )
except M i E r r o r ,
print ( e )
e:
48
EOFError(StandardError):
chero.
ImportError(StandardError):
rango posible.
ese nombre.
UnboundLocalError(NameError):
ninguna variable.
ReferenceError(StandardError):
RuntimeError(StandardError):
especicado.
SyntaxError(StandardError):
ticos.
c 2015 Laboratorio de Sistemas Embebidos
UPAEP
49
UnicodeTranslateError(UnicodeError):
code.
StopIteration(Exception):
dor.
ractersticas obsoletas.
FutureWarning(Warning):
cambiar en un futuro.
PendingDeprecationWarning(Warning):
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
50
UPAEP
Captulo 4
Programacin Bsica con Python
GTK+ 3
PyGObject es un modulo de python que permite a los desarrolladores
acceder a las libreras GObject tales como GTK+ dentro de python. Estas
libreras suportan exclusivamente GTK+ version 3 o posteriores. Si tu deseas
utilizar GTK+ 2 en tus aplicaciones, utiliza PyGTK, en su lugar.
4.1. Dependencias
GTK+ 3
Python 3 o posterior
gobject-introspection
sudo
a p t g e t
install
p y t h o n 3g i
52
200X200
#! / usr / b i n / python3
from g i . r e p o s i t o r y import
pixeles.
Gtk
Gtk . m a i n _ q u i t )
win . s h o w _ a l l ( )
Gtk . main ( )
A continuacin explicare cada linea del ejemplo
#! / usr / b i n / python3
La primera linea de todos los programas python deben iniciar con #! seguido
por la ruta al interprete Python que se desee utilizar, en nuestro caso es
python3.
from
gi . repository
import
Gtk
Para poder acceder a las clases y funciones GTK+ debemos primero importar
el mdulo Gtk. La siguiente linea crea una ventana vaca.
win = Gtk . Window ( )
Seguida por la conexin al evento de la cerrar la ventana para asegurar
que la aplicacin es terminada cuando se da click en la opcin de cerrar
ventana.
c 2015 Laboratorio de Sistemas Embebidos
UPAEP
53
Gtk . m a i n _ q u i t )
s i m p l e _ e x a m p l e . py
#! / usr / b i n / python3
from g i . r e p o s i t o r y import
class
def
Gtk
t i t l e =" H o l a Mundo" )
s e l f . b o t o n = Gtk . B u t t o n ( l a b e l =" C l i c k
s e l f . boton . c o n n e c t ( " c l i c k e d " ,
s e l f . on_button_clicked )
s e l f . add ( s e l f . b o t o n )
def
on_button_clicked ( s e l f ,
print ( " H o l a
widget ) :
Mundo" )
win = MiVentana ( )
win . c o n n e c t ( " d e l e t e e v e n t " ,
Aqui " )
Gtk . m a i n _ q u i t )
win . s h o w _ a l l ( )
Gtk . main ( )
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
54
class
t i t l e =" H o l a Mundo" )
Las siguientes tres lineas son utilizadas para crear un widget de boton,
conectarlo a la seal clicked y agregarlo al widget de la ventana
s e l f . b o t o n = Gtk . B u t t o n ( l a b e l
=" C l i c k
Aqui " )
s e l f . on_button_clicked )
s e l f . add ( s e l f . b o t o n )
Debido a las instrucciones anteriores cuando se de click al boton el mtodo
on_button_clicked() se ejecutar
def
on_button_clicked ( s e l f ,
widget ) :
( " H o l a Mundo" )
MiVentana.
Gtk.Window,
se crea
UPAEP
55
un boton de Abrir tu podras desplegar un dialogo para seleccionar un archivo. Despus de que una rutina
callback ,
data )
te.En segundo lugar un evento se presenta. Cada widget tiene sus propios y
particulares eventos que pueden ocurrir. Por ejemplo, si tienes un botn lo
conectaras a un evento clicked. Esto signica que cuando el botn es pulsado, se enva una seal. En tercer lugar, el argumento de la funcin callback es
el nombre de la funcin callback. Esta funcin contiene el cdigo que correr
cuando la seal de un tipo especco es enviada. Finalmente, los argumentos
de datos incluyen cualquier dato que deba pasarse cuando una seal es enviada. Sin embargo, este argumento es opcional y puede no enviarse sino se
requiere.
La funcin regresa un nmero que identica esta particular dupla sealcallback. Se se necesita desconectar la seal de una funcin callback entonces:
widget . d i s c o n n e c t ( handler_id )
Si perdiste el handler_id por alguna razn, tu todavia ouedes desconectar la callback especca usando la siguiente funcion
widget . disconnect_by_func ( c a l l b a c k )
Casi todas las aplicaciones conectarn la seal del evento delete-event
con la ventana de mas alto nivel. Esta seal es emitida si el usuario requiere
que la ventana de mas alto nivel sea cerrada. El manejador por default para
esta seal destruye la ventana, pero no termina la aplicacin. Conectando
la seal delete-event a la funcin Gtk.main_quit resultar en el comportamiento deseado.
window . c o n n e c t ( " d e l e t e e v e n t " ,
Gtk . m a i n _ q u i t )
4.5.1.
Propiedades
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
56
des. Por ejemplo, un boton tiene la propiedad label la cual contiene el texto
de letrero del botn. Tu puedes especcar en nombre y valor de cualquier
numero de propiedades como argumentos claves cuando se crea una instancia
de un widget. Para crear un texto alineado a la derecha con el texto Hola
Mundo y con un ngulo de 25 grados, usar:
label
= Gtk . L a b e l ( l a b e l
= " H o l a Mundo" ,
a n g l e =25 ,
h a l i g n = Gtk . A l i g n
lo cual es equivalente a:
label
= Gtk . L a b e l ( )
l a b e l . s e t _ l a b e l ( " H o l a Mundo" )
l a b e l . set_angle (25)
l a b e l . s e t _ h a l i g n ( Gtk . A l i g n .END)
4.6. Cadenas
En python todas las cadenas son almacenadas como Unicode es una ins-
TypeError.
UPAEP
57
valores centrales para cada widget. GTK+ entonces utiliza toda esta informacin para cambiar los posiciones y tamaos cuando el usuario manipula
la ventana.
GTK+ arregla los widgets jerarquicamente, usando contenedores. Estos
contenedores son invisibles para el usuario nal y son insertados en una ventana, o colocados uno dentro de otro de los componentes de layout. Hay dos
tipos de contenedores: Contenedores de un solo hijo, de los cuales todos son
descendientes de
4.7.1.
Cajas
Las cajas son contenedores invisibles dentro de los cuales podemos empaquetar nuestros widgets. CUando empaquetamos widgets dentro de una caja
horizontal, los objetos son colocados horizontalmente de izquierda a derecha
dependiendo de donde
Gtk.Box.pack_start()
Gtk.Box.pack_end()
son usados. En una caja vertical, los widgets son empaquetados desde la
cima hasta el fondo o vice versa. Es posible usar cualquier combinacin de
cajas dentro o a lado de otras cajas para crear el efecto deseado.
Ejemplo de cajas
Ahora disearemos un programa pero con dos botones
from
gi . repository
class
def
import
Gtk
t i t l e =" H o l a Mundo" )
s e l f . box . p a c k _ s t a r t ( s e l f . b o t o n 1 ,
True ,
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
True , 0 )
58
s e l f . b o t o n 2 = Gtk . B u t t o n ( l a b e l
s e l f . boton2 . connect ( " c l i c k e d " ,
s e l f . box . p a c k _ s t a r t ( s e l f . b o t o n 2 ,
def
True ,
on_button1_clicked ( s e l f ,
widget ) :
widget ) :
True , 0 )
win = MiVentana ( )
win . c o n n e c t ( " d e l e t e e v e n t " ,
Gtk . m a i n _ q u i t )
win . s h o w _ a l l ( )
Gtk . main ( )
Primero, se crea una caja orientada horizontalmente en donde los hijos
son separados por 6 pixeles. Esta caja es la hija de la ventana principal o de
mas alto nivel.
s e l f . box = Gtk . Box ( s p a c i n g = 6 )
s e l f . add ( s e l f . box )
Posteriormente, se agregan dos botones en la caja contenedora.
s e l f . b o t o n 1 = Gtk . B u t t o n ( l a b e l
s e l f . boton1 . connect ( " c l i c k e d " ,
s e l f . box . p a c k _ s t a r t ( s e l f . b o t o n 1 ,
s e l f . b o t o n 2 = Gtk . B u t t o n ( l a b e l
s e l f . boton2 . connect ( " c l i c k e d " ,
True ,
True , 0 )
s e l f . box . p a c k _ s t a r t ( s e l f . b o t o n 2 ,
True ,
True , 0 )
UPAEP
59
Ocasionalmente querremos hacer una entrada de datos de solo lectura. Esto puede realizarse introduciendo FALSE al mtodo
Gtk.Entry.set_editable().
Los widgets de entrada de datos pueden tambin ser usados para pedir password a los usuarios. Es una prctica comn ocultar los caracteres
que va introduciendo el usuario para prevenir revelar el password a terceros.
Llamando al mtodo
texto se oculte.
El widget Gtk.Entry tiene la habilidad de desplegar el progreso o informacin de la actividad detrs del texto. Esto es similar al widget Gtk.ProgressBar
y es comnmente encontrado en los navegadores web para indicar cuando se
ha completado cuando bajas un archivo o pgina. Para desplegar esta infor-
Gtk.Entry.set_progress_fraction(), Gtk_Entry.set_progress_pulse_step(),
Gtk_Entry.progress_pulse().
macin, usa
o
tooltip
a un cono, usar
Gtk.Entry.set_icon_tooltip_text()
o la correspondiente funcin.
4.8.1.
Ejemplo
GObject
t i t l e =" E n t r y Demo" )
s e l f . set_size_request (200 ,
100)
s e l f . t i m e o u t _ i d = None
vbox = Gtk . Box ( o r i e n t a t i o n=Gtk . O r i e n t a t i o n . VERTICAL,
s e l f . add ( vbox )
s e l f . e n t r y = Gtk . E n t r y ( )
s e l f . entry . set_text ( " Hello
vbox . p a c k _ s t a r t ( s e l f . e n t r y ,
World " )
True ,
True ,
0)
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez
s p a c i n g =6)
60
True ,
True ,
0)
s e l f . on_editable_toggled )
s e l f . c h e c k _ e d i t a b l e . s e t _ a c t i v e ( True )
hbox . p a c k _ s t a r t ( s e l f . c h e c k _ e d i t a b l e ,
True ,
True ,
0)
s e l f . on_visible_toggled )
s e l f . c h e c k _ v i s i b l e . s e t _ a c t i v e ( True )
hbox . p a c k _ s t a r t ( s e l f . c h e c k _ v i s i b l e ,
True ,
True ,
0)
s e l f . on_pulse_toggled )
True ,
True ,
0)
s e l f . on_icon_toggled )
def
True ,
on_editable_toggled ( s e l f ,
True ,
0)
button ) :
def
on_visible_toggled ( s e l f ,
button ) :
def o n _ p u l s e _ t o g g l e d ( s e l f
i f button . get_active ( ) :
button ) :
s e l f . entry . set_progress_pulse_step ( 0 . 2 )
# C a l l s e l f . do_pulse e v e r y 100 ms
s e l f . t i m e o u t _ i d = GObject . t i m e o u t _ a d d ( 1 0 0 ,
else :
s e l f . do_pulse ,
UPAEP
None )
61
c a l l s e l f . do_pulse anymore
GObject . s o u r c e _ r e m o v e ( s e l f . t i m e o u t _ i d )
s e l f . t i m e o u t _ i d = None
s e l f . entry . set_progress_pulse_step (0)
def
do_pulse ( s e l f ,
user_data ) :
s e l f . entry . progress_pulse ()
return
True
def o n _ i c o n _ t o g g l e d ( s e l f
i f button . get_active ( ) :
button ) :
s t o c k _ i d = Gtk . STOCK_FIND
else :
s t o c k _ i d = None
s e l f . e n t r y . s e t _ i c o n _ f r o m _ s t o c k ( Gtk . E n t r y I c o n P o s i t i o n . PRIMARY,
stock_id )
win = EntryWindow ( )
win . c o n n e c t ( " d e l e t e e v e n t " ,
Gtk . m a i n _ q u i t )
win . s h o w _ a l l ( )
Gtk . main ( )
LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez