Está en la página 1de 152

Fundamentos de Python con Orientacin a Objetos y Basado en Problemas

Caso Gestin Informacin de Proyectos con Bases de Datos Relacionales


1. El Problema
Profesor: Carlos Arturo Castro Castro
El departamento de gestin de proyectos de una empresa desea manejar la informacin de sus proyectos
mediante una base de datos. De cada proyecto se tiene el cdigo, ttulo, fecha de inicio, fecha de finalizacin,
costo y los responsables de desarrollarlo. De cada responsable se conoce el cdigo, nombre, telfono fijo y
de algunos de ellos, el telfono mvil. Una persona puede ser responsable de algunas actividades de varios
proyectos a la vez. Se conoce la fecha de asignacin de un responsable a una actividad determinada. Una
actividad puede ser desarrollada por varios responsables. De cada actividad se conoce cdigo, descripcin,
fecha de inicio y fecha de finalizacin. La fecha de finalizacin de una actividad no puede ser superior a la
fecha de finalizacin del proyecto al que pertenece la actividad.

St

ud

io

Tr

ia

El Modelo Relacional Versin1 se presenta a continuacin:

sk
PD

Nota: La clave primaria de la tabla resp_act_proy es la combinacin de: CODRESP+CODACTIV+CODPROY


Elaborar un programa en Python que cargue un formulario con un men con las opciones:
1.Proyectos 2. Actividades
6. Terminar

3. Responsables 4. ActividadesxProyectos con Responsables

5. Listados

de

Si se selecciona Proyectos, Cargar un formulario con los cuadros de texto Cdigo, Nombre, Telfono Fijo,
Telfono Mvil y los botones para Ingresar, Consultar, Modificar y Borrar un Proyecto.
Si se selecciona Actividades, Cargar un formulario con los cuadros de texto y los botones para Ingresar,
Consultar, Modificar y Borrar una actividad.
Si se selecciona Responsables, Cargar un formulario con los cuadros de texto y los botones para Ingresar,
Consultar, Modificar y Borrar Un responsable.
Si se selecciona ActividadesxProyectos con Responsables Cargar un formulario con los cuadros de texto y
los botones para Ingresar, Consultar, Modificar y Borrar ActividadesxProyectos con Responsables.
Si selecciona Listados, Mostrar un formulario con los botones: 1 Listado de Proyectos con sus actividades. 2.
Listados de Responsables con sus actividades. Los listados se deben mostrar en QTableView

2. La herramientas

Intrprete de Python: Versin 2.7.8

de

sk
PD

St

ud

io

Tr

ia

https://www.python.org/downloads/

Diseador de Ambiente grfico para python 2.7


PYQT (Windows 32 bit installer)

de

sk
PD

St

ud

io

Tr

ia

http://www.riverbankcomputing.co.uk/software/pyqt/download

IDE para python 2.7


PyScripter-v2.5.3 (32 bit)

de

sk
PD

St

ud

io

Tr

ia

https://code.google.com/p/pyscripter/downloads/list

MYSQL para python 2.7

http://dev.mysql.com/downloads/file.php?id=454383

sk
PD

de
F
io

ud

St
l

ia

Tr

3. Instalar Herramientas

de

sk
PD

St

ud

io

Tr

ia

Instalar Python 2.7

l
ia
Tr
io
ud
St
F
sk
PD
de
Finalizar

Instalar PyQt4-4.11.3-gpl-Py2.7-Qt4.8.6-x32

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F
sk
PD
de
Finalizar

Instalar PyScripter-v2.5.3-Setup

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St

Finalizar

ia

Tr

de

sk
PD

St

ud

io

Tr

ia

Instalar Mysql para Python

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F
sk
PD

de

El motor de bases de datos seleccionado es MYSQL y utilizar la herramienta portable denominada


MOWES, que permite trabajar con la herramienta web PHPMYADMIN para crear y administrar la Base de
datos que se llamar BDPROYECTOS (Nota: Se requiere tener instalado MYSQL o levantar los servicios de
MYSQL desde un portable. Para este problema se usar MOWES portable, ya que existen otros):
3.1 Ejecutar MOWES:

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F
sk
PD
de
3.2 Abrir PHPMYADMIN en un Navegador WEB:
Se digita: http://localhost:81/phpmyadmin
Mowes Fue configurado para salir por el puerto 81

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

de

sk
PD

3.3 Crear la Base de Datos BDPROYECTOS

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
F

St

ud
de

sk
PD

3.4 Crear la tabla RESPONSABLE:

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St

Click en Grabar

ia

Tr

l
ia
Tr
io
St

ud
de

sk
PD

