Vous êtes sur la page 1sur 61

LSE001-2015: Conceptos Bsicos de Python

Dr. Casimiro Gmez Gonzlez


Facultad de Electrnica, UPAEP
correo: casimiro.gomez@upaep.mx
Tel: 222 229 9428

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.

Una leve introduccin a linux

. . . . . . . . . . . . . . . . . .

1.2.

Historia de las distribuciones de linux . . . . . . . . . . . . . .

1.2.1.

Tux

1.2.2.

Distribuciones de Linux

1.3.
1.4.

. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

10

Virtualizacin . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

1.3.1.

Virtualizacin por Sistema Operativo . . . . . . . . . .

12

Creando una mquina virtual con VMware Player . . . . . . .

15

2. Instalando Python y el IDE para la programacin


2.1.
2.2.

2.3.

24

Instalando Eclipse . . . . . . . . . . . . . . . . . . . . . . . . .

25

Pasos para instalar eclipse en Elementary OS . . . . . . . . . .

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.

Algunos mtodos de objetos

. . . . . . . . . . . . . . . . . . .

41

3.7.1.

Diccionarios . . . . . . . . . . . . . . . . . . . . . . . .

41

3.7.2.

Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . .

42

3.7.3.

Listas

43

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

ndice general

3.8.

Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4. Programacin Bsica con Python GTK+ 3


. . . . . . . . . . . . . . . . . . . . . . . . . . .

44

51

4.1.

Dependencias

4.2.

Instalando en Elementary OS

. . . . . . . . . . . . . . . . . .

51

4.3.

Ejemplo1:Un ejemplo Simple . . . . . . . . . . . . . . . . . . .

52

4.4.

Ejemplo 2: Ampliando el Ejemplo . . . . . . . . . . . . . . . .

53

4.5.

Aspectos importantes del ambiente grco GTK+ . . . . . . .

54

4.5.1.

55

Propiedades . . . . . . . . . . . . . . . . . . . . . . . .

4.6.

Cadenas

4.7.

Contenedores de Layout
4.7.1.

4.8.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Cajas

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

Entrada de datos

. . . . . . . . . . . . . . . . . . . . . . . . .

c 2015 Laboratorio de Sistemas Embebidos


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?

1.1. Una leve introduccin a linux


Linux es un sistema operativo: un conjunto de programas que le permiten
interactuar con su ordenador y ejecutar otros programas.
Un sistema operativo consiste en varios programas fundamentales que
necesita el ordenador para poder comunicar y recibir instrucciones de los
usuarios; tales como leer y escribir datos en el disco duro, cintas, e impresoras;
controlar el uso de la memoria; y ejecutar otros programas. La parte ms
importante de un sistema operativo es el ncleo. En un sistema GNU/Linux,
Linux es el ncleo. El resto del sistema consiste en otros programas, muchos
de los cuales fueron escritos por o para el proyecto GNU. Dado que el ncleo
de Linux en s mismo no forma un sistema operativo funcional, preferimos
utilizar el trmino GNU/Linux para referirnos a los sistemas que la mayor
parte de las personas llaman de manera informal Linux.
Linux est modelado como un sistema operativo tipo Unix. Desde sus
comienzos, Linux se dise para que fuera un sistema multi tarea y multi
usuario. Estos hechos son sucientes para diferenciar a Linux de otros sistemas operativos ms conocidos. Sin embargo, Linux es ms diferente de lo
que pueda imaginar. Nadie es dueo de Linux, a diferencia de otros sistemas operativos. Gran parte de su desarrollo lo realizan voluntarios de forma

Captulo 1: Virtualizando Linux

altruista.
En 1984 comenz el desarrollo de lo que ms tarde sera GNU/Linux
cuando la Free Software Foundation

(Fundacin de software libre )

comenz

a desarrollar un sistema operativo libre de tipo Unix, llamado GNU.


El proyecto GNU ha desarrollado un conjunto de herramientas de software
libre para ser utilizados por Unix y sistemas operativos tipo Unix como Linux.
Estas herramientas permiten a los usuarios desarrollar tareas que van desde
las mundanas (como copiar o eliminar cheros del sistema) a las arcanas
(como escribir y compilar programas o hacer edicin sosticada en una gran
variedad de formatos de documento).
Aunque hay muchos grupos e individuos que han contribuido a Linux,
la Free Software Foundation ha sido quien ms ha contribuido. No slo cre
la mayor parte de las herramientas que se utilizan en Linux sino tambin la
losofa y comunidad que hizo que Linux fuera posible.
El ncleo Linux apareci por primera vez en 1991, cuando un estudiante de informtica nlands llamado Linus Torvalds anunci en el grupo de
noticias de USENET comp.os.minix, una primera versin de un ncleo de
reemplazo para Minix. Para ms referencias consulte la pgina de historia de
Linux en Linux Internacional.
Linus Torvalds sigue coordinando el trabajo de varios cientos de desarrolladores con la ayuda de algunas personas de conanza. Se puede encontrar
un excelente resumen semanal de las discusiones en la lista de correo linuxkernel en Kernel Trac. Se puede encontrar ms informacin sobre la lista de
correo linux-kernel en el documento PUF de la lista de correo linux-kernel.
Los usuarios de Linux tienen una gran libertad al elegir sus programas.
Por ejemplo, un usuario de Linux puede elegir entre docenas de distintos
intrpretes de lnea de rdenes y entre distintos entornos de escritorio. Tantas
opciones confunden a veces a los usuarios de otros sistemas operativos que
no estn acostumbrados a poder modicar el intrprete de lnea de rdenes
o el entorno de escritorio.
Es menos probable que un sistema Linux se colapse, adems tiene mejor
capacidad para ejecutar mltiples programas al mismo tiempo y es ms seguro que muchos otros sistemas operativos. Debido a estas ventajas, Linux es
el sistema operativo que ha experimentado mayor crecimiento en el mercado
de los servidores. ltimamente, Linux est empezando a ser popular entre

los usuarios domsticos y en empresas .

1 Tomado

de la pgina https://www.debian.org/releases/etch/hppa/ch01s02.html.es

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 1.2. Historia de las distribuciones de linux

1.2. Historia de las distribuciones de linux


La historia de Linux comenz mucho antes de lo que la mayora de gente
piensa, ya que en 1969, Ken Thompson, de AT&T Bell Laboratories, desarroll el sistema operativo Unix, adaptndolo a las necesidades de un entorno
de investigacin, sin saber la importancia que llegara a tener su trabajo. Un
ao despus Dennis Ritchie (creador del lenguaje de programacin C), colabor con Ken Thompson para pasar el cdigo del sistema Unix a C. Lo que
convierto a Unix en un sistema operativo transportable. Unix creci gradualmente hasta convertirse en un producto de software estndar, distribuido por
muchos vendedores tales como Novell e IBM. Sus primeras versiones fueron
distribuidas de forma gratuita a los departamentos cientcos de informtica
de muchas universidades de renombre. En 1972, los laboratorios Bell empezaron a emitir versiones ociales de Unix y a otorgar licencias del sistema a
distintos usuarios. En 1975, Berkeley lanz su propia versin de Unix (BSD).
Esta versin de Unix se convirti en la principal competidora de la versin
de los laboratorios Bell de ATT&T, pero no era la nica ya que en 1980,
Microsoft desarroll una versin de Unix para PC llamada Xenix. En 1991
esta organizacin desarroll el SistemaV versin4, que incorporaba casi todas
las caractersticas que se encuentran en el SistemaV versin3, BSDversin4.3,
SunOS y Xenix. Como respuesta a esta nueva versin, varias compaas, tales como IBM y Hewlett Packard, establecieron la Open Software Foundation
(OSF) para crear su propia versin estndar del Unix. Debido a la proliferacin de versiones de Unix en las dcadas anteriores, el Instituto de Ingenieros
Elctricos y Electrnicos (IIEE) desarrollo un estndar del Unix independiente para el American National Institute (ANSI). Este nuevo estndar ANSI del
Unix se llama Portable Operating System Interface for Computer Environments (POSIX). Este estndar dene una norma universal a la cual se deben
adherir todas las versiones de Unix. En esa poca, los estudiantes utilizaban
un programa llamado Minix, que incorporaba diferentes caractersticas de
Unix. Minix fue creado por el profesor Andrew Tannenbaum. Director del
Departamento de Sistemas de la Universidad de Vrije, Amsterdam. Profesor de Arquitectura de Ordenadores y Sistemas Operativos. Licenciado en el
MIT, y doctorado en la Universidad de Berkeley, California. En 1992 particip debate con Linus sobre la idea de este utilizar un ncleo monoltico en
vez de los basados en un micro ncleo que Tanenbaum crea que seran la
base de los sistemas operativos futuros.
Era el ao 1991 y Linus Torvalds ,que en aquel entonces era un estudiante

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 1: Virtualizando Linux

Figura 1.1: Historia de Unix

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 1.2. Historia de las distribuciones de linux

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

Tux es el nombre de la mascota ocial de Linux. Creado por Larry Ewing


en 1996, es un pequeo pingino de aspecto risueo y cmico. La idea de
que la mascota de kernel Linux fuera un pingino provino del mismo Linus
Torvalds, creador de kernel Linux. Existen dos versiones sobre el origen de
su nombre:
Los pinginos parecen vestir un esmoquin (que en ingls es tuxedo max,
abreviado tux).

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 1: Virtualizando Linux

10

Figura 1.2: Smbolo de Linux desarrollado por Larry Ewing

Las letras que componen Tux provienen de las palabras Torvalds y


Unix.
Hay quien dice que Tux era el nombre de un peluche que tenia Linus
que era un pingino llamado Tux. El logotipo se puede usar y modicar sin
restricciones, siempre que se reconozca la autora de Larry Ewing, ya que es

su trabajo y se debe reconocer su autora tal y como se indica en su pgina .

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/

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 1.3. Virtualizacin

11

Figura 1.3: Historia de las Distribuciones de Linux

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

Captulo 1: Virtualizando Linux

12

que se puedan tener varios ordenadores virtuales ejecutndose en el mismo


ordenador fsico.
Tal trmino es antiguo; se viene usando desde 1960, y ha sido aplicado a
diferentes aspectos y mbitos de la informtica, desde sistemas computacionales completos, hasta capacidades o componentes individuales.
La virtualizacin se encarga de crear una interfaz externa que encapsula
una implementacin subyacente mediante la combinacin de recursos en localizaciones fsicas diferentes, o por medio de la simplicacin del sistema de
control. Un avanzado desarrollo de nuevas plataformas y tecnologas de virtualizacin ha hecho que en los ltimos aos se haya vuelto a prestar atencin
a este concepto.
La mquina virtual en general simula una plataforma de hardware autnoma incluyendo un sistema operativo completo que se ejecuta como si estuviera
instalado. Tpicamente varias mquinas virtuales operan en un computador
central. Para que el sistema operativo guest funcione, la simulacin debe ser
lo sucientemente grande (siempre dependiendo del tipo de virtualizacin).

1.3.1.

Virtualizacin por Sistema Operativo

Virtualizar signica instalar un sistema operativo dentro de otro al que


se le llama antrin (HOST), mediante el uso de una mquina virtual. Frecuentemente denominada virtualizacin compartida del Sistema Operativo o
virtualizacin del SO, la virtualizacin del Sistema Operativo virtualiza servidores en la capa del sistema operativo (kernel). Este mtodo de virtualizacin
crea particiones aisladas o entornos virtuales (VEs) en un nico servidor fsico e instancia de SO para as maximizar los esfuerzos de administracin del
hardware, software y centro de datos. La Virtualizacin de Hypervisor tiene
una capa base (generalmente un kernel, Linux que se muestra aqu como un
hypervisor o SO estndar, lo mismo que Windows Server 2008 R2 HyperV) que se carga directamente en el servidor base. Para asignar hardware y
recursos a las mquinas virtuales (VMs), es recomendable que todo el hardware del servidor est virtualizado. La siguiente capa superior muestra cada
chip, placa, etc. que debe virtualizarse para que as pueda ser asignado a las
VMs. Una vez en la VM, hay un copia completa de un sistema operativo y
nalmente la aplicacin o carga de trabajo.
La Virtualizacin de SO mejora el rendimiento, gestin y eciencia. En
la base reside un sistema operativo antrin estndar, como en el caso de
Parallels Virtuozzo que incluye Windows y un sistema con ncleo Linux. A
c 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 1.3. Virtualizacin

13

Figura 1.4: Direccin donde bajar el VMware Player

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

Software para virtualizar en Windows


Suponiendo que tu computadora esta utilizando Windows como sistema
operativo principal (host), existen dos software que te permiten virtualizar un
sistema operativo dentro de windows, estos son: (a) VirtualBox (b) VMware
player, ambos software son gratis.
En este curso utilizaremos el software VMWare player. En la gura 1.4
se puede ver la direccin desde la cual bajar el software.
En la gura 1.5 se puede observar el archivo para bajar.

3 Tomado

de http://es.wikipedia.org/wiki/Virtualizacin

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 1: Virtualizando Linux

14

Figura 1.5: Archivo para bajar VMware Player

Figura 1.6: Distrubuciones de Linux mas exitosas segun el sitio DistroWatch


en enero 2015

Bajando la distribucin de Linux


Como se ha mencionado existen muchas versiones de linux, para este
curso utilizaremos una versin amigable basada en Ubuntu, su nombre es
Elementary OS, en enero de 2015 elementary era la sptima distribucin mas
popular de linux, como se indica en la 1.6.
Es necesario bajar el archivo .iso de la distribucin de linux que se desea
virtualizar, en nuestro caso en la gura 1.7 se muestra la direccin. Elementary es una distribucin de linux basado en Ubuntu, que no tiene fechas
jas de actualizaciones y es un proyecto de reciente creacin desarrollado por
voluntarios en canada y otras partes del mundo.
La razn de utilizar esta versin de Linux es debido a que se esta desac 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 1.4. Creando una mquina virtual con VMware Player

15

Figura 1.7: Direccin desde donde debe bajarse la Elementary OS en su nueva


versin Freya Beta 1

Figura 1.8: Opciones de archivos para bajar de Elementary OS en su nueva


versin Freya Beta 1

rrollando software y/o modicando software especco para el ambiente de


la distribucin, an cuando los conceptos visuales son una copia del OSX
de la mac. Los tiempos de actualizacin de la distribucin an son lentos
y su grupo de desarrollo an es pequeo, en pocas palabras es un proyecto
naciente pero con gran potencial.
En la gura 1.8 se puede observar las dos versiones para bajar elementary
Freya Beta 1, que es la versin de 32 bits y la de 64 bits, segn las caractersticas de su computadora y segn si tienen o no activada la virtualizacin
por hardware en el setup de su computadora.

1.4. Creando una mquina virtual con VMware


Player
En la gura 1.9 se muestra la pantalla de inicio del software VMWare
Player. En la gura 1.9 se puede observar el nmero 1 encerrado en una
elipse con lo cual se indica que el primer paso es dar click sobre la opcin

Create a New Virtual Machine.

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 1: Virtualizando Linux

16

Figura 1.9: Inicio del VMWare Player

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 1.4. Creando una mquina virtual con VMware Player

17

Figura 1.10: Enlace de la maquina virtual con el archivo de arranque de linux

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 1: Virtualizando Linux

18

Figura 1.11: Caractersticas del Sistema Operativo Invitado

En la gura 1.10 se enlaza la mquina virtual con la distribucin de linux


que se le instalar, en el paso dos se le indica que el archivo que se usar
ser un archivo iso y en el paso 3 se busca ese archivo en la computadora. Y
posteriormente se da click en el boton next.
En la gura 1.11 se muestran los pasos 5, 6 y 7. En el paso 5 se muestra el
sistema GUEST seleccionado, en este caso ser

Linux, en el paso 6 se eligir

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

Seccin 1.4. Creando una mquina virtual con VMware Player

Figura 1.12: Nombre de la mquina virtual

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

19

Captulo 1: Virtualizando Linux

20

Figura 1.13: Tamao de la Mquina Virtual

guardar el archivo, en el paso 10 se da click en el botn next.


En la gura 1.13 se muestran los paso 11 (en donde se elige el tamao de
la mquina virtual), en el paso 12 se graba toda la mquina virtual en un
solo archivo, y en el paso 13 se da click en next.
Despus de lo cual se da click en el boton nish.
Despus de lo cual se da

play en la mquina virtual y se instala el sistema

operativo siguiendo los pasos que se indican.


Al terminar de instalar la mquina virtual, se debe desenlazar el archivo
iso con la mquina virtual.
En la gura 1.15 se muestra la opcin a seleccionar para desacoplar el
c 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 1.4. Creando una mquina virtual con VMware Player

Figura 1.14: Caractersticas de la Mquina Virtual

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

21

Captulo 1: Virtualizando Linux

22

Figura 1.15: Desacoplar el disco iso de la mquina virtual

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 1.4. Creando una mquina virtual con VMware Player

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.

Seccin 2.1. Instalando Eclipse

25

2.1. Instalando Eclipse


Eclipse es un programa informtico compuesto por un conjunto de herramientas de programacin de cdigo abierto multiplataforma para desarrollar

lo que el proyecto llama .Aplicaciones de Cliente Enriquecido", opuesto a las


