Está en la página 1de 4

23 - Python PyQt (Interfaz gráfica) - QtSql MySQL

y QTableWidget (Eliminar registros)


En este capítulo del tutorial de Python 3 más PyQt5 seguimos con la continuación
de la aplicación que estamos desarrollando desde los dos capítulos anteriores:

Seleccionar registros: http://jquery-manual.blogspot.com/2015/07/21-python-pyqt-


interfaz-grafica-qtsql.html
Actualizar registros: http://jquery-manual.blogspot.com/2015/07/22-python-pyqt-
interfaz-grafica-qtsql.html

En esta ocasión veremos como eliminar fila/s, para esta tarea incluiremos un botón al
cuadro de diálogo que al hacer click sobre él, entrará en acción un método
llamado Eliminar el cual contendrá el proceso de búsqueda del index de la/s fila/s
seleccionada/s por el usuario y su posterior eliminación tanto del objeto table como de
la tabla usuarios.

administrar.pyw

import sys
from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout, QMessageBox,
QTableWidget, QTableWidgetItem, QPushButton
from PyQt5 import uic
from PyQt5.QtSql import QSqlDatabase, QSqlQuery

class Dialogo(QDialog):
def __init__(self):
QDialog.__init__(self)
self.setWindowTitle("Administrar usuarios") #Título
self.resize(800, 600) #Tamaño inicial
self.layout = QGridLayout() #Crear un layout grid
self.setLayout(self.layout) #Agregar el layout al cuadro de
diálogo
self.table = QTableWidget() #Crear la tabla
self.btn_eliminar = QPushButton("Eliminar fila/s")
self.layout.addWidget(self.btn_eliminar)
self.layout.addWidget(self.table) #Agregar la tabla al layou
t
#Establecer conexión a la base de datos MySql
self.db = QSqlDatabase.addDatabase('QMYSQL')
self.db.setHostName("localhost")
self.db.setDatabaseName("usuarios")
self.db.setUserName("root")
self.db.setPassword("password")
self.Seleccionar()
self.table.itemChanged.connect(self.Actualizar)
self.btn_eliminar.clicked.connect(self.Eliminar)

def Seleccionar(self):
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError
().text(), QMessageBox.Discard)
else:
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['id', 'nombre'
, 'edad'])
row = 0
sql = "SELECT * FROM usuarios"
query = QSqlQuery(sql)
while query.next():
self.table.insertRow(row)
id = QTableWidgetItem(str(query.value(0)))
nombre = QTableWidgetItem(str(query.value(1)
))
edad = QTableWidgetItem(str(query.value(2)))
self.table.setItem(row, 0, id)
self.table.setItem(row, 1, nombre)
self.table.setItem(row, 2, edad)
row = row + 1
self.db.close()

def Actualizar(self):
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError
().text(), QMessageBox.Discard)
else:
column = self.table.currentColumn()
row = self.table.currentRow()
id = self.table.item(row, 0).text()
value = self.table.currentItem().text()
columns = ['id', 'nombre', 'edad']
query = QSqlQuery()
sql = "UPDATE usuarios SET " + columns[column] + "="
+ ":value WHERE id=:id"
query.prepare(sql)
query.bindValue(":id", id)
query.bindValue(":value", value)
estado = query.exec_()
if estado == False:
QMessageBox.warning(self, "Error", self.db.l
astError().text(), QMessageBox.Discard)
self.db.close()

def Eliminar(self):
estado = self.db.open()
if estado == False:
QMessageBox.warning(self, "Error", self.db.lastError
().text(), QMessageBox.Discard)
else:
rows = self.table.selectionModel().selectedRows()
index = []
for i in rows:
index.append(i.row())
index.sort(reverse=True)
for i in index:
id = self.table.item(i, 0).text()
self.table.removeRow(i)
sql = "DELETE FROM usuarios WHERE id=:id"
query = QSqlQuery()
query.prepare(sql)
query.bindValue(":id", id)
estado = query.exec_()
if estado == False:
QMessageBox.warning(self, "Error", s
elf.db.lastError().text(), QMessageBox.Discard)
self.db.close()

app = QApplication(sys.argv)
dialogo = Dialogo()
dialogo.show()
app.exec_()