3.5 Crear la tabla PROYECTO


3.5.1 Click en el link BDPROYECTOS
3.5.2 Y se procede igual:

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
F

St

ud
de

sk
PD

Igual para la tabla Actividad:

l
ia
Tr
io
ud
St

sk
PD

Como la Clave Primaria de la tabla RESP_ACT_PROY est compuesta por CODRESP+CODACTIV+CODPROY,


Se procede un poco diferente:

de

3.6 Se crea la Tabla RESP_ACT_PROY sin Clave Primaria

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

de

sk
PD

3.7 Se crea la clave primaria compuesta con los tres campos

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
St

ud
de

sk
PD

3.8 Crear las tres claves forneas


3.8.1 Clave Fornea CODRESP
3.8.1.1 Se crea un ndice para CODRESP

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
St

ud
de

sk
PD

3.8.1.2 Click en el link Vista Relaciones

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

3.8.1.3 En la segunda columna del Item relaciones internas se selecciona la clave primaria en la tabla
RESPONSABLE (en la fila de la Clave Fornea CODRESP):

sk
PD

de
F
io

ud

St

Click en grabar

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

Click en el link RESP_ACT_PROY, para crear las otras claves forneas:

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

Click en vista Relaciones y se agregan las otras claves forneas:

sk
PD

de
F
io

ud

St

Click en grabar

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

Click en el link BDPROYECTOS para ver el diagrama:

l
ia
Tr
io
ud
St

de

sk
PD

Click en Diseador:

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

de

sk
PD

Click el cono Pequeos/grandes todos, para ver el contenido de las tablas:

l
ia
Tr
io
F

St

ud
de

sk
PD

Y Se reorganizan al gusto:

l
ia
Tr
io
ud
St

de

sk
PD

Click en el link BDPROYECTOS para luego crear el script de la Base de Datos

l
ia
Tr
io
ud
St

de

sk
PD

Click en exportar:

l
ia
Tr
io
ud
St
F

de

sk
PD

Chequear la opcin Enviar (genera un archivo descargable)

l
ia
Tr
io
ud
St
F

Click en continuar

de

sk
PD

Se crear un archivo de texto llamado BDPROYECTOS.sql y se guarda en la carpeta configurada para


descargas

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

4. Arquitectura del Software


4.1 Se crearn tres paquetes: modelo, vista y control
4.1.1 El Paquete modelo, contendr una clase por cada tabla de la base de datos. Cada Clase un
atributo por cada campo de la tabla. Un mtodo inicializador de atributos, un mtodo get y un
mtodo set por cada atributo.
4.1.2 El Paquete control, contendr una clase por cada tabla, cada Clase un mtodo inicializador de
objeto tipo modelo, un mtodo insertar, un mtodo consultar, un mtodo modificar, un
mtodo borrar y un mtodo listar (CRUD - Create, Read, Update and Delete-)
4.1.3 El Paquete vista, contendr una interfaz grfica diseada con PYQT4 para dar respuesta al
problema planteado.

de

sk
PD

St

ud

io

Tr

ia

5. Cdigo
5.1 Se crea una carpeta llamada pryProyectos, con tres carpetas: modelo, vita y control:

5.2 desde PYSCRIPTER se crea un mdulo llamado__init__.py dentro de cada carpeta para
relacionarlas como paquetes:

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

de

sk
PD

5.3 con PYQT4, se disea la interfaz grfica:


5.3.1 Diseo del Formulario frmMenuPricipal
5.3.1.1 Ejecutar designer que est en la carpeta C:\Python27\Lib\site-packages\PyQt4

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
F

St

ud
de

sk
PD

5.3.1.2 Crear un Main Window

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

5.3.1.3 Guardar el archivo con el nombre de frmMenuPricipal.ui en la carpeta C:\Python27\Lib\sitepackages\PyQt4

l
ia
Tr
io
ud
St

de

sk
PD

5.3.1.4 Crear el archivo frmMenuPrincipal.py utilizando el aplicativo que crea archivos .py a partir de
archivos.ui
5.3.1.5 Se ejecuta el cmd de DOS y se cambia a la carpeta C:\Python27\Lib\site-packages\PyQt4

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

de

sk
PD

5.3.1.6 Se ejecuta el siguiente comando para obtener el archivo .py de Python


pyuic4 -x frmMenuPrincipal.ui -o frmMenuPrincipal.py

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

5.3.1.7 copiar el archivo frmMenuPrincipal.py en la carpeta vista del proyecto

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St

de

sk
PD

5.3.1.8 Abrir y ejecutar el formulario en PYSCRIPTER

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

sk
PD