aplicaciones liente-liviano"basadas en navegadores. Esta plataforma, tpicamente ha sido usada para desarrollar entornos de desarrollo integrados (del
ingls IDE), como el IDE de Java llamado Java Development Toolkit (JDT) y
el compilador (ECJ) que se entrega como parte de Eclipse (y que son usados
tambin para desarrollar el mismo Eclipse). Sin embargo, tambin se puede
usar para otros tipos de aplicaciones cliente, como BitTorrent o Azureus.
Eclipse es tambin una comunidad de usuarios, extendiendo constantemente las reas de aplicacin cubiertas. Un ejemplo es el recientemente creado Eclipse Modeling Project, cubriendo casi todas las reas de Model Driven
Engineering.
Eclipse fue desarrollado originalmente por IBM como el sucesor de su
familia de herramientas para VisualAge. Eclipse es ahora desarrollado por
la Fundacin Eclipse, una organizacin independiente sin nimo de lucro
que fomenta una comunidad de cdigo abierto y un conjunto de productos
complementarios, capacidades y servicios.
Eclipse fue liberado originalmente bajo la Common Public License, pero
despus fue re-licenciado bajo la Eclipse Public License. La Free Software
Foundation ha dicho que ambas licencias son licencias de software libre, pero
son incompatibles con Licencia pblica general de GNU (GNU GPL)

2.2. Pasos para instalar eclipse en Elementary


OS
2.2.1.

Paso 1

Primero en el Desktop de Elementary OS dar click en aplicaciones, gura


2.1.

2.2.2.

Paso 2 y Paso 3

Buscar en las aplicaciones de Elementary OS el centro de Software y dar


click en el, gura 2.2.

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

26

Captulo 2: Instalando Python y el IDE para la programacin

Figura 2.1: Desktop de Elementary OS

Figura 2.2: Aplicaciones de Elementary OS

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 2.3. Instalando PyDev

27

Figura 2.3: Centro de Software

2.2.3.

Paso 4 y paso 5

Cuando abre la aplicacin de centro de software, introducir el nombre


eclipse en el buscador y posteriormente dar click en instalar, como se indica
en la gura

password de tu cuenta,
enter para que inicie la instalacin

Antes de iniciar la instalacin te pedir el


hay que introducirla y darle

solo

2.3. Instalando PyDev


Para instalar PyDev a las extensiones de PyDev se debe utilizar el Eclipse
Update Manager, para ello es necesario ir a la opcin del menu help>Install
New Software, como se muestra 2.4.
En la gura 2.5 se observa la ventana que se despliega, como la gura lo
muestra hay que darle click al boton add e introducir el nombre y la direccin
que all se indican.
Hay muchos sitios para bajar y actualizar el software, en la gura 2.6,
se muestra las opciones a seleccionar. La Opcin

All available Sites

Posteriormente debe seleccionar

Work with

debe elegirse

next, y posteriormente next y por ltimo

nish, como se indican en la gura 2.7, gura 2.8.

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

28

Captulo 2: Instalando Python y el IDE para la programacin

Figura 2.4: Menu de ayuda de eclipse

Figura 2.5: Menu de ayuda de eclipse

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 2.3. Instalando PyDev

Figura 2.6: Menu de ayuda de eclipse

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

29

30

Captulo 2: Instalando Python y el IDE para la programacin

Figura 2.7: Menu de ayuda de eclipse

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 2.3. Instalando PyDev

Figura 2.8: Menu de ayuda de eclipse

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

del nombre de la clase, dos puntos (:) y a continuacin, indentado, el cuerpo


de la clase. Como en el caso de las funciones, si la primera lnea del cuerpo
se trata de una cadena de texto, esta ser la cadena de documentacin de la
clase o docstring.

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

( " Tenemos " ,

gasolina ,

" litros ")

arrancar ( s e l f ) :

if

s e l f . gasolina >

print
else :
print

0:

( " Arranca " )


