Skip to content

Nuestra primera aplicación en python y qt4 [4]. Añadir y borrar entradas.

noviembre 28, 2011

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!

Anuncios
Dejar un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: