Skip to content

Nuestra primera aplicación en python y qt4 [5]. Editar las operaciones.

diciembre 4, 2011

Nuestro programa ya empieza a ser usable. Ya podemos añadir y borrar movimentos, pero si nos equivocamos en alguno, tenemos que borrarlo y volver a escribirlo, algo bastante poco práctico. Por ello vamos a crear una nueva función: EditarOperacion(). Aquí se ve lo que hace (esquemáticamente):

Como podemos ver, esta función, de por sí, no “edita” nada. Simplemente entra en un “modo edición” y copia los valores de nuestra operación a las cajas de texto, combobox, etc.
¿Qué es el modo edición? Supongo que hay más maneras de llevar a cabo esta función, pero esta es la que suelo usar. Creamos una variable que pertenezca a toda la clase (self.editando) cuyo valor determine cómo actúa la función de ingresar operación. Así, si la variable es cierta (valor “True” de una variable booleana), al ingresar una operación, en vez de crear una nueva fila se sustituirán los datos que tenemos en nuestra fila por los que hayamos añadido. Si su valor es “False”, la función IngresarOperacion() actuará como de costumbre. Además habilitaremos un botón (boton_Cancelar) que nos permita salir en cualquier momento del modo edición, y deshabilitaremos otro (boton_Borrar), para no crear conflictos.
Primero pongo el código de la función EditarOperacion():


def EditarOperacion(self):
 self.editando=True
 self.ui.boton_Cancelar.setEnabled(True)
 self.ui.boton_Borrar.setEnabled(False)
 self.filaeditada=self.ui.tableWidget.currentRow()
 self.elementoseditados=[]
 for i in range(5):
itemText = self.ui.tableWidget.item(self.ui.tableWidget.currentRow(), i).text()
  self.elementoseditados.append(str(itemText))
 #insertamos los datos de la tabla en sus lugares correspondientes
 if self.elementoseditados[0]=='Ingreso': self.ui.combo_Tipo.setCurrentIndex(0)
 elif self.elementoseditados[0]=='Gasto': self.ui.combo_Tipo.setCurrentIndex(1)
 if self.elementoseditados[1]=='Banco': self.ui.combo_Lugar.setCurrentIndex(0)
 elif self.elementoseditados[1]=='Hucha': self.ui.combo_Lugar.setCurrentIndex(1)
 self.ui.text_Comentarios.setText(self.elementoseditados[2])
 self.ui.text_Cantidad.setText(self.elementoseditados[4])
 self.ui.dateEdit.setDate(QtCore.QDate.fromString(self.elementoseditados[3],"dd/MM/yyyy"))

Ahora veamos esquemáticamente cómo quedaría la “nueva” función IngresarOperacion():

Ahora, veamos el código de la nueva función IngresarOperacion():

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)
 if self.editando == False:
 #Pasamos los nuevos datos a la base de datos
 self.datos=(self.tipo, self.lugar, self.comentario, self.fecha,self.cantidad)
 print self.fecha
 self.cursor.execute('INSERT INTO Operaciones (Tipo,Lugar,Comentarios,Fecha,Cantidad) VALUES(?,?,?,?,?)',self.datos)
 self.conexion.commit()
 self.actualizarBase()
 elif self.editando == True:
 #Actualizamos la base de datos
 self.datoseditados=(self.tipo, self.lugar, self.comentario, self.fecha,self.cantidad,\
 self.elementoseditados[0],self.elementoseditados[1],self.elementoseditados[2],\
 self.elementoseditados[3],self.elementoseditados[4])
 self.cursor.execute('UPDATE Operaciones SET Tipo=?,Lugar=?,Comentarios=?,Fecha=?,Cantidad=? WHERE Tipo=? AND Lugar=? AND Comentarios=? AND Fecha=? AND Cantidad=?',self.datoseditados)
 self.conexion.commit()
 self.editando=0
 self.ui.boton_Cancelar.setEnabled(False)
 self.ui.boton_Borrar.setEnabled(True)
 self.actualizarBase( )

