def _abrir(self, action): """ Abre la ventana de la entrada de menú recibida. """ idventana = int(action.get_name().replace("V", "")) ventana = pclases.Ventana.get(idventana) clase = ventana.clase archivo = ventana.fichero if archivo.endswith('.py'): # Al importar no hay que indicar extensión archivo = archivo[:archivo.rfind('.py')] if clase == 'acerca_de' and archivo == 'acerca_de': ui.escribir_barra_estado(self.wids['barra_estado'], 'Abrir: "acerca de..."', self.logger, self.__usuario.usuario) self.acerca_de() else: try: cur_reloj = gtk.gdk.Cursor(gtk.gdk.WATCH) self.wids['ventana'].window.set_cursor(cur_reloj) ui.escribir_barra_estado(self.wids['barra_estado'], "Cargar: %s.py" % archivo, self.logger, self.__usuario.usuario) while gtk.events_pending(): gtk.main_iteration(False) try: exec "reload(%s)" % archivo except NameError: exec "import %s" % archivo v = None gobject.timeout_add(100, self.volver_a_cursor_original) # Solo se permite una instancia de cada tipo de ventana. # It's not a bug. It's a feature! (sí, ya :P) v = eval('%s.%s' % (archivo, clase)) v(usuario = self.__usuario) except Exception, msg: self.logger.error("ventana.py::_abrir -> Excepción " "importando fichero ventana: %s" % msg) self.wids['ventana'].window.set_cursor(None) ui.escribir_barra_estado(self.wids['barra_estado'], "Error detectado. Iniciando informe por correo.", self.logger, self.__usuario.usuario) print "Se ha detectado un error" texto = '' for e in sys.exc_info(): texto += "%s\n" % e tb = sys.exc_info()[2] texto += "Línea %s\n" % tb.tb_lineno from menu import MetaF, enviar_correo info = MetaF() import traceback traceback.print_tb(tb, file = info) texto += "%s\n" % info enviar_correo(texto, self.__usuario)
def __init__(self, glade, objeto = None, usuario = None): """ Constructor. glade es una cadena con el nombre del fichero .glade a cargar. objeto es el objeto principal de la ventana. Si usuario se recibe, se guarda en un atributo privado de la clase que servirá únicamente para crear un menú superior en la ventana con las opciones de menú disponibles para el usuario. Si el usuario es None, no se crea ningún menú. """ if isinstance(usuario, int): usuario = pclases.Usuario.get(usuario) self.__usuario = usuario self._is_fullscreen = False import logging self.logger = logging.getLogger('GINN') # El fichero de log lo voy a plantar en el raíz del proyecto. rutalogger = os.path.join(os.path.dirname(__file__), "..", 'ginn.log') hdlr = logging.FileHandler(rutalogger) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(formatter) self.logger.addHandler(hdlr) # self.logger.setLevel(logging.INFO) try: self.wids = Widgets(glade) # Puede que venga la ruta ya y no # haga falta combinar con os.path.join. except RuntimeError: try: self.wids = Widgets(os.path.join("formularios","glades",glade)) except RuntimeError: try: self.wids = Widgets(os.path.join("glades", glade)) except RuntimeError: try: self.wids = Widgets(os.path.join( "..", "formularios", "glades", glade)) except RuntimeError: if pclases.DEBUG and pclases.VERBOSE: print "ventana.py::Ventana.__init__ -> "\ "No encuentro el glade. Estoy en %s. "\ "Intento cargar de nuevo desde donde "\ "se supone que debería estar." % ( os.path.abspath(os.path.curdir)) self.wids = Widgets(glade) self.refocus_enter() try: self.wids['ventana'].set_border_width(5) # TODO:Cambiar por uno correspondiente al logo de la configuración. ruta_logo = os.path.join("imagenes", 'logo.xpm') logo_xpm = gtk.gdk.pixbuf_new_from_file(ruta_logo) self.wids['ventana'].set_icon(logo_xpm) self.wids['barra_estado'] = gtk.Statusbar() label_statusbar = self.wids['barra_estado'].get_children()[0].child font = pango.FontDescription("Monospace oblique 7") label_statusbar.modify_font(font) label_statusbar.modify_fg(gtk.STATE_NORMAL, label_statusbar.get_colormap().alloc_color("darkgray")) contenido_anterior = self.wids['ventana'].get_child() self.wids['ventana'].remove(contenido_anterior) self.wids['contenedor_exterior'] = gtk.VBox() self.wids['ventana'].add(self.wids['contenedor_exterior']) self.wids['menu_superior'] = self.build_menu_superior() self.wids['contenedor_exterior'].pack_start( self.wids['menu_superior'], False) self.wids['contenedor_exterior'].add(contenido_anterior) self.wids['contenedor_exterior'].pack_end( self.wids['barra_estado'], False) self.wids['contenedor_exterior'].show() self.wids['barra_estado'].show() config = ConfigConexion() info_conexion = "%s://%s:xxxxxxxx@%s:%s/%s" % (config.get_tipobd(), config.get_user(), config.get_host(), config.get_puerto(), config.get_dbname()) info_usuario = "" if hasattr(self, "usuario") and self.__usuario != None: info_usuario = " usuario: %s." % (self.__usuario.usuario) if self.__usuario != None: info_usuario = " __usuario: %s." % (self.__usuario.usuario) ui.escribir_barra_estado(self.wids['barra_estado'], "Conectado a %s.%s" % (info_conexion, info_usuario)) except Exception, msg: txt = "ventana.py::__init__ -> No se pudo establecer ancho "\ "de borde, icono de ventana o barra de estado. "\ "Excepción: %s." % (msg) self.logger.warning(txt)