Example #1
0
    def initUI(self):
        self.padre.title("PREPROCESAMIENTO")
        #Frames ---------------------------------------------------------
        frmGRAL   = ttk.Frame(self.padre)
        frmEstado = ttk.Frame(frmGRAL)
        frmPARAM  = ttk.Labelframe(frmGRAL,   text = "PARAMETROS")
        frmRUTAS  = ttk.Labelframe(frmEstado, text = "LISTA DE RUTAS")
        frmCLASES = ttk.Labelframe(frmEstado, text = "LISTA DE CLASES")
        frmFILTROS = ttk.Labelframe(frmPARAM, text = "FILTROS")
        frmESCCOL = ttk.Labelframe(frmPARAM,  text = "ESCALA y MODO DE COLOR")
        frmDEST =   ttk.Labelframe(frmPARAM,  text = "DESTINO")
        frmW = ttk.Frame(frmESCCOL)
        frmH = ttk.Frame(frmESCCOL)

        frmDR = ttk.Frame(frmDEST)
        frmDCSV = ttk.Frame(frmDEST)
        
        
        # BUTTONS -------------------------------------------------------     
        button_opt = {'fill': Tkconstants.BOTH, 'padx': 5, 'pady': 5,'side':tk.TOP}  
        ttk.Button(frmPARAM,  text='Agregar Nuevo Directorio de Clases', command=self.agregarDirectorioClase).pack(**button_opt)
        ttk.Button(frmPARAM,  text='Agregar Nuevo Archivo de Clases', command=self.agregarArchivoClase).pack(**button_opt)
        ttk.Button(frmEstado, text='INICIAR PROCESAMIENTO',command=self.RUN_PROCESO).pack(**button_opt)
        ttk.Button(frmDR, text='Ruta...',command=self.vistaDirectorioDest).pack(side=RIGHT,fill=BOTH)

     
        
        frmGRAL.pack  (fill = tk.BOTH, side = tk.TOP, expand= tk.TRUE)
        frmEstado.pack(fill = tk.BOTH, side = tk.RIGHT, expand = tk.TRUE, padx = 5)
        frmPARAM.pack (fill = tk.BOTH, side = tk.LEFT, expand = tk.TRUE, padx = 5)
        frmRUTAS.pack (fill = tk.BOTH, side = tk.TOP, expand = tk.TRUE, padx = 5)
        frmCLASES.pack(fill = tk.BOTH, side = tk.BOTTOM, expand= tk.TRUE,padx = 5)
        frmFILTROS.pack(fill = tk.BOTH, side = tk.BOTTOM, expand= tk.TRUE,padx = 5)
        frmESCCOL.pack(fill  = tk.BOTH, side = tk.BOTTOM, expand= tk.TRUE,padx = 5,pady = 10)
        frmW.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        frmH.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        frmDEST.pack(fill = tk.X, side=tk.TOP, expand=tk.TRUE,padx=5)
        frmDR.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        frmDCSV.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        
        
        scrollbarx,scrollbary = self.getScrollBars(frmRUTAS) 
        self.listaRutasGUI    = tk.Listbox(frmRUTAS,yscrollcommand=scrollbary.set,xscrollcommand=scrollbarx.set)
        self.confScrollbars(scrollbarx, scrollbary,0)
        self.packScrollBars(scrollbarx,scrollbary)
        self.listaRutasGUI.pack(side=LEFT, fill=BOTH, expand=1)
        
        scrollbarxC,scrollbaryC = self.getScrollBars(frmCLASES) 
        self.listaClasesGUI    = tk.Listbox(frmCLASES,yscrollcommand=scrollbaryC.set,xscrollcommand=scrollbarxC.set)
        self.confScrollbars(scrollbarxC, scrollbaryC,1)
        self.packScrollBars(scrollbarxC,scrollbaryC)
        self.listaClasesGUI.pack(side=LEFT, fill=BOTH, expand=1)
        
        self.listaFiltrosGUI = tk.Listbox(frmFILTROS,selectmode=EXTENDED,exportselection=0,yscrollcommand=scrollbaryC.set,xscrollcommand=scrollbarxC.set)
        self.listaFiltrosGUI.pack(side=LEFT, fill=BOTH, expand=1)
        self.llenarListaFiltros(self.listaFiltrosGUI)
        
        Label(frmW, text="Ancho(W):").pack(side=LEFT)    
        Label(frmH, text="Alto (H):    ").pack(side=LEFT)
        
        self.strW = StringVar()
        self.strH = StringVar()
        self.entryW = tk.Entry(frmW,textvariable=self.strW, justify=tk.CENTER).pack(side=LEFT)
        self.entryH = tk.Entry(frmH,textvariable=self.strH, justify=tk.CENTER).pack(side=LEFT)
        
        Label(frmESCCOL, text="Modo de Color: ").pack(side=LEFT)
        self.boxVal = StringVar()
        listaValores = ['1','L','P','RGB']
        self.boxMColor = ttk.Combobox(frmESCCOL, textvariable=self.boxVal, values = listaValores, state="readonly").pack(side=LEFT)
        

        Label(frmDR,text="Nombre de Nuevo Directorio").pack(side=LEFT)

        self.strDirDest = StringVar()
        self.entryNDir  = tk.Entry(frmDR,textvariable=self.strDirDest,width=50 ).pack(side=LEFT)
        Label(frmDCSV,text="Nombre Archivo de etiquetas").pack(side=LEFT)
        self.strCSV = StringVar()
        self.entryNCSV  = tk.Entry(frmDCSV,textvariable=self.strCSV,width=60).pack(side=LEFT, fill=BOTH)
        
        self.frmVentanaGuaDirImgs  = VistaGuardarDirectorioImgs(self)