La forma en que hemos usado la función UPDATE de sqlite es idéntica a que usamos en la parte anterior del tutorial con la función DELETE, por lo que no necesita mayor explicación.

Así queda hasta ahora nuestro programa completo:

# -*- 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()
 self.editando=False
 QtCore.QObject.connect(self.ui.boton_Ok,QtCore.SIGNAL("clicked()"
 ), self.IngresarOperacion)
 QtCore.QObject.connect(self.ui.boton_Borrar,QtCore.SIGNAL("clicked()"
 ), self.BorrarOperacion)
 QtCore.QObject.connect(self.ui.boton_Editar,QtCore.SIGNAL("clicked()"
 ), self.EditarOperacion)
 QtCore.QObject.connect(self.ui.boton_Cancelar,QtCore.SIGNAL("clicked()"
 ), self.CancelarEdicion)

 def EditarOperacion(self):
 self.editando=True
 self.ui.boton_Cancelar.setEnabled(True)
 self.ui.boton_Borrar.setEnabled(False)
 self.filaeditada=self.ui.tableWidget.currentRow()
 self.elementoseditados=[]
 for i in range(5):
 itemText = self.ui.tableWidget.item(self.ui.tableWidget.currentRow(), i).text()
 print 'itemText: ' + itemText
 self.elementoseditados.append(str(itemText))
 #insertamos los datos de la tabla en sus lugares correspondientes
 if self.elementoseditados[0]=='Ingreso': self.ui.combo_Tipo.setCurrentIndex(0)
 elif self.elementoseditados[0]=='Gasto': self.ui.combo_Tipo.setCurrentIndex(1)
 if self.elementoseditados[1]=='Banco': self.ui.combo_Lugar.setCurrentIndex(0)
 elif self.elementoseditados[1]=='Hucha': self.ui.combo_Lugar.setCurrentIndex(1)
 self.ui.text_Comentarios.setText(self.elementoseditados[2])
 self.ui.text_Cantidad.setText(self.elementoseditados[4])
 self.ui.dateEdit.setDate(QtCore.QDate.fromString(self.elementoseditados[3],"dd/MM/yyyy"))

def CancelarEdicion(self):
 self.editando=0
 self.ui.boton_Cancelar.setEnabled(False)
 self.ui.boton_Borrar.setEnabled(True)

 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)
 print self.editando
 #self.fecha=str(anno) +'-'+str(mes)+'-'+str(dia)
 if self.editando == False:
 #Pasamos los nuevos datos a la base de datos
 self.datos=(self.tipo, self.lugar, self.comentario, self.fecha,self.cantidad)
 print self.fecha
 self.cursor.execute('INSERT INTO Operaciones (Tipo,Lugar,Comentarios,Fecha,Cantidad) VALUES(?,?,?,?,?)',self.datos)
 self.conexion.commit()
 self.ActualizarBase()
 elif self.editando == True:
 #Actualizamos la base de datos
 self.datoseditados=(self.tipo, self.lugar, self.comentario, self.fecha,self.cantidad,\
 self.elementoseditados[0],self.elementoseditados[1],self.elementoseditados[2],\
 self.elementoseditados[3],self.elementoseditados[4])
 print self.fecha
 self.cursor.execute('UPDATE Operaciones SET Tipo=?,Lugar=?,Comentarios=?,Fecha=?,Cantidad=? WHERE Tipo=? AND Lugar=? AND Comentarios=? AND Fecha=? AND Cantidad=?',self.datoseditados)
 self.conexion.commit()
 self.editando=0
 self.ui.boton_Cancelar.setEnabled(False)
 self.ui.boton_Borrar.setEnabled(True)
 self.ActualizarBase( )
if __name__ == "__main__":
 app = QtGui.QApplication(sys.argv)
 myapp = MyForm()
 myapp.show()
 sys.exit(app.exec_())

Ante cualquier problema, simplemente comentad e intentaré solucionarlo.
¡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: