viernes, 3 de diciembre de 2010

Crear una [pequeña] aplicación completa usando wxPython (Parte 6)

.

Esta entrega no será para hacer modificaciones en nuestra aplicación, sino, tan solo para concentrar todo el código visto hasta ahora en un solo post, de manera que puedan ver mejor el contenido de cada archivo que compone nuestro proyecto.

controladorEditorDePelicula.py

from vistas.vistaEditorDePelicula import VistaEditorDePelicula
from wx.lib.pubsub import Publisher

import wx
from wx import xrc
import pelicula

class ControladorEditorDePelicula:
def __init__(self, app, parent, agregar=True):
self.app = app

self.vistaPrincipal = parent

self.vista = VistaEditorDePelicula(self.vistaPrincipal.frame, self.app, agregar)

Publisher.subscribe(self.onSeCambioItemSeleccionado, 'cambio_item_seleccionado')

btnAgregarPelicula = xrc.XRCCTRL(self.vista.Dialog, 'btnAceptar')

self.vista.Dialog.Bind(wx.EVT_CLOSE, self.onCerrarEditorDePelicula, self.vista.Dialog)

if(agregar):
self.vista.Dialog.Bind(wx.EVT_BUTTON, self.onAgregarPelicula, btnAgregarPelicula)
else:
self.vistaPrincipal.habilitarEdicion(False)

self.vista.Dialog.Bind(wx.EVT_BUTTON, self.onModificarPelicula, btnAgregarPelicula)

self.cargarPeliculaSeleccionadaEnVistaPrincipal()

btnPeliculaAnterior = xrc.XRCCTRL(self.vista.Dialog, 'm_bpButton2')
btnPeliculaSiguiente = xrc.XRCCTRL(self.vista.Dialog, 'm_bpButton3')
btnPrimeraPelicula = xrc.XRCCTRL(self.vista.Dialog, 'm_bpButton1')
btnUltimaPelicula = xrc.XRCCTRL(self.vista.Dialog, 'm_bpButton4')

self.vista.Dialog.Bind(wx.EVT_BUTTON, self.onCargarPeliculaAnterior, btnPeliculaAnterior)
self.vista.Dialog.Bind(wx.EVT_BUTTON, self.onCargarSiguientePelicula, btnPeliculaSiguiente)
self.vista.Dialog.Bind(wx.EVT_BUTTON, self.onCargarPrimeraPelicula, btnPrimeraPelicula)
self.vista.Dialog.Bind(wx.EVT_BUTTON, self.onCargarUltimaPelicula, btnUltimaPelicula)

self.vista.Mostrar(agregar)

def onAgregarPelicula(self, evt):
infoPelicula = self.vista.getInfoPelicula()
self.app.modelo.agregarPelicula(infoPelicula.getTitulo(), infoPelicula.getAnio())

self.vistaPrincipal.seleccionarPrimeraPelicula()

def onModificarPelicula(self, evt):
infoPelicula = self.vista.getInfoPelicula()
self.app.modelo.modificarPelicula(self.idPelicula, infoPelicula.getTitulo(), infoPelicula.getAnio())

def onCargarSiguientePelicula(self, evt):
self.vistaPrincipal.seleccionarSiguientePelicula()

def onCargarPeliculaAnterior(self, evt):
self.vistaPrincipal.seleccionarAnteriorPelicula()

def onCargarPrimeraPelicula(self, evt):
self.vistaPrincipal.seleccionarPrimeraPelicula()

def onCargarUltimaPelicula(self, evt):
self.vistaPrincipal.seleccionarUltimaPelicula()

def onSeCambioItemSeleccionado(self, evt):
self.cargarPeliculaSeleccionadaEnVistaPrincipal()

def cargarPeliculaSeleccionadaEnVistaPrincipal(self):
self.idPelicula = self.app.controladorVistaPrincipal.vista.getIDItemSeleccionado()

self.vista.cargarPelicula(self.idPelicula)

def onCerrarEditorDePelicula(self, evt):
self.vistaPrincipal.habilitarEdicion(True)

Publisher.unsubscribe(self.onSeCambioItemSeleccionado, 'cambio_item_seleccionado')
self.vista.Dialog.Destroy()

controladorVistaPrincipal.py

import wx

from wx import xrc
from wx.lib.pubsub import Publisher

from vistas.vistaPrincipal import VistaPrincipal
from controladores.controladorEditorDePelicula import ControladorEditorDePelicula

class ControladorVistaPrincipal:
def __init__(self, app):
self.app = app

self.vista = VistaPrincipal(app)

self.vista.frame.Bind(wx.EVT_MENU, self.onMostrarAgregarPelicula, id=xrc.XRCID('itemAgregarPelicula'))
self.vista.frame.Bind(wx.EVT_MENU, self.onMostrarEditorDePelicula, id=xrc.XRCID('itemEditarPelicula'))
self.vista.frame.Bind(wx.EVT_MENU, self.onEliminarPelicula, id=xrc.XRCID('itemEliminarPelicula'))
self.vista.frame.Bind(wx.EVT_MENU, self.onSalir, id=xrc.XRCID('itemSalir'))

self.vista.frame.Bind(wx.EVT_TOOL, self.onMostrarAgregarPelicula, id=xrc.XRCID('toolAgregarPelicula'))
self.vista.frame.Bind(wx.EVT_TOOL, self.onMostrarEditorDePelicula, id=xrc.XRCID('toolEditarPelicula'))
self.vista.frame.Bind(wx.EVT_TOOL, self.onEliminarPelicula, id=xrc.XRCID('toolEliminarPelicula'))
self.vista.frame.Bind(wx.EVT_TOOL, self.onBuscarPelicula, id=xrc.XRCID('toolBuscarPelicula'))

Publisher.subscribe(self.seModificoElModelo, 'pelicula_agregada')
Publisher.subscribe(self.seModificoElModelo, 'pelicula_modificada')
Publisher.subscribe(self.seModificoElModelo, 'pelicula_eliminada')

listadoPeliculas = xrc.XRCCTRL(self.vista.frame, 'listPeliculas')
self.vista.frame.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onSeCambioItemSeleccionado, listadoPeliculas)

self.vista.cargarListaoDePeliculas()
self.vista.seleccionarPrimeraPelicula()

self.vista.Mostrar()

def onMostrarAgregarPelicula(self, evt):
self.editorDePeliculas = ControladorEditorDePelicula(self.app, self.vista, True)

def onMostrarEditorDePelicula(self, evt):
self.editorDePeliculas = ControladorEditorDePelicula(self.app, self.vista, False)

def onEliminarPelicula(self, evt):
id_pelicula = self.vista.getIDItemSeleccionado()

self.app.modelo.eliminarPelicula(id_pelicula)
wx.MessageBox("La pelicula se ha eliminado")

def onBuscarPelicula(self, evt):
wx.MessageBox("Buscar una pelicula")

def seModificoElModelo(self, mensaje):
self.vista.cargarListaoDePeliculas()

def onSalir(self, evt):
self.app.Exit()

def onSeCambioItemSeleccionado(self, evt):
Publisher.sendMessage("cambio_item_seleccionado", None)

vistaEditorDePelicula.py

import wx
from wx import xrc
import pelicula

class VistaEditorDePelicula:
def __init__(self, parent, app, agregar=True):
self.modelo = app.modelo
self.app = app

self.Dialog = self.app.res.LoadDialog(parent, 'DlgEditorPelicula')

btnAgregarPelicula = xrc.XRCCTRL(self.Dialog, 'btnAceptar')

if(agregar):
titulo_pelicula = xrc.XRCCTRL(self.Dialog, 'txtTitulo')
titulo_pelicula.SetFocus()

barraNavegacion = xrc.XRCCTRL(self.Dialog, 'm_panel2')
barraNavegacion.Show(False)

self.Dialog.Fit()

btnAgregarPelicula.SetLabel('Agregar')
else:
btnAgregarPelicula.SetLabel('Guardar')

def Mostrar(self, modal=True):
if modal:
self.Dialog.ShowModal()
else:
self.Dialog.Show()

def getInfoPelicula(self):
infoPelicula = pelicula.Pelicula()

titulo_pelicula = xrc.XRCCTRL(self.Dialog, 'txtTitulo')
anio_pelicula = xrc.XRCCTRL(self.Dialog, 'txtAnio')

infoPelicula.setTitulo(titulo_pelicula.GetValue())
infoPelicula.setAnio(anio_pelicula.GetValue())

return infoPelicula

def cargarPelicula(self, idPelicula):
infoPelicula = pelicula.Pelicula()

infoPelicula = self.modelo.obtenerInformacionDePelicula(idPelicula)

titulo_pelicula = xrc.XRCCTRL(self.Dialog, 'txtTitulo')
anio_pelicula = xrc.XRCCTRL(self.Dialog, 'txtAnio')

titulo_pelicula.SetValue(infoPelicula.getTitulo())
anio_pelicula.SetValue(infoPelicula.getAnio())

titulo_pelicula = xrc.XRCCTRL(self.Dialog, 'txtTitulo')
titulo_pelicula.SetFocus()

vistaPrincipal.py

import wx
from wx import xrc

class VistaPrincipal:
def __init__(self, app):
self.app = app

self.res = self.app.res
self.frame = self.res.LoadFrame(None, 'FramePrincipal')

def Mostrar(self):
self.frame.Show()

def cargarListaoDePeliculas(self):
self.listaDePeliculas = xrc.XRCCTRL(self.frame, 'listPeliculas')

self.listaDePeliculas.SetSingleStyle(wx.LC_REPORT, True)

self.listaDePeliculas.InsertColumn(0, 'Titulo', format=wx.LIST_FORMAT_LEFT, width=-1)
self.listaDePeliculas.InsertColumn(1, 'Anio', format=wx.LIST_FORMAT_LEFT, width=-1)

