Fundamentos de Python con Orientación a Objetos y Basado en Problemas Caso Gestión Información de Proyectos con Bases de Datos Relacionales 1. El Problema Profesor: Carlos Arturo Castro Castro El departamento de gestión de proyectos de una empresa desea manejar la información de sus proyectos mediante una base de datos. De cada proyecto se tiene el código, título, fecha de inicio, fecha de finalización, costo y los responsables de desarrollarlo. De cada responsable se conoce el código, nombre, teléfono fijo y de algunos de ellos, el teléfono móvil. Una persona puede ser responsable de algunas actividades de varios proyectos a la vez. Se conoce la fecha de asignación de un responsable a una actividad determinada. Una actividad puede ser desarrollada por varios responsables. De cada actividad se conoce código, descripción, fecha de inicio y fecha de finalización. La fecha de finalización de una actividad no puede ser superior a la fecha de finalización del proyecto al que pertenece la actividad.
St
ud
io
Tr
ia
l
El Modelo Relacional Versión1 se presenta a continuación:
sk PD
F
Nota: La clave primaria de la tabla resp_act_proy es la combinación 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 Código, Nombre, Teléfono Fijo, Teléfono Móvil 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
Int茅rprete de Python: Versi贸n 2.7.8
de
sk PD
F
St
ud
io
Tr
ia
l
https://www.python.org/downloads/
DiseĂąador de Ambiente grĂĄfico para python 2.7 PYQT (Windows 32 bit installer)
de
sk PD
F
St
ud
io
Tr
ia
l
http://www.riverbankcomputing.co.uk/software/pyqt/download
IDE para python 2.7 PyScripter-v2.5.3 (32 bit)
de
sk PD
F
St
ud
io
Tr
ia
l
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
F
St
ud
io
Tr
ia
l
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
l
ia
Tr
de
sk PD
F
St
ud
io
Tr
ia
l
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
l
ia
Tr
l ia Tr io St
ud de
sk PD
F
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
F
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
F
3.8 Crear las tres claves foráneas 3.8.1 Clave Foránea 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
F
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
F
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 Forรกnea CODRESP):
sk PD
de F io
ud
St
Click en grabar
l
ia
Tr
l ia Tr io ud St
de
sk PD
F
Click en el link RESP_ACT_PROY, para crear las otras claves forรกneas:
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
F
Click en vista Relaciones y se agregan las otras claves forรกneas:
sk PD
de F io
ud
St
Click en grabar
l
ia
Tr
l ia Tr io ud St
de
sk PD
F
Click en el link BDPROYECTOS para ver el diagrama:
l ia Tr io ud St
de
sk PD
F
Click en Dise単ador:
sk PD
de F io
ud
St l
ia
Tr
l ia Tr io ud St F
de
sk PD
Click el Ăcono PequeĂąos/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
F
Click en el link BDPROYECTOS para luego crear el script de la Base de Datos
l ia Tr io ud St
de
sk PD
F
Click en exportar:
l ia Tr io ud St F
de
sk PD
Chequear la opci贸n 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 crearán 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 método inicializador de atributos, un método get y un método set por cada atributo. 4.1.2 El Paquete control, contendrá una clase por cada tabla, cada Clase un método inicializador de objeto tipo modelo, un método insertar, un método consultar, un método modificar, un método borrar y un método listar (CRUD - Create, Read, Update and Delete-) 4.1.3 El Paquete vista, contendrá una interfaz gráfica diseñada con PYQT4 para dar respuesta al problema planteado.
de
sk PD
F
St
ud
io
Tr
ia
l
5. Código 5.1 Se crea una carpeta llamada pryProyectos, con tres carpetas: modelo, vita y control:
5.2 desde PYSCRIPTER se crea un módulo 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 diseña la interfaz gráfica: 5.3.1 Diseño 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
F
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
F
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
F
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
F
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
F
St
ud
io
5.3.2.2 FrmProyectos contiene 6 etiquetas (Labels)(una de ellas para el tĂtulo), 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
F
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
F
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 opción –x, ya que no se requiere de un ejecutable interno. Estos formularios serán llamados externamente al darle click a las opciones del del menú qu están el el formulario principal pyuic4 FrmProyectos.ui -o FrmProyectos.py pyuic4 FrmActividades.ui -o FrmActividades.py pyuic4 FrmResponsables.ui -o FrmResponsables.py
sk PD
F
St
ud
io
Tr
ia
l
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. Codificación
F
object como viene desde el diseñador PYQT4.
St
Los formularios Ui_FrmProyectos, Ui_FrmActividades, Ui_FrmResponsables y Ui_FrmResp_Act_Proy, requieren acceder al método show (para ser mostrados desde el menú principal). El método show se encuentra implementado en la clase QWidget del módulo 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 método __init__, en la clase de cada formulario para lograr el efecto del llamado al método 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
F
St
ud
En el formulario Principal se deben importar la clase de cada formulario:
En el Formulario principal se define la acción 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 submenús, ya vienen adicionados desde el diseñador PYQT4.
l ia Tr io
de
sk PD
F
St
ud
Al Formulario principal se le adiciona la acción a cada menú de la barra y que no tiene submenú:
A los Menús, que no tienen submenú, se cambia la propiedad setTitle por setText, y el nombre del menú, por el nombre de la acción.
l ia Tr
de
sk PD
F
St
ud
io
Se invoca el método connect de la clase QObject del módulo QtCore, de tal manera que al darle click al menú o submenú invoque los métodos asociados y que permiten mostrar cada formulario según sea el caso:
Se programan los métodos para cada acción:
l Tr
ia de
sk PD
F
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
F
St
ud
io
Tr
ia
l
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
l
self.__costo=param_costo
Tr
def __getCodigo(self):
sk PD
def __getTitulo(self):
F
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
l
def __setCosto(self, param_costo = None):
io
Tr
self.__costo = param_costo
codigo = property(fget = __getCodigo, fset = __setCodigo, doc = 'C贸digo')
ud
titulo = property(fget = __getTitulo, fset = __setTitulo, doc = 'T铆tulo del proyecto')
St
fechaIni = property(fget = __getFechaIni, fset = __setFechaIni, doc = 'Fecha de Inicio del proyecto')
F
fechaFin = property(fget = __getFechaFin, fset = __setFechaFin, doc = 'Fecha de Finalizaci贸n 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
l
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
F
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 = 'C贸digo') descripcion = property(fget = __getDescripcion, fset = __setDescripcion, doc = 'Descripci贸n de la Actividad') fechaIni = property(fget = __getFechaIni, fset = __setFechaIni, doc = 'Fecha de Inicio de la actividad')
sk PD
F
St
ud
io
Clase Responsable
de
6.1.3
Tr
ia
l
fechaFin = property(fget = __getFechaFin, fset = __setFechaFin, doc = 'Fecha de Finalizaci贸n 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
F
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
l
<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
l
def __getTelMovil(self):
io
Tr
return self.__telMovil
def __setTelMovil(self, telMovil = None):
St
ud
self.__telMovil = telMovil
sk PD
F
codigo = property(fget = __getCodigo, fset = __setCodigo, doc = 'C贸digo') nombre = property(fget = __getNombre, fset = __setNombre, doc = 'Nombre') telFijo = property(fget = __getTelFijo, fset = __setTelFijo, doc = 'Tel茅fono Fijo')
de
telMovil = property(fget = __getTelMovil, fset = __setTelMovil, doc = 'Tel茅fono M贸vil')
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
l
return self.__codResp
io
def __setCodResp(self, codResp = None):
ud
self.__codResp = codResp
St
def __getCodActiv(self):
sk PD
F
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 = 'C贸digo Responsable') codActiv = property(fget = __getCodActiv, fset = __setCodActiv, doc = 'C贸digo Actividad') codProy = property(fget = __getCodProy, fset = __setCodProy, doc = 'C贸digo Proyecto')
Tr
ia
l
fecha_Asig = property(fget = __getFecha_Asig, fset = __setFecha_Asig, doc = 'Fecha Asignaci贸n de la Actividad')
ud
io
6.2 Codificar las clases del paquete control 6.2.1 Clase ConexionMySQL
St
# -*- coding: utf-8 -*-
F
#!/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
l
return self.lista
io
def abrirBd(self,usuario,contrasena,baseDeDatos): mensaje="ok"
ud
try:
F
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
l
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
F
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
l
pass
Tr
if __name__ == '__main__':
io
main()
ud
class CtrProyecto(object):
St
mensaje='ok' objProyecto=None
sk PD
F
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
l
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
Tr
if self.mensaje=='ok':
if self.mensaje=='ok':
ud
self.mensaje= objConexionMySQL.cerrarBd()
F
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")
l
objConexionMySQL=ConexionMySQL()
if self.mensaje=='ok':
ud
self.mensaje= objConexionMySQL.cerrarBd()
io
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
sk PD
def consultar(self):
F
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
l
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
F
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
l
pass
Tr
if __name__ == '__main__':
io
main()
ud
class CtrActividad(object):
St
mensaje='ok' objActividad=None
sk PD
F
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
l
self.mensaje=objConexionMySQL.abrirBd("root","","bdproyectos")
Tr
if self.mensaje=='ok':
if self.mensaje=='ok':
ud
self.mensaje= objConexionMySQL.cerrarBd()
F
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")
l
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):
F
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
l
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
F
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
l
pass
io
if __name__ == '__main__':
ud
main()
St
class CtrResponsable(object):
lista=None
sk PD
objResponsable=None
F
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
l
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):
F
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")
l
objConexionMySQL=ConexionMySQL()
if self.mensaje=='ok':
ud
self.mensaje= objConexionMySQL.cerrarBd()
io
self.mensaje=objConexionMySQL.ejecutarComandoSql(comandoSql)
sk PD
def consultar(self):
F
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
l
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
F
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
l
pass
io
if __name__ == '__main__':
ud
main()
St
class CtrResp_Act_Proy(object):
lista=None
sk PD
objResp_Act_Proy=None
F
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
l
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):
F
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
l
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':
F
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
l
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
F
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
F
St
ud
io
Tr
ia
l
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
F
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",
F
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
l
8.3 Desde la consola se cambia a la carpeta vista
de
sk PD
F
St
ud
8.4 Se ejecuta setup.py py2exe