Sie sind auf Seite 1von 20

Contenido

INTRODUCCION. .................................................................................................................................. 2
1. Software a Instalar. ..................................................................................................................... 3
1.0. Python. ................................................................................................................................ 3
1.1. PosgreSQL............................................................................................................................ 3
1.2. PYQT5 Designer. .................................................................................................................. 3
1.3. Sublimetext. ........................................................................................................................ 3
1.4. Psycopg2.............................................................................................................................. 3
2. Confección de la tabla usuarios. ................................................................................................. 4
2.0. Confección de Tablespaces. .................................................................................................... 4
2.1. Scrip para confeccionar la tabla usuarios................................................................................. 4
2.2. Confección indice Tabla Usuarios. ........................................................................................... 4
3. Confección Forma de Mantenimiento ....................................................................................... 5
4.0. Copiando el Código Python. ........................................................................................................ 6
4. Explicación de los elementos del código fuente. ...................................................................... 12
4.0. Activación de los Push Button. .......................................................................................... 13
4.1. Activación de la Tecla RETURN. ......................................................................................... 13
4.2. Establecer conexión a la base de datos Postgresql ........................................................... 13
5. Cómo centrar la forma en la pantalla. ...................................................................................... 14
6. Métodos para ir pasando de un campo a otro con ENTER. ...................................................... 14
7. Método para limpiar los campos. ............................................................................................. 14
8. Método para salir de la forma y uso el QMessagebox.............................................................. 15
9. Proceso para cargar y limpiar el TableWidgets. ........................................................................ 15
10. Proceso para Insertar los Datos. ........................................................................................... 16
11. Proceso para Modificar los Datos. ........................................................................................ 17
12. Proceso para Consulta de Datos. .......................................................................................... 18
13. Proceso para Borrar Datos. ................................................................................................... 19

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 1
MANTENIMIENTO TABLA CON PYTHON Y PYQT5.

INTRODUCCION.

El presente trabajo tiene como objetivo principal, mostrar la forma de realizar el mantenimiento
de una tabla, haciendo inclusiones, modificaciones, consultas y eliminación de registros. Utilizando
el Python 3.5, como lenguaje, PYQT5 como diseñador de la pantalla y la base de datos
PostgreSQL. Esta primera publicación que se realiza es para que sea sometida a revisiones, críticas
y mejoramiento del código. Se pueden hacer todas las sugerencias y cambios al correo al pie de
página mencionada.
Se asume que las personas interesadas en el documento ya conocen lo básico de Python, PYQT5 y
PostgreSQL y que tienen instaladas las herramientas para llevar a cabo el ejemplo. De lo contrario,
más adelante se mencionan las direcciones de internet donde se pueden descargar.

El mantenimiento utiliza una tabla simple, sin índices ni constrains de ninguna clase, por lo
consiguiente se pueden incluir registros duplicados. La finalidad es aprender y mostrar a las
personas que se inician en Python, como se hacen los procesos que se incluyeron en el
mantenimiento.

En el código de programación se aprenderán los siguientes procesos:

- Incluir, excluir, modificar y borrar datos.


- Como conectarse al PostgreSQL, de dos formas diferentes.
- Utilización del messagebox. Forma para emitir mensajes.
- Uso del clicked.connect para habilitar los button.
- Uso del returnPressed.connect, para navegar en la forma con el ENTER.
- Uso de setGeometry para centrar la forma en la pantalla.
- Dar formato a una cantidad que se ingresa.
- Como cargar y borrar un tablewidgets.

Estos y otros conceptos se explican en el documento, con la finalidad de sean bien aprovechados
por las personas que lean el documento.

Además de este documento, se ha compactado un archivo que lleva, el archivo Python y la Forma.

Nota.
Es importante manifestar que el entorno de desarrollo es bajo Windows 64 bits.

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 2
1. Software a Instalar.

