viernes, 24 de julio de 2015

22 - Python PyQt (Interfaz gráfica) - QtSql MySQL y QTableWidget (Actualizar registros)




En este capítulo del tutorial de Python 3 más PyQt5 continuamos realizando consultas a bases de datos MySQL, basándonos en la aplicación del capítulo anterior: http://jquery-manual.blogspot.com.es/2015/07/21-python-pyqt-interfaz-grafica-qtsql.html donde pudimos ver como seleccionar los registros de la tabla usuarios para incluirlos en un objeto de la clase QTableWidget, este objeto es de gran utilidad para mantener un enlace directo con la base de datos, ya que permite la edición de campos (items). El objetivo es actualizar un determinado campo cada vez que el usuario ha realizado una modificación en el mismo, y para ello haremos uso del evento itemChanged de la clase QTableWidget.



administrar.pyw


import sys
from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout, QMessageBox, QTableWidget, QTableWidgetItem
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.layout.addWidget(self.table) #Agregar la tabla al layout
  #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)
  
 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.lastError().text(), QMessageBox.Discard)
  self.db.close()
     
app = QApplication(sys.argv)
dialogo = Dialogo()
dialogo.show()
app.exec_()