( "No

arranca " )

conducir ( s e l f ) :

if

s e l f . gasolina >
s e l f . gasolina

print
else :
print

( " Quedan " ,


( "No

se

0:
1
s e l f . gasolina ,

" litros ")

mueve " )

Lo primero que llama la atencin en el ejemplo anterior es el nombre tan


curioso que tiene el mtodo __init__. Este nombre es una convencin y no
un capricho. El mtodo __init__, con una doble barra baja al principio y
nal del nombre, se ejecuta justo despus de crear un nuevo objeto a partir
de la clase, proceso que se conoce con el nombre de instanciacin. El mtodo
__init__ sirve, como sugiere su nombre, para realizar cualquier proceso de
inicializacin que sea necesario.
Como vemos el primer parmetro de __init__ y del resto de mtodos de
la clase es siempre

self. Esta es una idea inspirada en Modula-3 y sirve para

referirse al objeto actual. Este mecanismo es necesario para poder acceder a


los atributos y mtodos del objeto diferenciando, por ejemplo, una variable
local

mi_var de un atributo del objeto self.mi_var.

Si volvemos al mtodo __init__ de nuestra clase Coche veremos cmo


se utiliza

self

para asignar al atributo gasolina del objeto (self.gasolina) el

valor que el programador especic para el parmetro gasolina. El parmetro


gasolina se destruye al nal de la funcin, mientras que el atributo gasolina
se conserva (y puede ser accedido) mientras el objeto viva.
Para crear un objeto se escribira el nombre de la clase seguido de cualquier parmetro que sea necesario entre parntesis. Estos parmetros son los
que se pasarn al mtodo __init__, que como decamos es el mtodo que
se llama al instanciar la clase.
mi_coche = Coche ( 3 )
Te preguntars entonces cmo es posible que a la hora de crear nuestro

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 3: Introduccin a Python

34

primer objeto pasemos un solo parmetro a __init__, el nmero 3, cuando


la denicin de la funcin indica claramente que precisa de dos parmetros
(self y gasolina). Esto es as porque Python pasa el primer argumento (la
referencia al objeto que se crea) automgicamente.
Ahora que ya hemos creado nuestro objeto, podemos acceder a sus atributos y mtodos mediante la sintaxis
>>>

print

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

>>>

print

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

Seccin 3.1. Herencia

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 ) :

print

( " Estamos

tocando

musica " )

romper ( s e l f ) :

print
print

( " Eso

lo

( " Son " ,

pagas

tu " )

s e l f . precio ,

class Bateria ( Instrumento ) :


pass
class Guitarra ( Instrumento ) :
pass

" $$$ " )

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

Captulo 3: Introduccin a Python

36

desde Guitarra usaramos Instrumento.__init__(self, precio). Observa que


en este caso si es necesario especicar el parmetro

self .

3.2. Herencia Mltiple


En Python, a diferencia de otros lenguajes como Java o C#, se permite la
herencia mltiple, es decir, una clase puede heredar de varias clases a la vez.
Por ejemplo, podramos tener una clase Cocodrilo que heredara de la clase
Terrestre, con mtodos como caminar() y atributos como velocidad_caminar
y de la clase Acuatico, con mtodos como nadar() y atributos como velocidad_nadar. Basta con enumerar las clases de las que se hereda separndolas
por comas:

class Cocodrilo ( Terrestre


pass

Acuatico ) :

En el caso de que alguna de las clases padre tuvieran mtodos con el


mismo nombre y nmero de parmetros las clases sobreescribiran la implementacin de los mtodos de las clases ms a su derecha en la denicin.
En el siguiente ejemplo, como Terrestre se encuentra ms a la izquierda,
sera la denicin de desplazar de esta clase la que prevalecera, y por lo tanto
si llamamos al mtodo desplazar de un objeto de tipo Cocodrilo lo que se
imprimira sera El animal anda".

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 ()

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 3.3. Polimorsmo

37

3.3. Polimorsmo
La palabra polimorsmo, del griego

poly morphos

(varias formas), se re-

ere a la habilidad de objetos de distintas clases de responder al mismo


mensaje. Esto se puede conseguir a travs de la herencia: un objeto de una
clase derivada es al mismo tiempo un objeto de la clase padre, de forma que
all donde se requiere un objeto de la clase padre tambin se puede utilizar
uno de la clase hija. Python, al ser de tipado dinmico, no impone restricciones a los tipos que se le pueden pasar a una funcin, por ejemplo, ms all
de que el objeto se comporte como se espera: si se va a llamar a un mtodo
f() del objeto pasado como parmetro, por ejemplo, evidentemente el objeto
tendr que contar con ese mtodo. Por ese motivo, a diferencia de lenguajes
de tipado esttico como Java o C++, el polimorsmo en Python no es de
gran importancia.
En ocasiones tambin se utiliza el trmino polimorsmo para referirse a la
sobrecarga de mtodos, trmino que se dene como la capacidad del lenguaje
de determinar qu mtodo ejecutar de entre varios mtodos con igual nombre
segn el tipo o nmero de los parmetros que se le pasa. En Python no existe
sobrecarga de mtodos (el ltimo mtodo sobreescribira la implementacin
de los anteriores), aunque se puede conseguir un comportamiento similar
recurriendo a funciones con valores por defecto para los parmetros o a la
sintaxis

*params o **params explicada en el captulo sobre las funciones en

Python, o bien usando decoradores (mecanismo que veremos ms adelante).

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

Captulo 3: Introduccin a Python

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

name mangling ). Esto implica que el mtodo

o atributo no es realmente privado, y podemos acceder a l mediante una


pequea trampa:
e j . _Ejemplo__privado ( )
En ocasiones tambin puede suceder que queramos permitir el acceso a
algn atributo de nuestro objeto, pero que este se produzca de forma controlada. Para esto podemos escribir mtodos cuyo nico cometido sea este,
mtodos que normalmente, por convencin, tienen nombres como getVariable y setVariable; de ah que se conozcan tambin con el nombre de
y

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

( " Error " )

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

getters

Seccin 3.5. Clases mejoradas

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

3.5. Clases mejoradas


En el ejemplo anterior os habr llamado la atencin el hecho de que la
clase Fecha derive de object. La razn de esto es que para poder usar propiedades la clase tiene que ser de nuevo-estilo, clases enriquecidas introducidas
en Python 2.2 que sern el estndar en Python 3.0 pero que an conviven
con las clases clsicas por razones de retrocompatibilidad. Adems de las
propiedades las clases de nuevo estilo aaden otras funcionalidades como
descriptores o mtodos estticos.
Para que una clase sea de nuevo estilo es necesario, por ahora, que extienda una clase de nuevo-estilo. En el caso de que no sea necesario heredar
el comportamiento o el estado de ninguna clase, como en nuestro ejemplo
anterior, se puede heredar de object, que es un objeto vacio que sirve como
base para todas las clases de nuevo estilo.
La diferencia principal entre las clases antiguas y las de nuevo estilo consiste en que a la hora de crear una nueva clase anteriormente no se dena

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 3: Introduccin a Python

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.

3.6. Mtodos Especiales


Ya vimos al principio del artculo el uso del mtodo __init__. Existen
otros mtodos con signicados especiales, cuyos nombres siempre comienzan
y terminan con dos guiones bajos. A continuacin se listan algunos especialmente tiles.

__init__(self, args).-

Mtodo llamado despus de crear el objeto

para realizar tareas de inicializacin.

__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.

__del__(self).- Mtodo llamado cuando el objeto va a ser borrado.


Tambin llamado destructor, se utiliza para realizar tareas de limpieza.

__str__(self).-

Mtodo llamado para crear una cadena de texto

que represente a nuestro objeto. Se utiliza cuando usamos print para


mostrar nuestro objeto o cuando usamos la funcin str(obj) para crear
una cadena a partir de nuestro objeto.

__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

Seccin 3.7. Algunos mtodos de objetos

__len__(self).-

41

Mtodo llamado para comprobar la longitud del

objeto. Se utiliza, por ejemplo, cuando se llama a la funcin len(obj)


sobre nuestro objeto. Como es de suponer, el mtodo debe devolver la
longitud del objeto.
Existen bastantes ms mtodos especiales, que permite entre otras cosas
utilizar el mecanismo de slicing sobre nuestro objeto, utilizar los operadores
aritmticos o usar la sintaxis de diccionarios.

3.7. Algunos mtodos de objetos


Ahora que sabemos qu son las clases, los objetos, las funciones, y los
mtodos es el momento de revisitar estos objetos para descubrir su verdadero
potencial. Veremos a continuacin algunos mtodos tiles de estos objetos.
Evidentemente, no es necesario memorizarlos, pero si, al menos, recordar que
existen para cuando sean necesarios.

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

Captulo 3: Introduccin a Python

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

S.count(sub[, start[, end]])


Devuelve el nmero de veces que se encuentra

sub

en la cadena. Los

parmetros opcionales start y end denen una subcadena en la que buscar.

S.nd(sub[, start[, end]])


Devuelve la posicin en la que se encontr por primera vez
cadena o

-1 si no se encontr.

sub

en la

S.join(sequence)
Devuelve una cadena resultante de concatenar las cadenas de la secuencia

seq separadas por la cadena sobre la que se llama el mtodo.


S.partition(sep)
Busca el separador

sep

en la cadena y devuelve una tupla con la subca-

dena hasta dicho separador, el separador en si, y la subcadena del separador


hasta el nal de la cadena. Si no se encuentra el separador, la tupla contendr
la cadena en si y dos cadenas vacas.

S.replace(old, new[, count])


Devuelve una cadena en la que se han reemplazado todas las ocurrencias
de la cadena old por la cadena new. Si se especica el parmetro count, este
indica el nmero mximo de ocurrencias a reemplazar.
c 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 3.7. Algunos mtodos de objetos

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.index(value[, start[, stop]])


Devuelve la posicin en la que se encontr la primera ocurrencia de value.
Si se especican, start y stop denen las posiciones de inicio y n de una
sublista en la que buscar.

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

Captulo 3: Introduccin a Python

44

L.reverse()
Invierte la lista. Esta funcin trabaja sobre la propia lista desde la que se
invoca el mtodo, no sobre una copia.

L.sort(cmp=None, key=None, reverse=False)


Ordena la lista. Si se especica cmp, este debe ser una funcin que tome
como parmetro dos valores x e y de la lista y devuelva -1 si x es menor que
y, 0 si son iguales y 1 si x es mayor que y.
El parmetro reverse es un booleano que indica si se debe ordenar la
lista de forma inversa, lo que sera equivalente a llamar primero a L.sort() y
despus a L.reverse().
Por ltimo, si se especica, el parmetro key debe ser una funcin que
tome un elemento de la lista y devuelva una clave a utilizar a la hora de
comparar, en lugar del elemento en si.

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 ):

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 3.8. Excepciones


File

" 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

Lo primero que se muestra es el trazado de pila o traceback, que consiste


en una lista con las llamadas que provocaron la excepcin. Como vemos en
el trazado de pila, el error estuvo causado por la llamada a calcular() de la
lnea 7, que a su vez llama a division(1, 0) en la lnea 5 y en ltima instancia
por la ejecucin de la sentencia a / b de la lnea 2 de division.
A continuacin vemos el tipo de la excepcin, ZeroDivisionError, junto
a una descripcin del error: integer division or modulo by zero (mdulo o
divisin entera entre cero). En Python se utiliza una construccin try-except
para capturar y tratar las excepciones. El bloque try (intentar) dene el
fragmento de cdigo en el que creemos que podra producirse una excepcin.
El bloque except (excepcin) permite indicar el tratamiento que se llevar
a cabo de producirse dicha excepcin. Muchas veces nuestro tratamiento de
la excepcin consistir simplemente en imprimir un mensaje ms amigable
para el usuario, otras veces nos interesar registrar los errores y de vez en
cuando podremos establecer una estrategia de resolucin del problema. En el
siguiente ejemplo intentamos crear un objeto f de tipo chero. De no existir
el archivo pasado como parmetro, se lanza una excepcin de tipo IOError,
que capturamos gracias a nuestro try-except.

try :
f =

f i l e (" archivo . txt ")

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 =

print

int ( " 3 a " )


no_existe

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 3: Introduccin a Python

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 " )

Cuando se lanza una excepcin en el bloque try, se busca en cada una


de las clausulas except un manejador adecuado para el tipo de error que se
produjo. En caso de que no se encuentre, se propaga la excepcin. Adems
podemos hacer que un mismo except sirva para tratar ms de una excepcin
usando una tupla para listar los tipos de error que queremos que trate el
bloque:

try :
num =

int ( " 3 a " )

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 " )

Tambin existe una clausula nally que se ejecuta siempre, se produzca


o no una excepcin. Esta clausula se suele utilizar, entre otras cosas, para
tareas de limpieza.

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

Seccin 3.8. Excepciones

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:

Por ltimo, a continuacin se listan a modo de referencia las excepciones


disponibles por defecto, as como la clase de la que deriva cada una de ellas
entre parntesis.

BaseException: Clase de la que heredan todas las excepciones.


Exception(BaseException):

Super clase de todas las excepciones

que no sean de salida.

GeneratorExit(Exception): Se pide que se salga de un generador.


StandardError(Exception):

Clase base para todas las excepciones

que no tengan que ver con salir del intrprete.

ArithmeticError(StandardError): Clase base para los errores aritmticos.

FloatingPointError(ArithmeticError): Error en una operacin de


coma otante.

OverowError(ArithmeticError): Resultado demasiado grande para poder representarse.

ZeroDivisionError(ArithmeticError): Lanzada cuando el segundo


argumento de una operacin de divisin o mdulo era 0.

AssertionError(StandardError): Fall la condicin de un estamento assert.

AttributeError(StandardError): No se encontr el atributo.


LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 3: Introduccin a Python

48

EOFError(StandardError):

Se intent leer ms all del nal de -

chero.

EnvironmentError(StandardError): Clase padre de los errores relacionados con la entrada/salida.

IOError(EnvironmentError): Error en una operacin de entrada/salida.

OSError(EnvironmentError): Error en una llamada a sistema.


WindowsError(OSError): Error en una llamada a sistema en Windows.

ImportError(StandardError):

No se encuentra el mdulo o el ele-

mento del mdulo que se quera importar.

LookupError(StandardError): Clase padre de los errores de acceso.


IndexError(LookupError):

El ndice de la secuencia est fuera del

rango posible.

KeyError(LookupError): La clave no existe.


MemoryError(StandardError): No queda memoria suciente
NameError(StandardError):

No se encontr ningn elemento con

ese nombre.

UnboundLocalError(NameError):

El nombre no est asociado a

ninguna variable.

ReferenceError(StandardError):

El objeto no tiene ninguna refe-

rencia fuerte apuntando hacia l.

RuntimeError(StandardError):

Error en tiempo de ejecucin no

especicado.

NotImplementedError(RuntimeError): Ese mtodo o funcin no


est implementado.

SyntaxError(StandardError):

Clase padre para los errores sintc-

ticos.
c 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 3.8. Excepciones

49

IndentationError(SyntaxError): Error en la indentacin del archivo.

TabError(IndentationError): Error debido a la mezcla de espacios


y tabuladores.

SystemError(StandardError): Error interno del intrprete.


TypeError(StandardError): Tipo de argumento no apropiado.
ValueError(StandardError): Valor del argumento no apropiado.
UnicodeError(ValueError): Clase padre para los errores relacionados con unicode.

UnicodeDecodeError(UnicodeError): Error de decodicacin unicode.

UnicodeEncodeError(UnicodeError): Error de codicacin unicode.

UnicodeTranslateError(UnicodeError):

Error de traduccin uni-

code.

StopIteration(Exception):

Se utiliza para indicar el nal del itera-

dor.

Warning(Exception): Clase padre para los avisos.


DeprecationWarning(Warning):

Clase padre para avisos sobre ca-

ractersticas obsoletas.

FutureWarning(Warning):

Aviso. La semntica de la construccin

cambiar en un futuro.

ImportWarning(Warning): Aviso sobre posibles errores a la hora de


importar.

PendingDeprecationWarning(Warning):

Aviso sobre caractersti-

cas que se marcarn como obsoletas en un futuro prximo.

RuntimeWarning(Warning): Aviso sobre comportmaientos dudosos


en tiempo de ejecucin.

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 3: Introduccin a Python

50

SyntaxWarning(Warning): Aviso sobre sintaxis dudosa.


UnicodeWarning(Warning): Aviso sobre problemas relacionados con
Unicode, sobre todo con problemas de conversin.

UserWarning(Warning): Clase padre para avisos creados por el programador.

KeyboardInterrupt(BaseException): El programa fu interrumpido por el usuario.

SystemExit(BaseException): Peticin del intrprete para terminar


la ejecucin.

c 2015 Laboratorio de Sistemas Embebidos


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

4.2. Instalando en Elementary OS


Para instalar desde elementary OS es necesario abrir una terminal y desde
la linea de comando ejecutar:
$

sudo

a p t g e t

install

p y t h o n 3g i

Captulo 4: Programacin Bsica con Python GTK+ 3

52

Figura 4.1: Ventana creada con el programa de la seccin 4.3

4.3. Ejemplo1:Un ejemplo Simple


Para iniciar vamos a crear el programa ms simple posible. Este programa
crea una ventana vacia de

200X200

#! / usr / b i n / python3
from g i . r e p o s i t o r y import

pixeles.

Gtk

win = Gtk . Window ( )


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 ( )
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

Seccin 4.4. Ejemplo 2: Ampliando el Ejemplo


win . c o n n e c t ( " d e l e t e e v e n t " ,

53

Gtk . m a i n _ q u i t )

En el siguiente paso desplegamos la ventana


win . s h o w _ a l l ( )
Finalmente, generamos un lazo repetido donde se procesa el programa
GTK+, el cual se detiene cuando cerramos la ventana
GTK. main ( )
Para ejecutar el programa, abrimos una terminal, cambiamos al directorio
donde se encuentra el archivo, e introducimos:
python3

s i m p l e _ e x a m p l e . py

4.4. Ejemplo 2: Ampliando el Ejemplo


Un ejemplo clsico y mas til es la versin PyGObject del programa
clsico Hola Mundo.

#! / usr / b i n / python3
from g i . r e p o s i t o r y import

class
def

Gtk

MiVentana ( Gtk . Window ) :


__init__ ( s e l f ) :
Gtk . Window . __init__ ( s e l f ,

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

Captulo 4: Programacin Bsica con Python GTK+ 3

54

Este ejemplo es diferente del ejemplo de la seccin 4.3 ya que se utiliza la


subclase Gtk.Window para denir nuestra propia clase MiVentana.

class

MiVentana ( Gtk . Window ) :

En el constructor de la clase tenemos que llamar al constructor de la super


clase. Adems, se establece el valor de la propiedad titulo a Hola Mundo.
Gtk . Window . __init__ ( s e l f ,

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

s e l f . boton . c o n n e c t ( " c l i c k e d " ,

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 ,

print

widget ) :

( " H o l a Mundo" )

El ltimo bloque, fuera de la clase, es muy similar al ejemplo simple, pero


en lugar de crear una instancia de la clase genrica
una instancia de

MiVentana.

Gtk.Window,

se crea

4.5. Aspectos importantes del ambiente grco


GTK+
Como muchas de las herramientas GUI, GTK+ usa el modelo de programacin orientado a eventos. Cuando el usuario no hace nada, GTK+ se sita
en el lazo principal y espera por una entrada. Si el usuario realiza alguna
accin - como dar click con el mouse- entonces el lazo principal despierta y
entrega el evento a GTK+.
Cuando los widget reciben un evento, ellos frecuentemente emiten una
o mas seales. Las seales notican a tu programa que Algo interesante ha
sucedido invocando a las funciones que conectaste a la seal. Tales funciones
son llamadas comnmente

callbacks. Cuando una callbacks es invocada, tu

tpicamente realizas alguna accin - por ejemplo, cuando se da click sobre


c 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 4.5. Aspectos importantes del ambiente grco GTK+

55

un boton de Abrir tu podras desplegar un dialogo para seleccionar un archivo. Despus de que una rutina

callbacks termina, GTK+ regresar al lazo

principal y esperar por mas entradas del usuario.


Un ejemplo genrico es:
handler_id = widget . connect ( " event " ,
Primeramente,

callback ,

data )

widget es una instancia de un widget creado anteriormen-

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 )

Llamando a la funcin Gtk.main_quit() har que el lazo principal dentro


de Gtk.main() termine.

4.5.1.

Propiedades

Las propiedades describen el estado y conguracin de los widgets. Como


con las seales, cada widget tiene su propio conjunto particular de propieda-

LSE001-2015
Elabor: Dr. Casimiro Gmez Gonzlez

Captulo 4: Programacin Bsica con Python GTK+ 3

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-

str. Cadenas Encoded por otro lado son representados como


Byte. Conceptualmente, str
se reere a texto mientras que bytes se reere a datos. Para convertir de
tipo str a tipo byte se debe usar str.encode() y para convertir de bytes
a str se debe usar bytes.decode(). Adems no es posible mezclar cadenas
tancia de tipo

datos binarios en la forma de instancias de tipo

Unicode con cadenas encoded, porque resulta en un

TypeError.

4.7. Contenedores de Layout


Mientras que muchas herramientas de desarrollo GUI te piden la colocacin precisa de los widget en una ventana, usando un posicionamiento
absoluto, GTK+ utiliza una tcnica diferente. En lugar de especicar la posicin y tamao de cada widget en la ventana, tu puedes arreglar tus widgets
en columnas, las y/o tablas. El tamao de la ventana puede ser determinado automticamente, basado en los tamaos de los widgets que contiene.
Y el tamao de los widgets son determinados por la cantidad de texto que
contiene, o el tamao mnimo y mximo que puedes especcar, y/o como
requieres que el espacio disponible deba ser compartido entre el conjunto de
widgets. Es posible perfeccionar tu layout especicando las distancias y los
c 2015 Laboratorio de Sistemas Embebidos

UPAEP

Seccin 4.7. Contenedores de Layout

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

Gtk.Bin, y contenedores de mltiples hijos, de los cuales


son descendientes de Gtk.Container. Los contenedores mas usados comnmente son las cajas verticales u horizontales (Gtk.Box), tablas (Gtk.Table)
y redes (Gtk.Grid)

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

MiVentana ( Gtk . Window ) :


__init__ ( s e l f ) :
Gtk . Window . __init__ ( s e l f ,

t i t l e =" H o l a Mundo" )

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 )
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 " ,

= " Hola " )