1.0. Python.
Para llevar a cabo el mantenimiento de la tabla que hemos llamado usuarios,
necesitamos tener instalado el Python versión 3.5. El cual se puede descargar de la
siguiente página.
https://www.python.org/downloads/

1.1. PosgreSQL.
El ejemplo está basado o utiliza la base de datos POSTGRESQL 9.6, la cual podemos
descargar de la siguiente página.
https://www.postgresql.org/about/news/1733/

1.2. PYQT5 Designer.


El PYQT5 es la herramienta gráfica para confeccionar las formas y se puede descargar
de la siguiente página.
https://www.riverbankcomputing.com/software/pyqt/download5

1.3. Sublimetext.
Como procesador utilizaremos el SublimeText. Pueden utilizar el que gusten. La página
para descargarlo es la siguiente.
http://es.ccm.net/download/descargar-7690-sublime-text

1.4. Psycopg2.

Psycopg es un adaptador de PostgreSQL, que se utiliza con Python. Es un contenedor,


para libpq, que es una biblioteca de PostgreSQL.

La implementación actual de psycopg2 soporta:

 Versiones de Python 2 de 2.6 a 2.7


 Python 3 versiones de 3.2 a 3.6
 Versiones del servidor PostgreSQL de 7.4 a 9.6
 Versión de la biblioteca de cliente de PostgreSQL desde 9.1

La página para descargar el Psycopg, es la siguiente.


http://www.stickpeople.com/projects/python/win-psycopg/

También se pueden referir a la siguiente página, para obtener más información.


https://translate.google.com/translate?hl=es&sl=en&u=http://initd.org/psycopg/dow
nload/&prev=search

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 3
2. Confección de la tabla usuarios.
Instaladas las herramientas necesarias, procedemos a confeccionar la tabla usuarios, la
cual nos va a servir para trabajar en el ejemplo de mantenimiento de tablas.

Podemos confeccionar el siguiente tablespaces. Es importante manifestar, que no es


necesario confeccionar el tablespaces, se puede dejar también el que está por default.

2.0. Confección de Tablespaces.


-- DROP TABLESPACE municipal
CREATE TABLESPACE municipal
OWNER postgres
LOCATION 'c:\\municipal';
COMMENT ON TABLESPACE municipal
IS 'Tablespaces para almacenar la información.';

2.1. Scrip para confeccionar la tabla usuarios.


