Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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.
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.
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.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.
Mostrada la pantalla del diseñador, escogemos donde dice Main Windows, para que se
abra una nueva pantalla y realizar el siguiente diseño.
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.
class Ventana(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("mantenimientoconsulta3.ui",self)
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
self.close()
def cerrarbasedatos(self):
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()
try:
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
else:
self.tableWidget.setColumnCount(4)
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.")
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError().text(), QMessageBox.Discard)
else:
self.edad.setText(self.sbedad.text())
self.nombreaux.setText(self.nombre.text())
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:
except:
QMessageBox.information(self,"Modificacion Datos.","Datos No Modificados")
obj.rollback()
objCursor.close()
obj.close()
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():
if reply == QMessageBox.Yes:
datos = int(self.identifica.text())
sql = ("delete from usuarios where identificacion = %d" %datos)
#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_()
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)
def navegar2(self):
self.sbedad.setFocus()
def navegar3(self):
self.salario.setFocus()
def navegarsalario(self):
self.ciudad.setFocus()
def navegarciudad(self):
self.identifica.setFocus()
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.
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:
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.")
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:
self.edad.setText(self.sbedad.text())
self.nombreaux.setText(self.nombre.text())
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.")
def Modificar(self,idatos):
try:
cadenaconexcion = "host='localhost' dbname='municipal' user='postgres'
password='Administra8080'"
obj = psycopg2.connect(cadenaconexcion)
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()
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()
except:
QMessageBox.information(self,"Modificacion Datos.","Datos No Modificados")
obj.rollback()
objCursor.close()
obj.close()
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()
if reply == QMessageBox.Yes:
datos = int(self.identifica.text())
sql = ("delete from usuarios where identificacion = %d" %datos)