s e l f . on_button1_clicked )

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 )

Captulo 4: Programacin Bsica con Python GTK+ 3

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 " ,

= " Adios " )


s e l f . on_button2_clicked )

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 ) :

print ( " H o l a " )


def o n _ b u t t o n 2 _ c l i c k e d ( s e l f
print ( " A d i o s " )

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 " ,

= " Hola " )


s e l f . on_button1_clicked )

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 )

= " Adios " )


s e l f . on_button2_clicked )

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 )

Gtk.Box.pack_start() los widgets son


derecha, con Gtk.Box.pack_end() son posi-

Mientras que cuando usamos


posicionados de izquierda a

cionados de derecha a izquierda.

4.8. Entrada de datos


Los widget de entrada permiten al usuario introducir texto. Puedes cam-

Gtk.Entry.set_text() y leer el contenido


actual con el mtodo Gtk.Entry.get_text(). Puedes limitar el nmero de
carateres llamando el mtodo Gtk.Entry.set_max_length().
biar el contenido con el mtodo

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

Seccin 4.8. Entrada de datos

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

Gtk.Entry.set_visibility() con FALSE causa que el

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

Adicionalmente, cada entrada de texto puede mostrar un cono a cada


lado. Estos conos se pueden activar pulsando sobre ellos, pueden ser congurados como fuentes de arrastre o tener herramientas enlazadas. Para agregar un cono, usar

Gtk.Entry.set_icon_from_stock() o uno de las otras

funciones que le ponen el nombre al cono, un pixbuf o un tema de cono. Para


ajustar un

tooltip

a un cono, usar

Gtk.Entry.set_icon_tooltip_text()

o la correspondiente funcin.

4.8.1.

Ejemplo

from g i . r e p o s i t o r y import Gtk ,


c l a s s EntryWindow ( Gtk . Window ) :
def __init__ ( s e l f ) :
Gtk . Window . __init__ ( s e l f ,

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)

Captulo 4: Programacin Bsica con Python GTK+ 3

60

hbox = Gtk . Box ( s p a c i n g =6)


vbox . p a c k _ s t a r t ( hbox ,

True ,

True ,

0)

s e l f . c h e c k _ e d i t a b l e = Gtk . C h e c k B u t t o n ( " E d i t a b l e " )


s e l f . check_editable . connect ( " toggled " ,

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 . c h e c k _ v i s i b l e = Gtk . C h e c k B u t t o n ( " V i s i b l e " )


s e l f . check_visible . connect ( " toggled " ,

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 . p u l s e = Gtk . C h e c k B u t t o n ( " P u l s e " )


s e l f . pulse . connect ( " toggled " ,

s e l f . on_pulse_toggled )

s e l f . pulse . set_active ( False )


hbox . p a c k _ s t a r t ( s e l f . p u l s e ,

True ,

True ,

0)

s e l f . i c o n = Gtk . C h e c k B u t t o n ( " I c o n " )


s e l f . icon . connect ( " toggled " ,

s e l f . on_icon_toggled )

s e l f . icon . set_active ( False )


hbox . p a c k _ s t a r t ( s e l f . i c o n ,

def

True ,

on_editable_toggled ( s e l f ,

True ,

0)

button ) :

value = button . get_active ( )


s e l f . entry . set_editable ( value )

def

on_visible_toggled ( s e l f ,

button ) :

value = button . get_active ( )


s e l f . entry . s e t _ v i s i b i l i t y ( value )

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 ,

c 2015 Laboratorio de Sistemas Embebidos


UPAEP

None )

Seccin 4.8. Entrada de datos


# Dont

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

Vous aimerez peut-être aussi