Example #2
0
 def initUI(self):
     '''
     Crea y empaqueta todos low widgets de la ventana
     '''
     self.padre.title("Adquicicion de imagenes")
     #*****************************************************************************************
     frmHeader = ttk.Frame(self.padre, relief = tk.RAISED)
     mbMenu=  ttk.Menubutton(frmHeader, text="Archivo")
     mbMenu.menu = tk.Menu(mbMenu)
     mbMenu["menu"] = mbMenu.menu
     mbMenu.menu.add_command(label = "Generar Archivo De Direcciones", command = self.abrirGenerarArchivoDeDirecciones)
     mbMenu.menu.add_command(label = "Generar Directorio de Imagenes", command = self.abrirVistaGuardarDirectorioImgs)
     mbMenu.pack(side = tk.LEFT)
     frmHeader.pack(side = tk.TOP, fill = tk.X, expand = tk.TRUE)
     #*****************************************************************************************
     
     #*****************************************************************************************
     frmNorte = ttk.Frame(self.padre)
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     frmNorteOeste  = ttk.Frame(frmNorte)        
     
     lblLogo = ttk.Label(frmNorteOeste, background = "green", text="Logo")
     lblLogo.pack(fill = tk.BOTH)
     
     frmNorteOeste.grid(column = 0, row = 0)
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     frmNorteEste = ttk.Frame(frmNorte)
      
     btnAgregarImg = ttk.Button(frmNorteEste, 
                                text="Agregar Imagen", 
                                width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                                command = self.abrirVistaMenuAgrImgs)
     btnAgregarImg.grid(column = 1, row = 0, pady = 5)
     btnCrearClase = ttk.Button(frmNorteEste, 
                                text="Nueva Clase", 
                                width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                                command = self.abrirVistaCrearClase)
     btnCrearClase.grid(column = 1, row = 1, pady = 5)
     
     frmNorteEste.grid(column = 1, row = 0)
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     frmNorte.grid_columnconfigure(0,weight = 1)
     frmNorte.grid_columnconfigure(1,weight = 1)
     
     frmNorte.pack(fill = tk.X, side=tk.TOP)
     #*****************************************************************************************       
     
     ttk.Separator(self.padre, orient = tk.HORIZONTAL).pack()
     
     #*****************************************************************************************
     frmCenter = ttk.Frame(self.padre)
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
     frmCenterOeste = ttk.Labelframe(frmCenter, text = "Acciones sobre la tabla")
     
     ttk.Label(frmCenterOeste, text = "Cambia de clase: ").pack(fill = tk.Y, anchor = tk.NW)         
     self.selectedClase = StringVar()
     self.selectedClase.set(Accion.nomClaseDefault)
     self.cmbClases = ttk.Combobox(frmCenterOeste, 
                                   textvariable=self.selectedClase, 
                                   state = 'readonly')
     self.cmbClases['values'] = Accion.dicClases.keys()
      
     self.cmbClases.pack(fill = tk.Y, pady = 5)
     self.cmbClases.bind("<<ComboboxSelected>>", self.cambiarClase)
      
     ttk.Button(frmCenterOeste, 
                text = "Mover Todo", 
                width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                command = self.abrirVistaMoverImgs).pack(fill = tk.Y, pady = 5)
     
     ttk.Button(frmCenterOeste, 
                text = "Eliminar Todo", 
                width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                command = self.eliminarImagenes).pack(fill = tk.Y, pady = 5)
     
     ttk.Separator(frmCenterOeste, orient = tk.HORIZONTAL).pack(fill = tk.Y, expand = tk.TRUE)
     
     ttk.Button(frmCenterOeste, 
                text = "Deshacer ultima Accion", 
                width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                command = self.deshacerAccion).pack(fill = tk.Y, pady = 5)
     
     frmCenterOeste.pack(fill = tk.BOTH, side = tk.LEFT, expand = tk.TRUE, padx = 5)
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     frmCenterEste = ttk.Labelframe(frmCenter, text = "Imagenes de la clase")
     
     self.frmTabla = TablaRutas(frmCenterEste)
     self.frmTabla.pack(fill = tk.BOTH, expand = tk.TRUE)
     
     frmCenterEste.pack(fill = tk.BOTH, side = tk.LEFT, expand = tk.TRUE, padx = 5)
     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     frmCenter.pack(fill = tk.BOTH, side = tk.TOP, expand= tk.TRUE)        
     #*****************************************************************************************
     #++++++++++++++++++++++++ Ventanas Emergentes ++++++++++++++++++++++++#
     self.frmVentanaCrearClase = VistaCrearClase(self, self.crearClase)
     self.frmVentanaMenuAgrImgs = VistaMenuAgregarImagenes(self, self.frmTabla)
     self.frmVentanaMoverImgs = VistaMoverSeleccionados(self, self.selectedClase, self.frmTabla.lstImgsSeleccionadas)
     self.frmVentanaGuaDirImgs  = VistaGuardarDirectorioImgs(self)