-- Table: public.usuarios
-- DROP TABLE public.usuarios;
CREATE TABLE public.usuarios
(
identificacion numeric(3,0),
nombre character(50),
edad integer,
salario numeric(12,2),
ciudad character(20)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.usuarios
OWNER TO postgres;

2.2. Confección indice Tabla Usuarios.


-- Index: public.pk_usuarios
-- DROP INDEX public.pk_usuarios;

CREATE UNIQUE INDEX pk_usuarios


ON public.usuarios
USING btree
(identificacion)
TABLESPACE municipal;

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 4
Muy bien, instaladas las herramientas necesarias, confeccionado el tablespaces, la tabla
usuarios y el índice, procederemos a confeccionar la forma que permitirá hacer el
mantenimiento de la tabla usuarios.

3. Confección Forma de Mantenimiento.


Para llevar a cabo este proceso, activamos el PYQT5, software que permite hacer el
proceso para la confección de la forma de mantenimiento. Se nos va a mostrar una
pantalla, similar a la siguiente forma.

Mostrada la pantalla del diseñador, escogemos donde dice Main Windows, para que se
abra una nueva pantalla y realizar el siguiente diseño.

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 5
Seguidamente vamos a confeccionar una carpeta con el nombre de mantenimiento y
guardamos esta forma con el nombre de mantenimiento.

3.0. Elementos de la Forma.


Botones.
Vanos a confeccionar 5 botones, Push Button, los cuales los etiquetaremos con los
siguientes nombres.

Etiqueta Nombre del Botón. toolTip


Insertar insertar Insertar Datos.
Limpiar limpiar Limpiar Campos.
Modificar modificar Modificar la Información.
Borrar borrar Borrar Registros.
Salir cancelar Salir de la Forma.

En el WindowsTitle pondremos Mantenimiento de Usuarios.

Etiquetas.
Ponemos las siguientes etiquetas.
Etiquetas LineEdit SpinBox Input Mask
Identificación identifica ###
Nombre nombre
Edad edad sbedad ### Maximo 120 años Disable
Nombre Mostrar nombreaux
Salario salario ###,###.00
Ciudad ciudad

TableWidgets.
Confeccionamos un tablewidgets y le ponemos por nombre tablewidgets.

Finalmente salvamos la forma. Ahora bien, el proceso que sigue es copiar el código
Python en el SublimeText.

4.0. Copiando el Código Python.


Realizado todo lo anterior, procedemos a copiar el siguiente código, que contiene todas
las instrucciones necesarias, para llevar a cabo nuestro ejemplo y que explicaremos el
contenido más adelante. Es importante recordar indentar el código tal y como lo exige
Python. Guardamos el archivo con el nombre de mantenimiento.

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 6
import sys
import psycopg2 #archivo de conexcion a postgresql
from PyQt5.QtWidgets import QApplication,QMainWindow, QDialog, QMessageBox, QTableWidget, QTableWidgetItem,
QLineEdit,QPushButton, QWidget,QVBoxLayout
from PyQt5 import uic
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
from msvcrt import getch
from decimal import Decimal

class Ventana(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("mantenimientoconsulta3.ui",self)

#Activa los botones de Insertar, Consultar, Modificar, Borrar y Salir.


self.cancelar.clicked.connect(self.Cancelar)
self.limpiar.clicked.connect(self.limpiacampos)
self.insertar.clicked.connect(self.InsertarDatos)
self.modificar.clicked.connect(self.Modificar)
self.borrar.clicked.connect(self.Borrar)

#Activa el RETURN. para pasar de campo en campo.


self.identifica.returnPressed.connect(self.Consultar2)
self.nombre.returnPressed.connect(self.navegar2)
self.edad.returnPressed.connect(self.navegar3)
self.salario.returnPressed.connect(self.navegarsalario)
self.ciudad.returnPressed.connect(self.navegarciudad)

#Establecer conexión a la base de datos Postgresql


self.db = QSqlDatabase.addDatabase('QPSQL')
self.db.setHostName('localhost')
self.db.setDatabaseName('municipal')
self.db.setUserName('postgres')
self.db.setPassword('Administra8080')

estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
self.close()

#Define la posición del Form en la pantalla.


self.setGeometry(450, 100, 500, 490)
self.show()
self.Seleccionar()

#Método para cerrar la ventana.


def Cancelar(self):
self.close()

def cerrarbasedatos(self):

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 7
objCursor.close()
obj.close()

#Defiición del setFocus. Para pasar con ENTER, de campo en campo.


def navegar(self):
self.nombre.setFocus()

def navegar2(self):
self.sbedad.setFocus()

def navegar3(self):
self.salario.setFocus()

def navegarsalario(self):
self.ciudad.setFocus()

def navegarciudad(self):
self.identifica.setFocus()

def limpiacampos(self):
self.identifica.setText(" ")
self.nombre.setText(" ")
self.edad.setText(" ")
self.nombreaux.setText(" ")
self.salario.setText(str(0))
self.ciudad.setText(" ")
self.identifica.setFocus()

#Proceso que se ejecuta cuando se pulsa la tecla de salir o la X de la forma.


def closeEvent(self, event):
close = QMessageBox.question(self, "Salir", "Desea Salir de la Forma", QMessageBox.Yes, QMessageBox.No)
if close == QMessageBox.Yes:
self.db.close()
event.accept()
else:
event.ignore()

#Proceso para rellenar el tableWidget


def Seleccionar(self):
cadenaconexcion="host='localhost' dbname='municipal' user='postgres' password='Administra8080'"
obj=psycopg2.connect(cadenaconexcion)
objCursor=obj.cursor()
self.LimpiarTable()

try:
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
else:
self.tableWidget.setColumnCount(4)

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 8
self.tableWidget.setHorizontalHeaderLabels(['Id', 'Nombre ', 'Edad', 'Salario'])
self.tableWidget.setColumnWidth(0,30)
self.tableWidget.setColumnWidth(1,200)
self.tableWidget.setColumnWidth(2,40)
row = 0
sql = "SELECT * FROM usuarios order by identificacion"
query = QSqlQuery(sql)

try:
#Proceso para cargar el TableWidgets
while query.next():
self.tableWidget.insertRow(row)
id = QTableWidgetItem(str(query.value(0)))
nombre = QTableWidgetItem(str(query.value(1)))
edad = QTableWidgetItem(str(query.value(2)))
salario = QTableWidgetItem(str(query.value(3)))

self.tableWidget.setItem(row, 0, QTableWidgetItem('{0:.0f}'.format(query.value(0))))
self.tableWidget.setItem(row, 1, QTableWidgetItem(str(query.value(1).upper())))
self.tableWidget.setItem(row, 2, QTableWidgetItem(str(query.value(2))))
self.tableWidget.setItem(row, 3, QTableWidgetItem('{0:,.2f}'.format(query.value(3))))

row = row + 1
except:
QMessageBox.information(self, "Ciclo erroneo.","Ciclo no se pudo realizar..")

except:
QMessageBox.information(self, "Conexción Erronea.","No se pudo Conectar a la Base de Datos el TableGidgets.
Pulse Enter pra Continuar.")

#Proceso para limpiar el TableWidgets


def LimpiarTable(self):
w=0
j=self.tableWidget.rowCount()
while w < j:
self.tableWidget.removeRow(self.tableWidget.rowCount()-1)
w=w+1

#Proceso para Insertar Datos


def InsertarDatos(self):

cadenaconexcion= "host='localhost' dbname='municipal' user='postgres' password='Administra8080'"


obj = psycopg2.connect(cadenaconexcion)
objCursor=obj.cursor()
estado = self.db.open()

if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
else:

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 9
try:
iden = self.identifica.text()
nombre = self.nombre.text()
eda = self.sbedad.text()
salario = self.salario.text()
salarios2 = self.salario.text().replace(",","") #Quita las comas de las unidades
salario = Decimal(salarios2)
ciudad = self.ciudad.text()

self.edad.setText(self.sbedad.text())
self.nombreaux.setText(self.nombre.text())

reply = QMessageBox.question(self, "Mensaje", "Desea Incluir Registro", QMessageBox.Yes, QMessageBox.No)

if reply == QMessageBox.Yes:
#Ejecutar consulta de la BD

print("Llegando el insert")
objCursor.execute("INSERT INTO USUARIOS(identificacion,nombre, edad,salario,ciudad)
VALUES(%s,%s,%s,%s,%s)",(iden,nombre,eda,salario,ciudad))
obj.commit()

QMessageBox.information(self,"Correcto.","Datos Guardados.")
self.Seleccionar()
self.limpiacampos()
objCursor.close()
obj.close()
except:
QMessageBox.information(self,"Incorrecto.","Datos No Guardados.")

def Modificar(self,idatos):
try:
cadenaconexcion = "host='localhost' dbname='municipal' user='postgres' password='Administra8080'"
obj = psycopg2.connect(cadenaconexcion)
objCursor = obj.cursor()

estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)

datos = int(self.identifica.text())
nombres = self.nombre.text()
edadnueva = self.edad.text()
edadnueva = self.sbedad.text()
salarios2 = self.salario.text().replace(",","")
salarios = Decimal(salarios2)
ciudadnueva = self.ciudad.text()
reply = QMessageBox.question(self, "Mensaje", "Desea Modificar Registro", QMessageBox.Yes, QMessageBox.No)
if reply == QMessageBox.Yes:

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 10
objCursor.execute("UPDATE usuarios SET nombre = %s, edad = %s,salario = %s, ciudad = %s WHERE
identificacion = %s", (nombres,edadnueva,salarios,ciudadnueva,datos))
obj.commit()

self.LimpiarTable() #Carga proceso para limpiar el tablewidgets.


self.Seleccionar() #Carga proceso para mostrar el tablewidgets con datos.
self.limpiacampos() #Limpia los campos de la forma.
QMessageBox.information(self,"Modificacion Datos.","Datos Modificados")

except:
QMessageBox.information(self,"Modificacion Datos.","Datos No Modificados")
obj.rollback()
objCursor.close()
obj.close()

#Método para consultar los datos.


def Consultar2(self):
llave = str(self.identifica.text())
sql = ("SELECT * FROM usuarios where identificacion ="+self.identifica.text())

query = QSqlQuery(sql)
consulta = QSqlQuery()
consulta.prepare(sql)
consulta.bindValue(":ID ",id)
estado = consulta.exec_()

if estado == False:
QMessageBox.information(self,"Abrir Base de Datos.","Conexción Fallida")
#Verifica si se llevó a cabo la consulta, trayendo información.
if consulta.size() >0:
idatos = self.identifica.text()
nombre = self.nombre.text()
edad = self.edad.text()

self.nombreaux.setText(self.nombre.text())

#Ciclo para mostrar los datos en pantalla, si existiera más de una fila.
while query.next():

#Muestra los Datos en Pantalla.


self.identifica.setText(str('{0:.0f}'.format(query.value(0))))
self.nombre.setText(query.value(1).upper())
self.edad.setText(str(query.value(2)))
self.salario.setText(str('{:,f}'.format(query.value(3))))
self.ciudad.setText(query.value(4))

QMessageBox.information(self,"Consulta Datos Correcta.","Validacion Correcta")


else:
self.nombre.setFocus()

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 11
#Proceso para Borrar los Datos.
def Borrar(self):
try:
reply = QMessageBox.question(self, "Mensaje", "Desea Borrar Registro", QMessageBox.Yes, QMessageBox.No)

if reply == QMessageBox.Yes:
datos = int(self.identifica.text())
sql = ("delete from usuarios where identificacion = %d" %datos)

#Se verifica si el proceso de borrado se ejecutó correctamente.


query = QSqlQuery(sql)
consulta = QSqlQuery()
consulta.prepare(sql)
consulta.bindValue(":ID ",id)
estado = consulta.exec_()

#Proceso que limpia el TableWidgets, luego lo vuelve a cargar y finalmente limpia los campos de la forma.
#Si el borrado fue incorrecto el estado es False, se muestra el mensaje que no se pudo borrar el registro.
#De lo contrario se muestra el mensaje que se borró el registro.
if estado == False:
QMessageBox.information(self,"Borrar.","No se Pudo Borrar Registro")
else:
QMessageBox.information(self,"Borrar Datos.","Datos Borrados")
#self.identifica.setFocus()
self.LimpiarTable()
self.Seleccionar()
self.limpiacampos()

except:
QMessageBox.information(self,"Error.","Error en el Proceso.")

app = QApplication(sys.argv)
#Crear un objeto de la clase
_ventana = Ventana()
#Mostra la ventana
_ventana.show()
#Ejecutar la aplicación
app.exec_()

4. Explicación de los elementos del código fuente.


Los import, son diferentes bibliotecas que se necesitan para llevar a cabo el proceso de
mantenimiento de la tabla usuarios.
import sys
import psycopg2 #archivo de conexcion a postgresql
from PyQt5.QtWidgets import QApplication,QMainWindow, QDialog, QMessageBox,
QTableWidget, QTableWidgetItem, QLineEdit,QPushButton, QWidget,QVBoxLayout
from PyQt5 import uic #Permite trabajar con la conexión a la forma.

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 12
from PyQt5.QtSql import QSqlDatabase, QSqlQuery #Permite conectarse a la base de datos.
from decimal import Decimal #Permite mostrar el redondeo de los decimales.

4.0. Activación de los Push Button.


Activa los botones de Insertar, Consultar, Modificar, Borrar y Salir, cuando se pulsa un
click sobre ellos.

self.cancelar.clicked.connect(self.Cancelar)
self.limpiar.clicked.connect(self.limpiacampos)
self.insertar.clicked.connect(self.InsertarDatos)
self.modificar.clicked.connect(self.Modificar)
self.borrar.clicked.connect(self.Borrar)

4.1. Activación de la Tecla RETURN.


De esta forma activamos la tecla RETURN, para navegar de campo en campo, dentro
de la forma.
#Activa el RETURN, para pasar de campo en campo.
self.identifica.returnPressed.connect(self.Consultar2)
self.nombre.returnPressed.connect(self.navegar2)
self.edad.returnPressed.connect(self.navegar3)
self.salario.returnPressed.connect(self.navegarsalario)
self.ciudad.returnPressed.connect(self.navegarciudad)

4.2. Establecer conexión a la base de datos Postgresql.


Primera forma de acceso a la Base de Datos.

self.db = QSqlDatabase.addDatabase('QPSQL') Driver para PostgreSQL.


self.db.setHostName('localhost') Nombre del servidor a conectar.
self.db.setDatabaseName('municipal') Nombre de la base de datos.
self.db.setUserName('postgres') Nombre de usuario para accesar la base de datos.
self.db.setPassword('Administra8080') Password del usurio para acceso a la base de
datos.

Segunda forma de acceso a la Base de Datos.

cadenaconexcion= "host='localhost' dbname='municipal' user='postgres'


password='Administra8080'"
obj = psycopg2.connect(cadenaconexcion)
objCursor = obj.cursor()
estado = self.db.open()

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 13
Si no se logra hacer la conexión a la base de datos, se emite un mensaje de error.
if estado == False:
QMessageBox.warning(self,"Error",self.db.lastError().text(), QMessageBox.Discard)

5. Cómo centrar la forma en la pantalla.


Para llevar a cabo este proceso, se aplica la siguiente instrucción.
self.setGeometry(450, 100, 500, 490)
self.show()

self.setGeometry(x1, y1, w1,z1)


X1 = Alinea a la derecha o izquierda la forma, dependiendo del valor que se ponga.
Y1 = Alinea arriba o hacia abajo.
W1 = Ancho de la forma.
Z1 = Largo de la forma.

6. Métodos para ir pasando de un campo a otro con ENTER.


def navegar(self):
self.nombre.setFocus()

def navegar2(self):
self.sbedad.setFocus()

def navegar3(self):
self.salario.setFocus()

def navegarsalario(self):
self.ciudad.setFocus()

def navegarciudad(self):
self.identifica.setFocus()

7. Método para limpiar los campos.


def limpiacampos(self):
self.identifica.setText(" ")
self.nombre.setText(" ")
self.edad.setText(" ")
self.nombreaux.setText(" ")
self.salario.setText(str(0))

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 14
self.ciudad.setText(" ")
self.identifica.setFocus()

8. Método para salir de la forma y uso el QMessagebox.


def closeEvent(self, event):
close = QMessageBox.question(self, "Salir", "Desea Salir de la Forma",
QMessageBox.Yes, QMessageBox.No)
If close == QMessageBox.Yes:
self.db.close()
event.accept()
else:
event.ignore()

Proceso que permite salir de la forma cuando se pulsa la letra X o el botón de cancelar.
También antes de salir se pregunta si se desea salir, mediante la instrucción del
QMessageBox, donde se muestra su utilización.

9. Proceso para cargar y limpiar el TableWidgets.


Proceso para rellenar el tableWidget
def Seleccionar(self):
#Forma para conectarse a la base de datos.
cadenaconexcion="host='localhost' dbname='municipal' user='postgres'
password='Administra8080'"
obj=psycopg2.connect(cadenaconexcion)
objCursor=obj.cursor()
self.LimpiarTable()

try:
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
else:
self.tableWidget.setColumnCount(4)
self.tableWidget.setHorizontalHeaderLabels(['Id', 'Nombre ', 'Edad', 'Salario'])
self.tableWidget.setColumnWidth(0,30) #Permite dar tamaño a las columnas.
self.tableWidget.setColumnWidth(1,200)
self.tableWidget.setColumnWidth(2,40)
row = 0
sql = "SELECT * FROM usuarios order by identificacion"
query = QSqlQuery(sql)

try:

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 15
#Proceso para cargar el TableWidgets
while query.next():
self.tableWidget.insertRow(row)
id = QTableWidgetItem(str(query.value(0)))
nombre = QTableWidgetItem(str(query.value(1)))
edad = QTableWidgetItem(str(query.value(2)))
salario = QTableWidgetItem(str(query.value(3)))

self.tableWidget.setItem(row,0,
QTableWidgetItem('{0:.0f}'.format(query.value(0))))
self.tableWidget.setItem(row, 1, QTableWidgetItem(str(query.value(1).upper())))
self.tableWidget.setItem(row, 2, QTableWidgetItem(str(query.value(2))))
self.tableWidget.setItem(row, 3,
QTableWidgetItem('{0:,.2f}'.format(query.value(3)))) Da format al salario.
row = row + 1
except:
QMessageBox.information(self, "Ciclo erroneo.","Ciclo no se pudo realizar..")
except:
QMessageBox.information(self, "Conexción Erronea.","No se pudo Conectar a la Base de
Datos el TableGidgets. Pulse Enter pra Continuar.")

Proceso para limpiar el TableWidgets


def LimpiarTable(self):
w=0
j=self.tableWidget.rowCount()
while w < j:
self.tableWidget.removeRow(self.tableWidget.rowCount()-1)
w=w+1

10. Proceso para Insertar los Datos.


Acá se describe la forma de como insertar los datos en la tabla usuarios. Es importante
manifestar que en Python, existen otras formas de hacer los insert. El que mejores
resultados dio, es el que se describe en el proceso de inserción.

def InsertarDatos(self):
cadenaconexcion= "host='localhost' dbname='municipal' user='postgres'
password='Administra8080'"
obj = psycopg2.connect(cadenaconexcion)
objCursor=obj.cursor()
estado = self.db.open()

if estado == False:

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 16
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
else:
try:
iden = self.identifica.text()
nombre = self.nombre.text()
eda = self.sbedad.text()
salario = self.salario.text()
salarios2 = self.salario.text().replace(",","") #Quita las comas de las unidades
salario = Decimal(salarios2)
ciudad = self.ciudad.text()

self.edad.setText(self.sbedad.text())
self.nombreaux.setText(self.nombre.text())

reply = QMessageBox.question(self, "Mensaje", "Desea Incluir Registro",


QMessageBox.Yes, QMessageBox.No)

if reply == QMessageBox.Yes:
#Ejecutar consulta de la BD
objCursor.execute("INSERT INTO USUARIOS(identificacion,nombre,
edad,salario,ciudad)
VALUES(%s,%s,%s,%s,%s)",(iden,nombre,eda,salario,ciudad))
obj.commit()

QMessageBox.information(self,"Correcto.","Datos Guardados.")
self.Seleccionar()
self.limpiacampos()
objCursor.close()
obj.close()
except:
QMessageBox.information(self,"Incorrecto.","Datos No Guardados.")

11. Proceso para Modificar los Datos.

def Modificar(self,idatos):

try:
cadenaconexcion = "host='localhost' dbname='municipal' user='postgres'
password='Administra8080'"
obj = psycopg2.connect(cadenaconexcion)

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 17
objCursor = obj.cursor()
estado = self.db.open()

if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(),
QMessageBox.Discard)

datos = int(self.identifica.text())
nombres = self.nombre.text()
edadnueva = self.edad.text()
edadnueva = self.sbedad.text()
salarios2 = self.salario.text().replace(",","")
salarios = Decimal(salarios2)
ciudadnueva = self.ciudad.text()

reply = QMessageBox.question(self, "Mensaje", "Desea Modificar Registro",


QMessageBox.Yes, QMessageBox.No)

if reply == QMessageBox.Yes:
objCursor.execute("UPDATE usuarios SET nombre = %s, edad = %s,salario =
%s, ciudad = %s WHERE identificacion = %s",
(nombres,edadnueva,salarios,ciudadnueva,datos))
obj.commit()

self.LimpiarTable() #Carga proceso para limpiar el tablewidgets.


self.Seleccionar() #Carga proceso para mostrar el tablewidgets con datos.
self.limpiacampos() #Limpia los campos de la forma.
QMessageBox.information(self,"Modificacion Datos.","Datos Modificados")

except:
QMessageBox.information(self,"Modificacion Datos.","Datos No Modificados")
obj.rollback()
objCursor.close()
obj.close()

12. Proceso para Consulta de Datos.


def Consultar2(self):
llave = str(self.identifica.text())
sql = ("SELECT * FROM usuarios where identificacion ="+self.identifica.text())

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 18
query = QSqlQuery(sql)
consulta = QSqlQuery()
consulta.prepare(sql)
consulta.bindValue(":ID ",id)
estado = consulta.exec_()

if estado == False:
QMessageBox.information(self,"Abrir Base de Datos.","Conexción Fallida")
#Verifica si se llevó a cabo la consulta, trayendo información.
if consulta.size() >0:
idatos = self.identifica.text()
nombre = self.nombre.text()
edad = self.edad.text()
self.nombreaux.setText(self.nombre.text())

#Ciclo para mostrar los datos en pantalla, si existiera más de una fila.
while query.next():
#Muestra los Datos en Pantalla.
self.identifica.setText(str('{0:.0f}'.format(query.value(0))))
self.nombre.setText(query.value(1).upper())
self.edad.setText(str(query.value(2)))
self.salario.setText(str('{:,f}'.format(query.value(3))))
self.ciudad.setText(query.value(4))
QMessageBox.information(self,"Consulta Datos Correcta.","Validacion Correcta")
else:
self.nombre.setFocus()

13. Proceso para Borrar Datos.


def Borrar(self):
try:
reply = QMessageBox.question(self, "Mensaje", "Desea Borrar Registro",
QMessageBox.Yes, QMessageBox.No)

if reply == QMessageBox.Yes:
datos = int(self.identifica.text())
sql = ("delete from usuarios where identificacion = %d" %datos)

#Se verifica si el proceso de borrado se ejecutó correctamente.


query = QSqlQuery(sql)
consulta = QSqlQuery()

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 19
consulta.prepare(sql)
consulta.bindValue(":ID ",id)
estado = consulta.exec_()

#Proceso que limpia el TableWidgets, luego lo vuelve a cargar y finalmente


limpia los campos de la forma.
#Si el borrado fue incorrecto el estado es False, se muestra el mensaje que no
se pudo borrar el registro.
#De lo contrario se muestra el mensaje que se borró el registro.
if estado == False:
QMessageBox.information(self,"Borrar.","No se Pudo Borrar Registro")
else:
QMessageBox.information(self,"Borrar Datos.","Datos Borrados")
self.LimpiarTable()
self.Seleccionar()
self.limpiacampos()
except:
QMessageBox.information(self,"Error.","Error en el Proceso.")
app = QApplication(sys.argv)
#Crear un objeto de la clase
_ventana = Ventana()
#Mostra la ventana
_ventana.show()
#Ejecutar la aplicación
app.exec_()

Roberto Matarrita. Costa Rica. rmatarria@gmail.com Tel. 506-


8862-5244 Skype robertomatarrita Página 20