Nuestra primera aplicación en python y qt4 [4]. Añadir y borrar entradas.
Vale, ya sí que sí, ya tenemos una interfaz, y una base de datos a la que sabemos conectarnos. Hoy de una vez por todas vamos a poder rellenar esa base. Para ello, vamos a implementar dos funciones: IngresarOperacion() y BorrarOperacion(). Su nombre explica su función, pero voy a explicar un poco más detalladamente lo que hace cada una:
IngresarOperacion()
El esquema que va a utilizar esta función es muy sencillo:
Los datos ingresados los guardaremos en sus correspondientes variables (fecha,tipo…). La forma de hacerlo (o al menos una de ellas) es la siguiente:
self.tipo = str(self.ui.combo_Tipo.currentText()) self.lugar = str(self.ui.combo_Lugar.currentText()) self.fecha = self.ui.dateEdit.date() self.comentario = str(self.ui.text_Comentarios.toPlainText()) self.cantidad = self.ui.text_Cantidad.toPlainText() if self.cantidad == "" : self.cantidad = 0 #Si no hemos escrito cantidad, suponemos que vale 0 else : self.cantidad = float(self.cantidad) #Convertimos la cantidad en un valor float dia = self.fecha.day() mes = self.fecha.month() anno = self.fecha.year() self.fecha = str(dia) + '/' + str(mes) + '/' + str(anno) #Formato en el que guardaremos las fechas
Nota: En la caja de comentario, no se pueden escribir caracteres especiales (‘ñ’,’¡’,etc). Lo he intentado arreglar de varias maneras, pero no lo he logrado (aún).
Tras leer los datos, los guardamos en la base de datos. Para ello usaremos la función INSERT de SQLite:
self.datos=(self.tipo, self.lugar, self.comentario, self.fecha,self.cantidad) #Creamos lista con todos los datos que queremos enviar a la db self.cursor.execute('INSERT INTO Operaciones (Tipo,Lugar,Comentarios,Fecha,Cantidad) VALUES(?,?,?,?,?)',self.datos) self.conexion.commit() #Confirmamos los cambios
La función execute() puede parece un poco extraña, pero si se desmenuza por partes, la cosa queda más clara (haz click para verlo en mejor calidad):
La base de datos ya está actualizada, ahora lo que hay que hacer es llevar esos datos a nuestra tabla:
self.ActualizarBase()
BorrarOperacion()
La función que borra las entradas tiene cierto parecido a la anterior. Visto esquemáticamente:
Esto, en forma de código, se traduce a:
def BorrarOperacion(self): lineaSeleccionada=self.ui.tableWidget.currentRow() #Devuelve el índice de la línea seleccionada elementos=[] for i in range(5): #Por cada elemento de la fila... itemText = self.ui.tableWidget.item(lineaSeleccionada, i).text() elementos.append(str(itemText)) #Vamos añadiendo a la lista 'elementos' cada columna self.cursor.execute('DELETE FROM Operaciones WHERE Tipo=? AND Lugar=? AND Comentarios=? AND Fecha=? AND Cantidad=?',(elementos[0],elementos[1],elementos[2],elementos[3],elementos[4])) self.conexion.commit() self.ActualizarBase()
Al igual que antes, os dejo una explicación parte por parte de la función DELETE en sqlite (haz click para ver en mejor calidad):
Todo esto está muy bien pero si ejecutamos el programa según está, jamás se ejecutarían estas funciones. ¿Cómo lo solucionamos? Queremos que la función IngresarOperacion() se llame al pulsar boton_Ok y BorrarOperacion() al pulsar boton_Borrar. Es decir, queremos “conectar” la acción “pulsar boton X” con la acción “llamar a función Y”.
Eso es muy fácil de hacer con PyQt4. Solo hay que añadir un par de líneas a la función __init__ de nuestra clase MyForm (la clase de la ventana):
QtCore.QObject.connect(self.ui.boton_Ok,QtCore.SIGNAL("clicked()" ), self.IngresarOperacion) QtCore.QObject.connect(self.ui.boton_Borrar,QtCore.SIGNAL("clicked()" ), self.BorrarOperacion)
Juntando todo con lo que ya teníamos hecho, de momento el código va quedando así:
# -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui, Qt from hucha_ui import Ui_Hucha import sqlite3 class MyForm(QtGui.QMainWindow): def __init__(self, parent=None): locale=unicode(QtCore.QLocale.system().name()) QtGui.QWidget.__init__(self, parent) self.ui = Ui_Hucha() self.ui.setupUi(self) self.IniciarBase() self.ActualizarBase() QtCore.QObject.connect(self.ui.boton_Ok,QtCore.SIGNAL("clicked()" ), self.IngresarOperacion) QtCore.QObject.connect(self.ui.boton_Borrar,QtCore.SIGNAL("clicked()" ), self.BorrarOperacion) def IniciarBase(self): import os.path camino = os.path.abspath('basehucha_tutorial.db') print camino print os.path.isfile(camino) #Si la base de datos existe, la cargamos; si no, la creamos if not os.path.isfile(camino): self.conexion = sqlite3.connect('basehucha_tutorial.db') print 'Base creada' self.cursor = self.conexion.cursor() self.cursor.execute("CREATE TABLE Operaciones (Id INTEGER PRIMARY KEY, Tipo TEXT, Lugar TEXT, Comentarios TEXT, Fecha TEXT, Cantidad INT)") print 'Tabla creada' self.conexion.commit() else: self.conexion = sqlite3.connect('basehucha_tutorial.db') print 'Base conectada' self.cursor = self.conexion.cursor() def ActualizarBase(self): #Cargamos la base de datos y la colocamos en la tabla self.cursor.execute("SELECT * FROM Operaciones") filas = self.cursor.fetchall() self.numerodefilas=len(filas) self.ui.tableWidget.setRowCount(self.numerodefilas) #print filas[0] for j in range(self.numerodefilas): fila = filas[j] for i in range(1,len(fila)): elemento = fila[i] print 'elemento= '+ str(elemento) #print i elemento = str(elemento) if elemento == 'None' : elemento = ' ' item=None item = QtGui.QTableWidgetItem() item.setText(QtGui.QApplication.translate("Hucha", str(elemento), None, QtGui.QApplication.UnicodeUTF8)) self.ui.tableWidget.setItem(j,i-1,item) def BorrarOperacion(self): lineaSeleccionada=self.ui.tableWidget.currentRow() elementos=[] for i in range(5): itemText = self.ui.tableWidget.item(lineaSeleccionada, i).text() print 'itemText: ' + itemText elementos.append(str(itemText)) self.cursor.execute('DELETE FROM Operaciones WHERE Tipo=? AND Lugar=? AND Comentarios=? AND Fecha=? AND Cantidad=?',(elementos[0],elementos[1],elementos[2],elementos[3],elementos[4])) self.conexion.commit() self.ActualizarBase() def IngresarOperacion(self): #Asignamos cada valor que queremos ingresar a una variable self.tipo = str(self.ui.combo_Tipo.currentText()) self.lugar = str(self.ui.combo_Lugar.currentText()) self.fecha = self.ui.dateEdit.date() self.comentario = str(self.ui.text_Comentarios.toPlainText()) self.cantidad = self.ui.text_Cantidad.toPlainText() if self.cantidad == "": self.cantidad = 0 else: self.cantidad = float(self.cantidad) dia = self.fecha.day() mes = self.fecha.month() anno = self.fecha.year() self.fecha = str(dia) + '/' + str(mes) + '/' + str(anno) #Pasamos los nuevos datos a la base de datos self.datos=(self.tipo, self.lugar, self.comentario, self.fecha,self.cantidad) self.cursor.execute('INSERT INTO Operaciones (Tipo,Lugar,Comentarios,Fecha,Cantidad) VALUES(?,?,?,?,?)',self.datos) self.conexion.commit() self.ActualizarBase() if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = MyForm() myapp.show() sys.exit(app.exec_())
Espero que os funcione a todos como a mí, pero si algo falla, ¡sólo tenéis que preguntar!
El próximo día toca editar las entradas ya insertadas en nuestra base.
¡Saludos!