Example #3
0
class Principal(tk.Frame):
    '''
    Frame que muestra la ventana principal de la aplicacion
    '''
    #-------------------------------------------------------------------------------
    def __init__(self, master=None,  *args, **kw):
        tk.Frame.__init__(self, master, *args, **kw)
        self.padre = master
        self.padre.geometry('700x600+10+10')
        #--------------------------------------------
        self.width  = 0
        self.height = 0
        self.listaDirectorios = []
        self.listaDeClases = []
        self.FILTROS = [ImageFilter.BLUR,ImageFilter.CONTOUR,ImageFilter.DETAIL,ImageFilter.EDGE_ENHANCE,ImageFilter.EDGE_ENHANCE_MORE,ImageFilter.EMBOSS,ImageFilter.FIND_EDGES,ImageFilter.SMOOTH,ImageFilter.SMOOTH_MORE,ImageFilter.SHARPEN]
        self.listaFiltros = []
        self.initUI()
        self.pathDir = ''

    #-------------------------------------------------------------------------------
    def initUI(self):
        self.padre.title("PREPROCESAMIENTO")
        #Frames ---------------------------------------------------------
        frmGRAL   = ttk.Frame(self.padre)
        frmEstado = ttk.Frame(frmGRAL)
        frmPARAM  = ttk.Labelframe(frmGRAL,   text = "PARAMETROS")
        frmRUTAS  = ttk.Labelframe(frmEstado, text = "LISTA DE RUTAS")
        frmCLASES = ttk.Labelframe(frmEstado, text = "LISTA DE CLASES")
        frmFILTROS = ttk.Labelframe(frmPARAM, text = "FILTROS")
        frmESCCOL = ttk.Labelframe(frmPARAM,  text = "ESCALA y MODO DE COLOR")
        frmDEST =   ttk.Labelframe(frmPARAM,  text = "DESTINO")
        frmW = ttk.Frame(frmESCCOL)
        frmH = ttk.Frame(frmESCCOL)

        frmDR = ttk.Frame(frmDEST)
        frmDCSV = ttk.Frame(frmDEST)
        
        
        # BUTTONS -------------------------------------------------------     
        button_opt = {'fill': Tkconstants.BOTH, 'padx': 5, 'pady': 5,'side':tk.TOP}  
        ttk.Button(frmPARAM,  text='Agregar Nuevo Directorio de Clases', command=self.agregarDirectorioClase).pack(**button_opt)
        ttk.Button(frmPARAM,  text='Agregar Nuevo Archivo de Clases', command=self.agregarArchivoClase).pack(**button_opt)
        ttk.Button(frmEstado, text='INICIAR PROCESAMIENTO',command=self.RUN_PROCESO).pack(**button_opt)
        ttk.Button(frmDR, text='Ruta...',command=self.vistaDirectorioDest).pack(side=RIGHT,fill=BOTH)

     
        
        frmGRAL.pack  (fill = tk.BOTH, side = tk.TOP, expand= tk.TRUE)
        frmEstado.pack(fill = tk.BOTH, side = tk.RIGHT, expand = tk.TRUE, padx = 5)
        frmPARAM.pack (fill = tk.BOTH, side = tk.LEFT, expand = tk.TRUE, padx = 5)
        frmRUTAS.pack (fill = tk.BOTH, side = tk.TOP, expand = tk.TRUE, padx = 5)
        frmCLASES.pack(fill = tk.BOTH, side = tk.BOTTOM, expand= tk.TRUE,padx = 5)
        frmFILTROS.pack(fill = tk.BOTH, side = tk.BOTTOM, expand= tk.TRUE,padx = 5)
        frmESCCOL.pack(fill  = tk.BOTH, side = tk.BOTTOM, expand= tk.TRUE,padx = 5,pady = 10)
        frmW.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        frmH.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        frmDEST.pack(fill = tk.X, side=tk.TOP, expand=tk.TRUE,padx=5)
        frmDR.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        frmDCSV.pack(fill = tk.X,side=tk.TOP,expand=tk.TRUE,padx=5)
        
        
        scrollbarx,scrollbary = self.getScrollBars(frmRUTAS) 
        self.listaRutasGUI    = tk.Listbox(frmRUTAS,yscrollcommand=scrollbary.set,xscrollcommand=scrollbarx.set)
        self.confScrollbars(scrollbarx, scrollbary,0)
        self.packScrollBars(scrollbarx,scrollbary)
        self.listaRutasGUI.pack(side=LEFT, fill=BOTH, expand=1)
        
        scrollbarxC,scrollbaryC = self.getScrollBars(frmCLASES) 
        self.listaClasesGUI    = tk.Listbox(frmCLASES,yscrollcommand=scrollbaryC.set,xscrollcommand=scrollbarxC.set)
        self.confScrollbars(scrollbarxC, scrollbaryC,1)
        self.packScrollBars(scrollbarxC,scrollbaryC)
        self.listaClasesGUI.pack(side=LEFT, fill=BOTH, expand=1)
        
        self.listaFiltrosGUI = tk.Listbox(frmFILTROS,selectmode=EXTENDED,exportselection=0,yscrollcommand=scrollbaryC.set,xscrollcommand=scrollbarxC.set)
        self.listaFiltrosGUI.pack(side=LEFT, fill=BOTH, expand=1)
        self.llenarListaFiltros(self.listaFiltrosGUI)
        
        Label(frmW, text="Ancho(W):").pack(side=LEFT)    
        Label(frmH, text="Alto (H):    ").pack(side=LEFT)
        
        self.strW = StringVar()
        self.strH = StringVar()
        self.entryW = tk.Entry(frmW,textvariable=self.strW, justify=tk.CENTER).pack(side=LEFT)
        self.entryH = tk.Entry(frmH,textvariable=self.strH, justify=tk.CENTER).pack(side=LEFT)
        
        Label(frmESCCOL, text="Modo de Color: ").pack(side=LEFT)
        self.boxVal = StringVar()
        listaValores = ['1','L','P','RGB']
        self.boxMColor = ttk.Combobox(frmESCCOL, textvariable=self.boxVal, values = listaValores, state="readonly").pack(side=LEFT)
        

        Label(frmDR,text="Nombre de Nuevo Directorio").pack(side=LEFT)

        self.strDirDest = StringVar()
        self.entryNDir  = tk.Entry(frmDR,textvariable=self.strDirDest,width=50 ).pack(side=LEFT)
        Label(frmDCSV,text="Nombre Archivo de etiquetas").pack(side=LEFT)
        self.strCSV = StringVar()
        self.entryNCSV  = tk.Entry(frmDCSV,textvariable=self.strCSV,width=60).pack(side=LEFT, fill=BOTH)
        
        self.frmVentanaGuaDirImgs  = VistaGuardarDirectorioImgs(self)
        
    #-------------------------------------------------------------------------------------------------------------------
    
    def RUN_PROCESO(self):
        tuplaFiltros = self.listaFiltrosGUI.curselection()
        for seleccion in tuplaFiltros:
            self.listaFiltros.append(self.FILTROS[seleccion])
        if (not self.listaFiltros):
            self.listaFiltros = None
        color = self.boxVal.get()
        
        destino = self.strDirDest.get()
        ncsv = self.strCSV.get()
        w = self.strW.get()
        h = self.strH.get()
        directorios = self.listaDirectorios
        clases = self.listaDeClases
        filtros = self.listaFiltros
        
        print "CSV: ", ncsv
        print "Ancho: ", w
        print "Alto: ", h
        print "Color seleccionado: " , color
        print "Lista clases", clases
        print "Filtros: ", filtros
        
        proceso = Procesamiento.Procesamiento(directorios,clases,filtros, color ,int(w) , int(h) ,destino+os.path.sep, ncsv)
        proceso.RUN()
        
        
    def agregarDirectorioClase(self):
        self.optDialogoDir = opciones = {}
        opciones['parent'] = self
        opciones['title'] = 'Elija un directorio de Clase'
        directorio = tkFileDialog.askdirectory(**self.optDialogoDir)
        directorio = os.path.abspath(directorio)
        directorio = directorio + os.path.sep
        self.cargarInfoDirectorio(directorio)


    def agregarDirectorioSave(self):
        self.optDialogoDir = opciones = {}
        opciones['parent'] = self
        opciones['title'] = 'Elija un destino de Clase'
        directorio = tkFileDialog.askdirectory(**self.optDialogoDir)
        self.strDirDest.set(directorio)
    
    #Crear directorio para imágenes procesadas
    def vistaDirectorioDest(self):
        self.frmVentanaGuaDirImgs.show()
        self.update()
        
        

    def agregarArchivoClase(self):
        self.optDialogoDir = opciones = {}
        opciones['parent'] = self
        opciones['title'] = 'Elegir un Archivo de Rutas'
        archivo = tkFileDialog.askopenfile(**self.optDialogoDir)
        if(archivo != None and archivo != ''):
            print archivo.name
            self.cargarRutasDesdeArchivo(archivo.name)


    def cargarInfoDirectorio(self, elemento):
        if(elemento not in self.listaDirectorios and elemento != ''):
            self.listaDirectorios.append(elemento)
            self.listaRutasGUI.insert(END, elemento)
            clase = self.getClaseDesdeRuta(elemento)
            if(clase): #La clase siempre se inserta en la lista de clases, pero en la lista de la GUI sólo se muestra una vez
                self.listaClasesGUI.insert(END,clase)
    
    
    def cargarRutasDesdeArchivo(self, archivo):
        with open(archivo) as archivoClases:
            rutas = archivoClases.readlines()
            for ruta in rutas:
                if(ruta!='' and ruta!='\n'):
                    self.cargarInfoDirectorio(ruta)
        archivoClases.close()       
    
    
    def getClaseDesdeRuta(self,ruta):
        mostrarEnLista = None
        separador = os.path.sep
        clase = ruta.split(separador)[-2]
        clase = clase.lower()
        if(clase not in self.listaDeClases): #para saber si se mostrará en la lista de la GUI
            mostrarEnLista = clase
        self.listaDeClases.append(clase) # La clase Simepre se agrega a la lista @self.listaDeClases
        return mostrarEnLista
    
    def llenarListaFiltros(self,listaGUI):
        for filtro in self.FILTROS:
            self.listaFiltrosGUI.insert(END,filtro.name)
            
    
    
    def getScrollBars(self,frameToStroll):
        scrollbary = Scrollbar(frameToStroll, orient=VERTICAL)
        scrollbarx = Scrollbar(frameToStroll, orient=HORIZONTAL)
        return scrollbarx,scrollbary
    
    def confScrollbars(self,sbx,sby,listaActiva):
        if(listaActiva == 0):
            sbx.config(command=self.xview)
            sby.config(command=self.yview)
        else:    
            sbx.config(command=self.xview2)
            sby.config(command=self.yview2)
            

    def packScrollBars(self,sbx,sby):
        sbx.pack(fill=X)
        sby.pack(side=RIGHT, fill=Y)
     
    def yview(self,*args):
        apply(self.listaRutasGUI.yview, args)
  
    def yview2(self,*args):
        apply(self.listaClasesGUI.yview, args)

    def xview(self,*args):
        apply(self.listaRutasGUI.xview, args)
        
    def xview2(self,*args):
        apply(self.listaClasesGUI.xview, args)
