def __init__(self,  parent, *args, **kw):
        '''
        Inicializa un frmScrollPane con scroll y crea la cabezera de la tabla
        '''
        ttk.Frame.__init__(self, parent, *args, **kw)
        
        self.lstImgsFiltradas = [] 
        self.lstImgsSeleccionadas = []
        self.boolVarVerImgs = tk.BooleanVar()
        self.boolVarVerImgs.set(tk.FALSE)
        
        self.expRegBusqueda = tk.StringVar()
        ttk.Entry(self, textvariable=self.expRegBusqueda).pack(fill = tk.X)

        self.iconoBusqueda = Image.open("../Imgs/iconoBusqueda.png")
        self.iconoBusqueda.thumbnail((20,20), Image.ANTIALIAS)
        self.iconoBusqueda = ImageTk.PhotoImage(self.iconoBusqueda)
        ttk.Button(self, image=self.iconoBusqueda, command=self.buscar).pack(fill = tk.X)
        
        self.frmScrollPane = ScrolledFrame(self)
        self.frmScrollPane.pack(fill = tk.BOTH, expand = True)
            
        self.cambiarDeClase(Accion.nomClaseDefault)    
class TablaRutas (ttk.Frame):
    '''
    Clase que crea una tabla en un Frame con scrolls, 
    especifica para agrear filas con a base de la clase Imagen
    '''
    #-----------------------------------------------------------------------
    def __init__(self,  parent, *args, **kw):
        '''
        Inicializa un frmScrollPane con scroll y crea la cabezera de la tabla
        '''
        ttk.Frame.__init__(self, parent, *args, **kw)
        
        self.lstImgsFiltradas = [] 
        self.lstImgsSeleccionadas = []
        self.boolVarVerImgs = tk.BooleanVar()
        self.boolVarVerImgs.set(tk.FALSE)
        
        self.expRegBusqueda = tk.StringVar()
        ttk.Entry(self, textvariable=self.expRegBusqueda).pack(fill = tk.X)

        self.iconoBusqueda = Image.open("../Imgs/iconoBusqueda.png")
        self.iconoBusqueda.thumbnail((20,20), Image.ANTIALIAS)
        self.iconoBusqueda = ImageTk.PhotoImage(self.iconoBusqueda)
        ttk.Button(self, image=self.iconoBusqueda, command=self.buscar).pack(fill = tk.X)
        
        self.frmScrollPane = ScrolledFrame(self)
        self.frmScrollPane.pack(fill = tk.BOTH, expand = True)
            
        self.cambiarDeClase(Accion.nomClaseDefault)    
    
    #-----------------------------------------------------------------------
    def cambiarDeClase(self, nombreClase):
        '''
        Cambia de clase actualizando la tabla con las rutas de la clase
        '''
        self.nomClaseActual = nombreClase
        
        self.cargarClase(nombreClase)
        
        self.empaquetarWidgetsTabla()
         
    
    #-----------------------------------------------------------------------
    def cargarClase(self, nombreClase):
        '''
        Crea las filas de la tabla cargando los datos que se tiene en la clase Accion
        @param nombreClase: clase que se cargara localmente
        @return: Regresa una lista de objetos Fila que tiene los dato 
                procesados de la clase pasada en los parametros
        '''
        
        self.imgs = Accion.dicClases.get(nombreClase).values()
            
        self.limpiarLstImgsSeleccionadas()
        self.limpiarLstImgsFiltradas() 
        for img in self.imgs : self.lstImgsFiltradas.append(img)
    
    #-----------------------------------------------------------------------
    def buscar(self):
        '''
        Busca utilizando expresiones regulares, todos los objetos Imgen de todos los objetos
        Fila que se encuentran en la lista filas
        '''
        
        if self.expRegBusqueda.get() is None :
            raise Exception(Util.getMnsjIdioma("TablaRutas", "Error_Exp_Reg_None"))
        
        self.limpiarLstImgsSeleccionadas()
        self.limpiarLstImgsFiltradas()
        
        try:
            for img in self.imgs:
                if(re.search(self.expRegBusqueda.get(),img.source) is not None):
                    self.lstImgsFiltradas.append(img)
        except Exception:
            raise Exception(Util.getMnsjIdioma("TablaRutas", "Error_Exp_Reg_Inv"))
                
        self.empaquetarWidgetsTabla()
            
    #-----------------------------------------------------------------------
    def empaquetarWidgetsTabla(self):
        '''
        Agrega todas los widgets de los objetos fila que se encuentran en la lista lstFilasFiltradas
        al frmScrollPane de la tabla y tambien crea los widgets y los empequeta de la cabezera
        '''
        self.limpiarTabla()
        
        self.empaquetarCabezeraTabla()
        
        i = 1
        for img in self.lstImgsFiltradas:
            img.widgetFila.empaquetar(i)
            i = i+1
        
        self.update()
    
    #-----------------------------------------------------------------------
    def empaquetarCabezeraTabla(self):
        '''
        Crea los widgets de la cabezera de la tabla y los empaqueta en ella
        '''
        self.strVarEstanSelecTodos = tk.StringVar()
        self.strVarEstanSelecTodos.set('0')
        ttk.Checkbutton(self.frmScrollPane.interior, 
                        variable = self.strVarEstanSelecTodos, 
                        command = self.seleccionarDeseleccionarTodo,).grid(row = 0, 
                                                                           column = 0,
                                                                           padx = 5)
        
        ttk.Label(self.frmScrollPane.interior, 
                  text = "Ruta de la Imagen").grid(row = 0, 
                                                   column = 1,
                                                   padx = 5)
                  
        ttk.Checkbutton(self.frmScrollPane.interior,
                        command = self.empaquetarWidgetsTabla,
                        text = "Ver Imagenes", 
                        variable = self.boolVarVerImgs).grid(row = 0, 
                                                             column = 2,
                                                             padx = 5)
        
        self.frmScrollPane.interior.grid_columnconfigure(0, weight = 1)    
        self.frmScrollPane.interior.grid_columnconfigure(1, weight = 2)
        self.frmScrollPane.interior.grid_columnconfigure(2, weight = 1)

    #-----------------------------------------------------------------------
    def limpiarTabla(self):
        '''
        Elimina todos los widgets del frmScrollPane
        '''
        for a in self.frmScrollPane.interior.winfo_children(): a.grid_forget()
        
        self.update()
    
    #-----------------------------------------------------------------------
    def limpiarLstImgsFiltradas(self):
        '''
        Limpia la lista de filas que se utiliza para realizar la busqueda
        '''
        while len(self.lstImgsFiltradas) > 0 : del self.lstImgsFiltradas[0]
    
    #-----------------------------------------------------------------------
    def limpiarLstImgsSeleccionadas(self):
        '''
        Limpia la lista de imagenes que hayan sido seleccionadas
        '''
        while len(self.lstImgsSeleccionadas) > 0 :
            self.lstImgsSeleccionadas[0].widgetFila.strVarEstaSelecccionado.set('0')
            del self.lstImgsSeleccionadas[0]
    
    #-----------------------------------------------------------------------
    def seleccionarDeseleccionarTodo(self):
        '''
        Verifica si el checkBox que se utiliza para seleccionar todos esta seleccionado
        y dependiendo de su estado efectua cierta tarea
        '''
        self.limpiarLstImgsSeleccionadas()
        if self.strVarEstanSelecTodos.get() == '0':
            for img in self.lstImgsFiltradas: img.widgetFila.strVarEstaSelecccionado.set('0')
            log.info("Todas las filas deseleccionadas")
        elif self.strVarEstanSelecTodos.get() == '1':
            for img in self.lstImgsFiltradas:
                self.lstImgsSeleccionadas.append(img) 
                img.widgetFila.strVarEstaSelecccionado.set('1')
                
            log.info("Todas las filas seleccionadas")
        else:
            log.error("Seleccionar todos, Valor desconocido "+self.strVarEstanSelecTodos.get())
    
    #-----------------------------------------------------------------------
    def seleccionarImg(self, img):
        '''
        Agrea el objeto img de los parametros a la lista lstImgsSeleccionadas
        '''
        self.lstImgsSeleccionadas.append(img)
        log.info("Fila "+img.source+" seleccionada")
    
    #-----------------------------------------------------------------------
    def desseleccionarImg(self, img):
        '''
        Trata de eliminar el objeto fila de los parametros de la lista lstImgsSeleccionadas
        '''
        try:
            self.lstImgsSeleccionadas.remove(img)
            log.info("Fila "+img.source+" deseleccionada")
        except ValueError:
            log.error("Error interno al seleccionar fila no previamente seleccionada: "+img.source)
    

    #-----------------------------------------------------------------------
    def actualizarTabla(self):
        '''
        Actualiza los widgest mas importantes de la tabla
        '''
        self.frmScrollPane.acutalizarScrollPane()