peliculas = self.app.modelo.ObtenerListadoDePeliculas()

index = 0
for pelicula in peliculas:
item = self.listaDePeliculas.InsertStringItem (index, str(pelicula[1]))
self.listaDePeliculas.SetItemData(item, pelicula[0])

self.listaDePeliculas.SetStringItem(index, 1, str(pelicula[2]))

index+=1

self.listaDePeliculas.SetColumnWidth(0, wx.LIST_AUTOSIZE)
self.listaDePeliculas.SetColumnWidth(1, wx.LIST_AUTOSIZE)

def getIDItemSeleccionado(self):
itemIndex = self.listaDePeliculas.GetFirstSelected()

return self.listaDePeliculas.GetItemData(itemIndex)

def seleccionarItem(self, indiceItem):
self.listaDePeliculas = xrc.XRCCTRL(self.frame, 'listPeliculas')

itemActual = self.listaDePeliculas.GetFirstSelected()

self.listaDePeliculas.Select(itemActual, False)
self.listaDePeliculas.Select(indiceItem, True)
self.listaDePeliculas.Focus(indiceItem)

def seleccionarPrimeraPelicula(self):
self.seleccionarItem(0)

def seleccionarUltimaPelicula(self):
self.listaDePeliculas = xrc.XRCCTRL(self.frame, 'listPeliculas')

indiceUltimoItem = self.listaDePeliculas.GetItemCount() - 1

self.seleccionarItem(indiceUltimoItem)

def seleccionarSiguientePelicula(self):
self.listaDePeliculas = xrc.XRCCTRL(self.frame, 'listPeliculas')

itemActual = self.listaDePeliculas.GetFirstSelected()
indiceUltimoItem = self.listaDePeliculas.GetItemCount() - 1

if(itemActual < indiceUltimoItem ):
self.seleccionarItem(itemActual + 1)

def habilitarEdicion(self, habilitado=True):
barra_de_herramientas = self.frame.GetToolBar()
barra_de_herramientas.Enable(habilitado)

menu_catalogo = self.frame.GetMenuBar()
menu_catalogo.EnableTop(0, habilitado)

modelo.py

from wx.lib.pubsub import Publisher
import MySQLdb
import pelicula

class Model:

def conectar(self):
self.cnn = MySQLdb.connect(host='localhost', user='user', passwd='password', db='catalogo_peliculas_db')
self.cursor = self.cnn.cursor()

def desconectar(self):
self.cnn.close()
self.cursor.close()

def agregarPelicula(self, titulo_pelicula, anio):
self.conectar()
self.cursor.execute("INSERT INTO tblPeliculas(TituloPelicula, Anio) VALUES('" + titulo_pelicula + "'," + anio + ")")

self.desconectar()

Publisher.sendMessage("pelicula_agregada", None)

def modificarPelicula(self, id_pelicula, titulo_pelicula, anio):
self.conectar()
self.cursor.execute("UPDATE tblPeliculas SET TituloPelicula='" + titulo_pelicula + "', Anio=" + str(anio) + " WHERE IDPelicula=" + str(id_pelicula))

self.desconectar()

Publisher.sendMessage("pelicula_modificada", None)

def eliminarPelicula(self, id_pelicula):
self.conectar()
self.cursor.execute("DELETE FROM tblPeliculas WHERE IDPelicula=" + str(id_pelicula))

self.desconectar()

Publisher.sendMessage("pelicula_eliminada", None)

def ObtenerListadoDePeliculas(self):
self.conectar()

self.cursor.execute("SELECT * FROM tblPeliculas ORDER BY TituloPelicula")

listado = self.cursor.fetchall()

self.desconectar()

return listado

def obtenerInformacionDePelicula(self, idPelicula):
self.conectar()

self.cursor.execute("SELECT * FROM tblPeliculas WHERE IDPelicula = " + str(idPelicula))

resultado = self.cursor.fetchone()

infoPelicula = pelicula.Pelicula()

infoPelicula.setTitulo(str(resultado[1]))
infoPelicula.setAnio(str(resultado[2]))

self.desconectar()

return infoPelicula

catalogo.py

import wx
from wx import xrc
from controladores.controladorVistaPrincipal import ControladorVistaPrincipal
from modelo import Model

class CatalogoDePeliculas(wx.App):
def OnInit(self):
self.modelo = Model()
self.res = xrc.XmlResource('gui2.xrc')

self.controladorVistaPrincipal = ControladorVistaPrincipal(self)

return True

app = CatalogoDePeliculas()
app.MainLoop()

pelicula.py

class Pelicula:
def __init__(self):
self.titulo = ""
self.anio = ""

def setTitulo(self, titulo):
self.titulo = titulo

def getTitulo(self):
return self.titulo

def setAnio(self, anio):
self.anio = anio

def getAnio(self):
return self.anio
Este es todo el código de nuestro Catalogo hasta aquí. En la próxima parte, trabajaremos en la implementación de la búsqueda de películas.

Saludos!

0 comments

Publicar un comentario