Se crean los Formularios tipo Widget, para Proyectos, Actividades, Responsables,


FrmResp_Act_Proy, Listados, Listado de Proyectos con sus actividades y Listados de
Responsables con sus actividades

de

5.3.2

l
ia
Tr
io
ud
St
F
sk
PD
de
5.3.2.1 El Formulario para proyectos se llama FrmProyectos

l
ia
Tr

de

sk
PD

St

ud

io

5.3.2.2 FrmProyectos contiene 6 etiquetas (Labels)(una de ellas para el ttulo), 5 cuadros de texto
(Plain Text Edit) llamados txtCod, txtTit, txtFini,txtFfin y txtCos. 4 botones de comando (Push
Button) llamdos btnGuardar, btnConsultar, btnModificar y btnBorrar

Se guarda con el nombre de FrmProyectos

l
ia
Tr

de

sk
PD

St

ud

io

5.3.2.3 FrmActividades contiene 5 etiquetas, 4 cuadros de texto y 4 botones de comando

5.3.2.4 FrmResponsables contiene 5 etiquetas, 4 cuadros de texto y 4 botones de comando

l
ia
Tr
io

de

sk
PD

St

ud

5.3.2.5 FrmResp_Act_Proy contiene 5 etiquetas, 4 cuadros de texto , 4 botones de comando y 1 Table


View

5.3.2.6 Se crean los archivos FrmProyectos.py, FrmActividades.py, FrmResponsables.py,


FrmResp_Act_Proy.py con el comando

pyuic4 archivo.ui -o archivo.py no es necesario la opcin x, ya que no se requiere de un ejecutable


interno. Estos formularios sern llamados externamente al darle click a las opciones del del men qu
estn el el formulario principal
pyuic4 FrmProyectos.ui -o FrmProyectos.py
pyuic4 FrmActividades.ui -o FrmActividades.py
pyuic4 FrmResponsables.ui -o FrmResponsables.py

sk
PD

St

ud

io

Tr

ia

pyuic4 FrmResp_Act_Proy.ui -o FrmResp_Act_Proy.py

de

5.3.2.7 Copiar los Archivos creados en la carpeta vista del proyecto y abrirlos con PYSCRIPTER

l
ia
Tr
io
ud

6. Codificacin

object como viene desde el diseador PYQT4.

St

Los formularios Ui_FrmProyectos, Ui_FrmActividades, Ui_FrmResponsables y Ui_FrmResp_Act_Proy,


requieren acceder al mtodo show (para ser mostrados desde el men principal). El mtodo show se
encuentra implementado en la clase QWidget del mdulo QtGui. Ver http://qt-project.org/doc/qt4.8/qtgui.html . Por lo tanto se debe expresar la herencia de los formularios con QtGui. QWidget y no con

sk
PD

Adicionalmente se debe implementar el mtodo __init__, en la clase de cada formulario para lograr el
efecto del llamado al mtodo show():
def __init__(self):

de

QtGui.QWidget.__init__(self)
self.setupUi(self)

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io

de

sk
PD

St

ud

En el formulario Principal se deben importar la clase de cada formulario:

En el Formulario principal se define la accin para cada men de barra, y que no tiene submen:
Como Listado de proyectos con sus actividades y Listado de Responsables con sus actividades, son
submens, ya vienen adicionados desde el diseador PYQT4.

l
ia
Tr
io

de

sk
PD

St

ud

Al Formulario principal se le adiciona la accin a cada men de la barra y que no tiene submen:

A los Mens, que no tienen submen, se cambia la propiedad setTitle por setText, y el nombre del men,
por el nombre de la accin.

l
ia
Tr

de

sk
PD

St

ud

io

Se invoca el mtodo connect de la clase QObject del mdulo QtCore, de tal manera que al darle click al
men o submen invoque los mtodos asociados y que permiten mostrar cada formulario segn sea el
caso:

Se programan los mtodos para cada accin:

l
Tr

ia
de

sk
PD

St

ud

io

Al ejecutar el Formulario principal queda:

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

St

ud

io

Tr

ia

6.1 Codificar las clases del paquete modelo


6.1.1 Ver http://elviajedelnavegante.blogspot.com/2010/10/las-propiedades-property-depython.html
6.1.2 Clase Proyecto

de

# -*- coding: utf-8 -*-

#------------------------------------------------------------------------------# Name:

module1

# Purpose:
# Author:

Carlos Arturo

#
# Created:

06/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#-------------------------------------------------------------------------------

class Proyecto(object):
def __init__(self, param_codigo, param_titulo, param_fechaIni,param_fechaFin,param_costo):
self.__codigo=param_codigo
self.__titulo=param_titulo
self.__fechaIni=param_fechaIni
self.__fechaFin=param_fechaFin

ia

self.__costo=param_costo

Tr

def __getCodigo(self):

sk
PD

def __getTitulo(self):

St

self.__codigo = param_codigo

ud

def __setCodigo(self, param_codigo = None):

io

return self.__codigo

return self.__titulo

de

def __setTitulo(self, param_titulo = None):


self.__titulo = param_titulo

def __getFechaIni(self):
return self.__fechaIni

def __setFechaIni(self, param_fechaIni = None):


self.__fechaIni = param_fechaIni

def __getFechaFin(self):
return self.__fechaFin

def __setFechaFin(self, param_fechaFin = None):


self.__fechaFin = param_fechaFin

def __getCosto(self):
return self.__costo

ia

def __setCosto(self, param_costo = None):

io

Tr

self.__costo = param_costo

codigo = property(fget = __getCodigo, fset = __setCodigo, doc = 'Cdigo')

ud

titulo = property(fget = __getTitulo, fset = __setTitulo, doc = 'Ttulo del proyecto')

St

fechaIni = property(fget = __getFechaIni, fset = __setFechaIni, doc = 'Fecha de Inicio del proyecto')

fechaFin = property(fget = __getFechaFin, fset = __setFechaFin, doc = 'Fecha de Finalizacin del


proyecto')

sk
PD

costo = property(fget = __getCosto, fset = __setCosto, doc = 'Costo')

de

6.1.3 Clase Actividad

l
ia
Tr
io
ud
St
F

# -*- coding: utf-8 -*-

# Name:

module1

# Author:

de

# Purpose:
#

sk
PD

#-------------------------------------------------------------------------------

Carlos Arturo

#
# Created:

08/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#-------------------------------------------------------------------------------

class Actividad(object):
def __init__(self, param_codigo, param_descripcion, param_fechaIni,param_fechaFin):
self.__codigo=param_codigo
self.__descripcion=param_descripcion
self.__fechaIni=param_fechaIni
self.__fechaFin=param_fechaFin

def __getCodigo(self):

ia

return self.__codigo

Tr

def __setCodigo(self, param_codigo = None):

io

self.__codigo = param_codigo

ud

def __getDescripcion(self):

St

return self.__descripcion

sk
PD

def __setDescripcion(self, param_descripcion = None):


self.__descripcion = param_descripcion

de

def __getFechaIni(self):
return self.__fechaIni

def __setFechaIni(self, param_fechaIni = None):


self.__fechaIni = param_fechaIni

def __getFechaFin(self):
return self.__fechaFin

def __setFechaFin(self, param_fechaFin = None):


self.__fechaFin = param_fechaFin

codigo = property(fget = __getCodigo, fset = __setCodigo, doc = 'Cdigo')


descripcion = property(fget = __getDescripcion, fset = __setDescripcion, doc = 'Descripcin de la
Actividad')
fechaIni = property(fget = __getFechaIni, fset = __setFechaIni, doc = 'Fecha de Inicio de la actividad')

sk
PD

St

ud

io

Clase Responsable

de

6.1.3

Tr

ia

fechaFin = property(fget = __getFechaFin, fset = __setFechaFin, doc = 'Fecha de Finalizacin de la


Actividad')

# -*- coding: utf-8 -*#------------------------------------------------------------------------------# Name:

module1

# Purpose:
#
# Author:

Carlos Arturo

#
# Created:

08/12/2014

# Copyright: (c) Carlos Arturo 2014

class Responsable(object):

ud

def __init__(self, codigo, nombre, telFijo,telMovil):

St

self.__codigo=codigo

sk
PD

self.__nombre=nombre
self.__telFijo=telFijo
self.__telMovil=telMovil

de

def __getCodigo(self):
return self.__codigo

def __setCodigo(self, codigo = None):


self.__codigo = codigo

def __getNombre(self):
return self.__nombre

io

#-------------------------------------------------------------------------------

ia

<your licence>

Tr

# Licence:

def __setNombre(self, nombre = None):


self.__nombre = nombre

def __getTelFijo(self):
return self.__telFijo

def __setTelFijo(self, telFijo = None):


self.__telFijo = telFijo

ia

def __getTelMovil(self):

io

Tr

return self.__telMovil

def __setTelMovil(self, telMovil = None):

St

ud

self.__telMovil = telMovil

sk
PD

codigo = property(fget = __getCodigo, fset = __setCodigo, doc = 'Cdigo')


nombre = property(fget = __getNombre, fset = __setNombre, doc = 'Nombre')
telFijo = property(fget = __getTelFijo, fset = __setTelFijo, doc = 'Telfono Fijo')

de

telMovil = property(fget = __getTelMovil, fset = __setTelMovil, doc = 'Telfono Mvil')

6.1.4 Clase Resp_Act_Proy

l
ia
Tr
io
ud
St
F

sk
PD

# -*- coding: utf-8 -*-

#------------------------------------------------------------------------------# Name:

module1

#
# Author:

de

# Purpose:

Carlos Arturo

#
# Created:

08/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#-------------------------------------------------------------------------------

class Resp_Act_Proy(object):
def __init__(self, codResp, codActiv, codProy,fecha_Asig):
self.__codResp=codResp
self.__codActiv=codActiv
self.__codProy=codProy
self.__fecha_Asig=fecha_Asig

def __getCodResp(self):

Tr

ia

return self.__codResp

io

def __setCodResp(self, codResp = None):

ud

self.__codResp = codResp

St

def __getCodActiv(self):

sk
PD

return self.__codActiv

def __setCodActiv(self, codActiv = None):

de

self.__codActiv = codActiv

def __getCodProy(self):
return self.__codProy

def __setCodProy(self, codProy = None):


self.__codProy = codProy

def __getFecha_Asig(self):
return self.__fecha_Asig

def __setFecha_Asig(self, fecha_Asig = None):


self.__fecha_Asig = fecha_Asig

codResp = property(fget = __getCodResp, fset = __setCodResp, doc = 'Cdigo Responsable')


codActiv = property(fget = __getCodActiv, fset = __setCodActiv, doc = 'Cdigo Actividad')
codProy = property(fget = __getCodProy, fset = __setCodProy, doc = 'Cdigo Proyecto')

Tr

ia

fecha_Asig = property(fget = __getFecha_Asig, fset = __setFecha_Asig, doc = 'Fecha Asignacin de la


Actividad')

ud

io

6.2 Codificar las clases del paquete control


6.2.1 Clase ConexionMySQL

St

# -*- coding: utf-8 -*-

#!/usr/bin/python

# Name:

sk
PD

#------------------------------------------------------------------------------module1

# Purpose:

# Author:
#
# Created:

de

Carlos Arturo

06/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#------------------------------------------------------------------------------import MySQLdb

class ConexionMySQL(object):
mensaje="ok"
conexion=None
cursor=None
lista=None
def __init__(self):
pass

def getLista(self):

Tr

ia

return self.lista

io

def abrirBd(self,usuario,contrasena,baseDeDatos):
mensaje="ok"

ud

try:

self.cursor = self.conexion.cursor()

St

self.conexion = MySQLdb.Connect(host="127.0.0.1", port=3306, user=usuario,


passwd=contrasena, db=baseDeDatos)

sk
PD

except MySQLdb.Error,msgError:

self.mensaje= "Problemas con la Base de Datos Error :%s"%msgError


except AttributeError as objAttributeError:

de

self.mensaje= "Problemas con la Base de Datos Error :"+objAttributeError[0]


return self.mensaje

def cerrarBd(self):
mensaje="ok"
try:
self.cursor.close()
self.conexion.close()

except MySQLdb.Error,msgError:
self.mensaje= "Problemas con la Base de Datos Error :%s"%msgError
except AttributeError as objAttributeError:
self.mensaje= "Problemas con la Base de Datos Error :"+objAttributeError[0]
return self.mensaje

def ejecutarComandoSql(self,comandoSql):

mensaje="ok"

ia

try:

Tr

self.cursor.execute(comandoSql)

io

self.lista = list(self.cursor)
self.conexion.commit()

ud

except MySQLdb.Error,msgError:

St

self.mensaje= "Problemas con la Base de Datos Error :%s"%msgError


except AttributeError as objAttributeError:

sk
PD

self.mensaje= "Problemas con la Base de Datos Error :"+objAttributeError[0]


return self.mensaje

Clase CtrProyecto

de

6.2.2

# -*- coding: utf-8 -*-

#------------------------------------------------------------------------------# Name:

module1

# Purpose:
#
# Author:
#

Carlos Arturo

# Created:

04/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#------------------------------------------------------------------------------from modelo.Proyecto import *


from control.ConexionMySQL import *
from control.CtrProyecto import *
def main():

ia

pass

Tr

if __name__ == '__main__':

io

main()

ud

class CtrProyecto(object):

St

mensaje='ok'
objProyecto=None

sk
PD

lista=None

def __init__(self,Proyecto):

de

self.objProyecto=Proyecto

def getLista(self):

return self.lista

def getObjProyecto(self):
return self.objProyecto

def guardar(self):

codigo=self.objProyecto.codigo
titulo=self.objProyecto.titulo
fechaIni=self.objProyecto.fechaIni
fechaFin=self.objProyecto.fechaFin
costo=self.objProyecto.costo
comandoSql="INSERT INTO PROYECTO
VALUES('"+codigo+"','"+titulo+"','"+fechaIni+"','"+fechaFin+"',"+str(costo)+")"

objConexionMySQL=ConexionMySQL()

ia

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

Tr

if self.mensaje=='ok':

if self.mensaje=='ok':

ud

self.mensaje= objConexionMySQL.cerrarBd()

sk
PD

codigo=self.objProyecto.codigo

St

return self.mensaje

def modificar(self):

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

titulo=self.objProyecto.titulo

fechaIni=self.objProyecto.fechaIni

de

fechaFin=self.objProyecto.fechaFin
costo=self.objProyecto.costo

comandoSql="UPDATE PROYECTO SET TITULO='"+


titulo+"',FECHAINI='"+fechaIni+"',FECHAFIN='"+fechaFin+"',COSTO="+str(costo)+" WHERE
CODIGO='"+codigo+"'"
objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def borrar(self):
codigo=self.objProyecto.codigo

comandoSql="DELETE FROM PROYECTO WHERE CODIGO='"+codigo+"'"

Tr

if self.mensaje=='ok':

ia

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

objConexionMySQL=ConexionMySQL()

if self.mensaje=='ok':

ud

self.mensaje= objConexionMySQL.cerrarBd()

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

sk
PD

def consultar(self):

St

return self.mensaje

codigo=self.objProyecto.codigo

de

comandoSql="SELECT * FROM PROYECTO WHERE CODIGO='"+codigo+"'"


objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
self.lista=objConexionMySQL.getLista()

self.objProyecto.titulo= self.lista[0][1]
self.objProyecto.fechaIni= self.lista[0][2]

self.objProyecto.fechaFin= self.lista[0][3]
self.objProyecto.costo= self.lista[0][4]
if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def listar(self):
codigo=self.objProyecto.codigo

ia

comandoSql="SELECT * FROM PROYECTO"

Tr

objConexionMySQL=ConexionMySQL()

io

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':

St

self.lista=objConexionMySQL.getLista()

ud

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

if self.mensaje=='ok':

sk
PD

self.mensaje= objConexionMySQL.cerrarBd()

6.2.3

de

return self.mensaje

Clase CtrActividad

# -*- coding: utf-8 -*#------------------------------------------------------------------------------# Name:

module1

# Purpose:
#
# Author:
#

Carlos Arturo

# Created:

04/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#------------------------------------------------------------------------------from modelo.Actividad import *


from control.ConexionMySQL import *
from control.CtrActividad import *
def main():

ia

pass

Tr

if __name__ == '__main__':

io

main()

ud

class CtrActividad(object):

St

mensaje='ok'
objActividad=None

sk
PD

lista=None

def __init__(self,Actividad):

de

self.objActividad=Actividad

def getLista(self):

return self.lista

def getObjActividad(self):
return self.objActividad

def guardar(self):

codigo=self.objActividad.codigo
descripcion=self.objActividad.descripcion
fechaIni=self.objActividad.fechaIni
fechaFin=self.objActividad.fechaFin

comandoSql="INSERT INTO ACTIVIDAD


VALUES("+codigo+",'"+descripcion+"','"+fechaIni+"','"+fechaFin+"')"

objConexionMySQL=ConexionMySQL()

ia

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

Tr

if self.mensaje=='ok':

if self.mensaje=='ok':

ud

self.mensaje= objConexionMySQL.cerrarBd()

St

return self.mensaje

def modificar(self):

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

sk
PD

codigo=self.objActividad.codigo

descripcion=self.objActividad.descripcion
fechaIni=self.objActividad.fechaIni

de

fechaFin=self.objActividad.fechaFin

comandoSql="UPDATE ACTIVIDAD SET


DESCRIPCION='"+descripcion+"',FECHAINI='"+fechaIni+"',FECHAFIN='"+fechaFin+"' WHERE
CODIGO="+codigo
objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def borrar(self):
codigo=self.objActividad.codigo

comandoSql="DELETE FROM ACTIVIDAD WHERE CODIGO="+codigo

ia

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

objConexionMySQL=ConexionMySQL()

Tr

if self.mensaje=='ok':

if self.mensaje=='ok':

ud

self.mensaje= objConexionMySQL.cerrarBd()

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

sk
PD

def consultar(self):

St

return self.mensaje

codigo=self.objActividad.codigo

de

comandoSql="SELECT * FROM ACTIVIDAD WHERE CODIGO="+codigo


objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
self.lista=objConexionMySQL.getLista()

self.objActividad.descripcion= self.lista[0][1]
self.objActividad.fechaIni= self.lista[0][2]

self.objActividad.fechaFin= self.lista[0][3]

if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def listar(self):
codigo=self.objActividad.codigo

ia

comandoSql="SELECT * FROM ACTIVIDAD"

Tr

objConexionMySQL=ConexionMySQL()

io

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':

St

self.lista=objConexionMySQL.getLista()

ud

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

if self.mensaje=='ok':

sk
PD

self.mensaje= objConexionMySQL.cerrarBd()

6.2.4

de

return self.mensaje

Clase CtrResponsable

# -*- coding: utf-8 -*#------------------------------------------------------------------------------# Name:

module1

# Purpose:
#
# Author:

Carlos Arturo

#
# Created:

04/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#------------------------------------------------------------------------------from modelo.Responsable import *


from control.ConexionMySQL import *
from control.CtrResponsable import *
def main():

Tr

ia

pass

io

if __name__ == '__main__':

ud

main()

St

class CtrResponsable(object):

lista=None

sk
PD

objResponsable=None

mensaje='ok'

de

def __init__(self,Responsable):

self.objResponsable=Responsable

def getLista(self):
return self.lista

def getObjResponsable(self):
return self.objResponsable

def guardar(self):
codigo=self.objResponsable.codigo
nombre=self.objResponsable.nombre
telFijo=self.objResponsable.telFijo
telMovil=self.objResponsable.telMovil

comandoSql="INSERT INTO RESPONSABLE


VALUES("+codigo+",'"+nombre+"','"+telFijo+"','"+telMovil+"')"

Tr

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

ia

objConexionMySQL=ConexionMySQL()

if self.mensaje=='ok':

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

ud

if self.mensaje=='ok':

St

self.mensaje= objConexionMySQL.cerrarBd()

sk
PD

def modificar(self):

return self.mensaje

codigo=self.objResponsable.codigo

nombre=self.objResponsable.nombre

de

telFijo=self.objResponsable.telFijo

telMovil=self.objResponsable.telMovil

comandoSql="UPDATE RESPONSABLE SET


nombre='"+nombre+"',TELFIJO='"+telFijo+"',TELMOVIL='"+telMovil+" WHERE CODIGO="+codigo
objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def borrar(self):
codigo=self.objResponsable.codigo

comandoSql="DELETE FROM RESPONSABLE WHERE CODIGO="+codigo

Tr

if self.mensaje=='ok':

ia

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

objConexionMySQL=ConexionMySQL()

if self.mensaje=='ok':

ud

self.mensaje= objConexionMySQL.cerrarBd()

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

sk
PD

def consultar(self):

St

return self.mensaje

codigo=self.objResponsable.codigo

de

comandoSql="SELECT * FROM RESPONSABLE WHERE CODIGO="+codigo


objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
self.lista=objConexionMySQL.getLista()

self.objResponsable.nombre= self.lista[0][1]
self.objResponsable.telFijo= self.lista[0][2]

self.objResponsable.telMovil= self.lista[0][3]

if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def listar(self):
codigo=self.objResponsable.codigo

ia

comandoSql="SELECT * FROM RESPONSABLE"

Tr

objConexionMySQL=ConexionMySQL()

io

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':

St

self.lista=objConexionMySQL.getLista()

ud

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

if self.mensaje=='ok':

sk
PD

self.mensaje= objConexionMySQL.cerrarBd()

6.2.5

de

return self.mensaje

Clase CtrResp_Act_Proy

# -*- coding: utf-8 -*#------------------------------------------------------------------------------# Name:

module1

# Purpose:
#
# Author:

Carlos Arturo

#
# Created:

04/12/2014

# Copyright: (c) Carlos Arturo 2014


# Licence:

<your licence>

#------------------------------------------------------------------------------from modelo.Resp_Act_Proy import *


from control.ConexionMySQL import *
from control.CtrResp_Act_Proy import *
def main():

Tr

ia

pass

io

if __name__ == '__main__':

ud

main()

St

class CtrResp_Act_Proy(object):

lista=None

sk
PD

objResp_Act_Proy=None

mensaje='ok'

de

def __init__(self,Resp_Act_Proy):

self.objResp_Act_Proy=Resp_Act_Proy

def getLista(self):
return self.lista

def getObjResp_Act_Proy(self):
return self.objResp_Act_Proy

def guardar(self):
codResp=self.objResp_Act_Proy.codResp
codActiv=self.objResp_Act_Proy.codActiv
codProy=self.objResp_Act_Proy.codProy
fecha_Asig=self.objResp_Act_Proy.fecha_Asig

comandoSql="INSERT INTO Resp_Act_Proy


VALUES('"+codResp+"',"+codActiv+","+codProy+",'"+fecha_Asig+"')"

Tr

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

ia

objConexionMySQL=ConexionMySQL()

if self.mensaje=='ok':

io

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

ud

if self.mensaje=='ok':

St

self.mensaje= objConexionMySQL.cerrarBd()

sk
PD

def modificar(self):

return self.mensaje

codResp=self.objResp_Act_Proy.codResp
codActiv=self.objResp_Act_Proy.codActiv

de

codProy=self.objResp_Act_Proy.codProy
fecha_Asig=self.objResp_Act_Proy.fecha_Asig

comandoSql="UPDATE Resp_Act_Proy SET codResp='"+codResp+"',


codActiv="+codActiv+",codProy="+codProy+",fecha_Asig='"+fecha_Asig+"' WHERE
codResp='"+codResp+"' AND codActiv="+codActiv+" AND codProy="+codProy
objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
if self.mensaje=='ok':

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

def borrar(self):
codResp=self.objResp_Act_Proy.codResp
codActiv=self.objResp_Act_Proy.codActiv

ia

codProy=self.objResp_Act_Proy.codProy

Tr

comandoSql="DELETE FROM Resp_Act_Proy WHERE codResp='"+codResp+"' AND


codActiv="+codActiv+" AND codProy="+codProy

io

objConexionMySQL=ConexionMySQL()

ud

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

St

if self.mensaje=='ok':

if self.mensaje=='ok':

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

sk
PD

self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

de

def consultar(self):

codResp=self.objResp_Act_Proy.codResp
codActiv=self.objResp_Act_Proy.codActiv
codProy=self.objResp_Act_Proy.codProy

comandoSql="SELECT * FROM Resp_Act_Proy WHERE codResp='"+codResp+"' AND


codActiv="+codActiv+" AND codProy="+codProy
objConexionMySQL=ConexionMySQL()
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

if self.mensaje=='ok':
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
self.lista=objConexionMySQL.getLista()
if (self.lista!=None):
self.objResp_Act_Proy.fecha_Asig= self.lista[0][3]
if self.mensaje=='ok':
self.mensaje= objConexionMySQL.cerrarBd()
return self.mensaje

Tr

ia

def listar(self):

io

comandoSql="SELECT * FROM Resp_Act_Proy"


objConexionMySQL=ConexionMySQL()

ud

self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")

St

if self.mensaje=='ok':

self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)

sk
PD

self.lista=objConexionMySQL.getLista()
if self.mensaje=='ok':

self.mensaje= objConexionMySQL.cerrarBd()

de

return self.mensaje

6.3 Terminar de codificar las clases del paquete vista


6.3.1 Clase Ui_FrmProyectos
Evento Click asociado a los botones btnGuardar, btnConsultar, btnModificar y btnBorrar

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

sk
PD

Clase Ui_FrmActividades

de

6.3.2

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F

sk
PD

Clase Ui_FrmResponsables

de

6.3.3

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
F

St
de

sk
PD

6.3.4 Clase Ui_FrmResp_Act_Proy

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

de

sk
PD

St

ud

io

Tr

ia

7. Ejecutar el aplicativo desde el formulario principal con datos de prueba

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr

io

8. Crear Un programa ejecutable con el formulario principal

de

sk
PD

St

8.1 instalar py2exe-0.6.9.win32-py2.7

ud

Ver: http://geekytheory.com/generar-un-ejecutable-exe-a-partir-de-un-py/

sk
PD

de
F
io

ud

St
l

ia

Tr

l
ia
Tr
io
ud
St
F
sk
PD
de
8.2 Crear Un archivo llamado setup.py en la vista

l
ia
Tr
ud

io

# -*- coding: utf-8 -*-

from distutils.core import setup

version="1.0",

sk
PD

setup(name="Manejo Proyectos",

St

import py2exe

description="Breve descripcion",

de

author="autor",

author_email="email del autor",


url="url del proyecto",

license="tipo de licencia",
scripts=["frmMenuPrincipal.py"],
console=["frmMenuPrincipal.py"],
options={"py2exe": {"bundle_files": 1}},
zipfile=None,
)

io

Tr

ia

8.3 Desde la consola se cambia a la carpeta vista

de

sk
PD

St

ud

8.4 Se ejecuta setup.py py2exe