Example #4
0
class Principal(tk.Frame):
    '''
    Frame que muestra la ventana principal de la aplicacion
    '''
    #-------------------------------------------------------------------------------
    def __init__(self, master=None,  *args, **kw):
        '''
        Constructor de la vista e inicializacion de las propiedades de la ventana
        '''
        tk.Frame.__init__(self, master, *args, **kw)
        self.padre = master
        self.padre.geometry('1000x500+10+10')
        
        self.initUI()

    #-------------------------------------------------------------------------------
    def initUI(self):
        '''
        Crea y empaqueta todos low widgets de la ventana
        '''
        self.padre.title("Adquicicion de imagenes")
        #*****************************************************************************************
        frmHeader = ttk.Frame(self.padre, relief = tk.RAISED)
        mbMenu=  ttk.Menubutton(frmHeader, text="Archivo")
        mbMenu.menu = tk.Menu(mbMenu)
        mbMenu["menu"] = mbMenu.menu
        mbMenu.menu.add_command(label = "Generar Archivo De Direcciones", command = self.abrirGenerarArchivoDeDirecciones)
        mbMenu.menu.add_command(label = "Generar Directorio de Imagenes", command = self.abrirVistaGuardarDirectorioImgs)
        mbMenu.pack(side = tk.LEFT)
        frmHeader.pack(side = tk.TOP, fill = tk.X, expand = tk.TRUE)
        #*****************************************************************************************
        
        #*****************************************************************************************
        frmNorte = ttk.Frame(self.padre)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        frmNorteOeste  = ttk.Frame(frmNorte)        
        
        lblLogo = ttk.Label(frmNorteOeste, background = "green", text="Logo")
        lblLogo.pack(fill = tk.BOTH)
        
        frmNorteOeste.grid(column = 0, row = 0)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        frmNorteEste = ttk.Frame(frmNorte)
         
        btnAgregarImg = ttk.Button(frmNorteEste, 
                                   text="Agregar Imagen", 
                                   width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                                   command = self.abrirVistaMenuAgrImgs)
        btnAgregarImg.grid(column = 1, row = 0, pady = 5)
        btnCrearClase = ttk.Button(frmNorteEste, 
                                   text="Nueva Clase", 
                                   width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                                   command = self.abrirVistaCrearClase)
        btnCrearClase.grid(column = 1, row = 1, pady = 5)
        
        frmNorteEste.grid(column = 1, row = 0)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        frmNorte.grid_columnconfigure(0,weight = 1)
        frmNorte.grid_columnconfigure(1,weight = 1)
        
        frmNorte.pack(fill = tk.X, side=tk.TOP)
        #*****************************************************************************************       
        
        ttk.Separator(self.padre, orient = tk.HORIZONTAL).pack()
        
        #*****************************************************************************************
        frmCenter = ttk.Frame(self.padre)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
        frmCenterOeste = ttk.Labelframe(frmCenter, text = "Acciones sobre la tabla")
        
        ttk.Label(frmCenterOeste, text = "Cambia de clase: ").pack(fill = tk.Y, anchor = tk.NW)         
        self.selectedClase = StringVar()
        self.selectedClase.set(Accion.nomClaseDefault)
        self.cmbClases = ttk.Combobox(frmCenterOeste, 
                                      textvariable=self.selectedClase, 
                                      state = 'readonly')
        self.cmbClases['values'] = Accion.dicClases.keys()
         
        self.cmbClases.pack(fill = tk.Y, pady = 5)
        self.cmbClases.bind("<<ComboboxSelected>>", self.cambiarClase)
         
        ttk.Button(frmCenterOeste, 
                   text = "Mover Todo", 
                   width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                   command = self.abrirVistaMoverImgs).pack(fill = tk.Y, pady = 5)
        
        ttk.Button(frmCenterOeste, 
                   text = "Eliminar Todo", 
                   width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                   command = self.eliminarImagenes).pack(fill = tk.Y, pady = 5)
        
        ttk.Separator(frmCenterOeste, orient = tk.HORIZONTAL).pack(fill = tk.Y, expand = tk.TRUE)
        
        ttk.Button(frmCenterOeste, 
                   text = "Deshacer ultima Accion", 
                   width = Util.getMnsjConf("VistaPrincipal", "tamBotones"),
                   command = self.deshacerAccion).pack(fill = tk.Y, pady = 5)
        
        frmCenterOeste.pack(fill = tk.BOTH, side = tk.LEFT, expand = tk.TRUE, padx = 5)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        frmCenterEste = ttk.Labelframe(frmCenter, text = "Imagenes de la clase")
        
        self.frmTabla = TablaRutas(frmCenterEste)
        self.frmTabla.pack(fill = tk.BOTH, expand = tk.TRUE)
        
        frmCenterEste.pack(fill = tk.BOTH, side = tk.LEFT, expand = tk.TRUE, padx = 5)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        frmCenter.pack(fill = tk.BOTH, side = tk.TOP, expand= tk.TRUE)        
        #*****************************************************************************************
        #++++++++++++++++++++++++ Ventanas Emergentes ++++++++++++++++++++++++#
        self.frmVentanaCrearClase = VistaCrearClase(self, self.crearClase)
        self.frmVentanaMenuAgrImgs = VistaMenuAgregarImagenes(self, self.frmTabla)
        self.frmVentanaMoverImgs = VistaMoverSeleccionados(self, self.selectedClase, self.frmTabla.lstImgsSeleccionadas)
        self.frmVentanaGuaDirImgs  = VistaGuardarDirectorioImgs(self)
        
    #-------------------------------------------------------------------------------        
    def crearClase(self):
        '''
        Metodo que crea una clase y refresca el combobox que contiene las clases de la vista
        '''
        try:
            CrearClase(self.frmVentanaCrearClase.strVarNomNvaClase.get()).efectuarAccion()
            self.frmVentanaCrearClase.strVarNomNvaClase.set("")
            self.frmVentanaCrearClase.hide()
            self.actualizarCmbClases()
        except Exception as ex:
            logger.error(ex)
        
    #-------------------------------------------------------------------------------
    def abrirVistaCrearClase(self):
        self.frmVentanaCrearClase.show()
    
    #-------------------------------------------------------------------------------
    def abrirVistaMenuAgrImgs(self):
        self.frmVentanaMenuAgrImgs.show()
    
    #-------------------------------------------------------------------------------
    def abrirVistaMoverImgs(self):
        self.frmVentanaMoverImgs.show()
        
    #-------------------------------------------------------------------------------
    def abrirVistaGuardarDirectorioImgs(self):
        self.frmVentanaGuaDirImgs.show()
    
    #-------------------------------------------------------------------------------
    def abrirGenerarArchivoDeDirecciones(self):
        f = tkFileDialog.asksaveasfilename(defaultextension=".txt")
        Accion().generarArchivoDeDirecciones(f)
        
    #-------------------------------------------------------------------------------
    def cambiarClase(self, event):
        logger.info("Cambiando de clase a : "+self.selectedClase.get())
        if self.selectedClase.get() is not None and self.selectedClase.get() != "":
            self.actualizarClase(self.selectedClase.get())
    
    #-------------------------------------------------------------------------------
    def actualizarCmbClases(self):
        self.cmbClases['values'] = Accion.dicClases.keys()
    
    #-------------------------------------------------------------------------------
    def actualizarClase(self, nomClase):
        self.frmTabla.cambiarDeClase(nomClase)
        self.frmTabla.actualizarTabla()
        self.selectedClase.set(nomClase)
        
    #-------------------------------------------------------------------------------
    def eliminarImagenes(self):
        lstAuxImgs = []
        lstAuxImgs.extend(self.frmTabla.lstImgsSeleccionadas)
        accion = EliminarImagen(lstAuxImgs)
        accion.efectuarAccion()
        self.actualizarClase(self.selectedClase.get())
        
    #-------------------------------------------------------------------------------
    def deshacerAccion(self):
        accionDeshecha = Accion().deshacerUltimaAccion()
        
        if accionDeshecha is None:
            logger.info("No hay mas acciones por deshacer")
        elif accionDeshecha.__class__ == AgregarImagen:
            self.actualizarClase(Accion.nomClaseDefault)
        elif accionDeshecha.__class__ == EliminarImagen:
            self.actualizarClase(accionDeshecha.imgsAfectadas[0].nomClaseCorrecto)
        elif accionDeshecha.__class__ == CrearClase or accionDeshecha.__class__ == EliminarClase:
            self.actualizarCmbClases()
        elif accionDeshecha.__class__ == MoverImagen:
            self.actualizarClase(accionDeshecha.claseOrigen)
        else:
            logger.error("Error no se encontro el tipo de accion que se desizo")