# -*- coding: utf-8 -*- import pygtk pygtk.require('2.0') import gtk import os import base64 import gobject import config from PIL import Image from random import randint import player _ = config._ copy = None class Pulsador (gtk.Button): """ Clase que representa los botones de los paneles """ actions={ "read" : _(u"Leer pronunciación"), \ "play" : _("Reproducir archivo"), \ "close" : _("Cerrar mosaico"), \ "exit" : _("Salir del programa"), \ "fullscreen" : _("Pantalla completa"), \ "goto" : _("Ir a otro mosaico"), \ "volup" : _("Incrementar volumen"), \ "voldown" : _("Decrementar volumen"), \ "eraseall" : _("Borrar todo el mensaje"), \ "eraselast" : _(u"Borrar último"), \ "send_by_mail" : _("Enviar por e-correo"), \ } def __init__(self, tipo = None, path=None): """ Constructor de la clase """ gtk.Button.__init__(self) box = gtk.VBox(False, 0) box.set_border_width(2) self.ident = randint(1, 10**8) self.tipo = tipo if tipo == "contacto": self.default_image = "/usr/share/pixmaps/login-photo.png" else: self.default_image = "" self.player = config.player self.ispreview = False self.ismini = False self.ismodificable = True self.path = path self.default_config={ "nombre":"", \ "tipo_letra":config.global_config["tipo_letra"], \ "color_letra":config.global_config["color_letra"], \ "size_letra":config.global_config["size_letra"], \ "color_fondo":config.global_config["color_fondo"], \ "escalado_imagen":config.global_config["size_imagen"], \ "pronunciacion":"", \ "sonido":"", \ "imagen":self.default_image, \ "enlace_a_mosaico":"", \ "action":"read", \ "mail":"", \ } self.config = self.default_config self.tooltips = gtk.Tooltips() self.tooltips.set_tip(self, _("Clic izquierdo: ")+self.actions[self.config["action"]]+"\n"+_("Clic derecho: Editar pulsador")+"\n"+_("Clic central: Cortar y pegar"), tip_private=None) self.tooltips.set_delay(1500) self.imagen = gtk.Image() self.titulo = gtk.Label("") self.titulo.set_justify(gtk.JUSTIFY_CENTER) #self.titulo.set_max_width_chars(16) self.titulo.set_line_wrap(True) box.pack_start(self.imagen, True, True, 0) box.pack_end(self.titulo, False, False, 0) self.add(box) self.connect_object("event", self.button_press, self) self.aplicar_formato() self.show_all() #Metodos def aplicar_formato(self): """ Establece el aspecto del botón """ self.titulo.set_use_markup(True) if self.config["color_fondo"]: self.modify_bg(gtk.STATE_NORMAL, self.get_colormap().alloc_color(self.config["color_fondo"])) self.titulo.set_markup("%s" % (self.config["tipo_letra"], self.config["size_letra"], self.config["color_letra"], self.config["nombre"])) self.titulo.set_justify(gtk.JUSTIFY_CENTER) #self.titulo.set_max_width_chars(16) self.titulo.set_line_wrap(True) self.tooltips.set_tip(self, _("Clic izquierdo: ")+self.actions[self.config["action"]]+"\n"+_("Clic derecho: Editar pulsador")+"\n"+_("Clic central: Cortar y pegar"), tip_private=None) if self.config["imagen"] and os.path.exists(self.config["imagen"]): x = self.ismini and 1 or self.config["escalado_imagen"] size = x*32, x*32 pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.config["imagen"], size[0], size[1]) self.imagen.set_from_pixbuf(pixbuf) self.show_all() else: self.show_all() self.imagen.hide() def modificar_boton(self, nombre=None, pronunciacion=None, sonido=None, tipo_letra=None, color_letra=None, tamano_letra=None, color_fondo=None, imagen="", enlace_a_mosaico=None, escalado=0, mail=None, action=None): """ Establecelos atributos del botón """ if self.ismodificable: self.config["nombre"] = nombre and nombre or self.config["nombre"] self.config["tipo_letra"] = tipo_letra and tipo_letra or self.config["tipo_letra"] self.config["color_letra"] = color_letra and self.tohex(color_letra) or self.config["color_letra"] self.config["size_letra"] = tamano_letra and tamano_letra or self.config["size_letra"] self.config["color_fondo"] = color_fondo and self.tohex(color_fondo) or self.config["color_fondo"] self.config["pronunciacion"] = pronunciacion and pronunciacion or self.config["pronunciacion"] self.config["sonido"] = sonido and sonido or self.config["sonido"] self.config["mail"] = mail and mail or self.config["mail"] self.config["action"] = action and action or self.config["action"] self.config["imagen"] = imagen #and imagen or self.config["imagen"] self.config["escalado_imagen"] = escalado and escalado or self.config["escalado_imagen"] self.config["enlace_a_mosaico"] = enlace_a_mosaico and enlace_a_mosaico or self.config["enlace_a_mosaico"] self.aplicar_formato() def limpiar_boton(self): """ Restaura la configuración por defecto """ self.config = self.default_config self.aplicar_formato() def from_string(self, ident, s): """ Lee la """ path = config.temp_dir self.ident = ident for k, v in s.iteritems(): if k == "imagen" and v: try: file = str(os.path.join(path, v["file"])) f = open(file,"w") f.write(base64.b64decode(v["data"])) f.close() self.config["imagen"] = file except: print "Fallo al recuperar la imagen" self.config["imagen"] = "" elif k == "sonido" and v: try: file = str(os.path.join(path, v["file"])) f = open(file,"w") f.write(base64.b64decode(v["data"])) f.close() self.config["sonido"] = file except: print "Fallo al recuperar el sonido" self.config["sonido"] = "" elif k == "fila": i = int(v) elif k == "columna": j = int(v) elif k == "size_letra" or k == "escalado_imagen": self.config[str(k)] = int(v) else: self.config[str(k)] = str(v) self.aplicar_formato() return i, j def lock(self): self.ismodificable=False def unlock(self): self.ismodificable=True def tohex(self, rgb): zero = "0000" red = (zero+hex(rgb[0]/256)[2:])[-2:] green = (zero+hex(rgb[1]/256)[2:])[-2:] blue = (zero+hex(rgb[2]/256)[2:])[-2:] return "#%s%s%s" % (red, green, blue) def to_string(self, i = -1, j = -1): tab = "\t\t" r = tab + "\n" % (self.ident) #r += tab + "\t%s\n" % (self.ident) r += tab + "\t%d\n" % i r += tab + "\t%d\n" % j p = "" compress = config.global_config["use_zlib"] for k, v in self.config.iteritems(): if k == "sonido" and v: # convertir sonido v a texto try: audio = open(v, "r") f = os.path.split(v)[1] if compress: b64 = zlib.compress(base64.b64encode(audio.read()), config.global_config["level_zlib"]) else: b64 = base64.b64encode(audio.read()) p += tab + "\t<%s>\n" % k p += tab + "\t\t%s\n" % f p += tab + "\t\t%s\n" % "base64" p += tab + "\t\t%s\n" % compress p += tab + "\t\t%s\n" % b64 p += tab + "\t\n" % k audio.close() except: pass elif k == "imagen" and v != self.default_image: # convertir imagen v a texto try: picture = open(v, "r") f = os.path.split(v)[1] if compress: b64 = zlib.compress(base64.b64encode(picture.read()), config.global_config["level_zlib"]) else: b64 = base64.b64encode(picture.read()) p += tab + "\t<%s>\n" % k p += tab + "\t\t%s\n" % f p += tab + "\t\t%s\n" % "base64" p += tab + "\t\t%s\n" % compress p += tab + "\t\t%s\n" % b64 p += tab + "\t\n" % k picture.close() except: pass else: r += tab + "\t<%s>%s\n" % (k, v , k) r += p + tab + "\n" % (self.ident) return r def button_press(self, widget, event): # global base if event.type == gtk.gdk.BUTTON_PRESS: if event.button==1: eval("self.%s()" % widget.config["action"]) elif event.button==2: #print "Click con el botón central" # copiar boton if widget.ismodificable and not widget.ispreview and not config.base.session["fullscreen"]: global copy if copy: #print "Intercambiar con Pulsador en memoria" if copy.tipo == widget.tipo: t = widget.config widget.config = copy.config copy.config = t widget.aplicar_formato() copy.set_relief(gtk.RELIEF_NORMAL) copy.aplicar_formato() copy = None else: #print "Almacenar Pulsador en memoria" copy = widget copy.set_relief(gtk.RELIEF_NONE) elif event.button==3: #print "Click con el botón derecho" if widget.ismodificable and not widget.ispreview and not config.base.session["fullscreen"]: #print "Editar Pulsador" # mostrar ventana edición p = Propiedades(widget) def clone(self): b = Pulsador() b.config = self.config b.aplicar_formato() return b def preview(self): b = self.clone() b.ispreview = True return b def mini(self): b = self.clone() b.ismini = True b.aplicar_formato() b.titulo.set_markup("%s" % (self.config["tipo_letra"], 8, self.config["color_letra"], self.config["nombre"])) b.lock() b.ispreview = False b.set_relief(gtk.RELIEF_NONE) return b def read(self): if config.global_config["eco"] and self.config["pronunciacion"]: print "Leyendo el Pulsador [%s]...\t" % self.config["nombre"] self.player.read_text(self.config["pronunciacion"]) if not (self.ispreview or self.ismini): out = config.base.out iter = out["texto"].get_end_iter() end = iter.copy() text = self.config["nombre"] mensaje = out["texto"].get_text(out["texto"].get_start_iter(),end) #check last character if config.global_config["selfspace"] and len(mensaje) > 2: last_char = mensaje[-2] elif len(mensaje) > 1: last_char = mensaje[-1] else: last_char = '.' if text.startswith('.'): result = iter.backward_chars(1) out["texto"].delete(iter,end) elif self.config["nombre"].startswith("-"): result = iter.backward_chars(self.config["nombre"].count('-')) text = text.replace('-','') out["texto"].delete(iter,end) elif self.config["nombre"].startswith("+"): result = iter.backward_chars(self.config["nombre"].count('+')) text = text.replace('+','') else: w, h = out["layout"].get_size() m = self.mini() out["imagenes"].append(m) out["layout"].put(m, ((len(out["imagenes"]) - 1) * 100) % w, (((len(out["imagenes"]) - 1) * 100) / w)*100) #add space to the end if config.global_config["selfspace"] and not text.endswith(' '): text = text + ' ' #capitalize if new phrase if last_char == '.': text = text.capitalize() #insert text out["texto"].insert(iter, text) #bach to the father if config.base.current_is_child(): config.base.retroceder() def play(self): if self.config["sonido"]: print "Reproduciendo archivo de audio del Pulsador [%s]...\t" % self.config["nombre"] self.player.play_audio(self.config["sonido"]) if not (self.ispreview or self.ismini): out = config.base.out w, h = out["layout"].get_size() out["texto"].insert(out["texto"].get_end_iter(), " #" + self.config["nombre"] + "# ") m = self.mini() out["imagenes"].append(m) out["layout"].put(m, ((len(out["imagenes"]) - 1) * 100) % w , (((len(out["imagenes"]) - 1) * 100) / w)*100) if config.base.current_is_child(): config.base.retroceder() def close(self): if not (self.ispreview or self.ismini): config.base.cerrar_mosaico(None) def exit(self): if not (self.ispreview or self.ismini): config.base.salir(None) def fullscreen(self): if not (self.ispreview or self.ismini): config.base.pantalla_completa(None) def goto(self): if not (self.ispreview or self.ismini) and self.config["enlace_a_mosaico"]: try: relative = os.path.join(self.path, os.path.split(self.config["enlace_a_mosaico"])[1]) except: print "Error de redireccionamiento" else: if os.path.exists(self.config["enlace_a_mosaico"]): print "Abriendo mosaico %s..." % os.path.split(self.config["enlace_a_mosaico"])[1] config.base.abrir(None, self.config["enlace_a_mosaico"], config.base.get_current_opened()) elif os.path.exists(relative): print "Abriendo mosaico %s..." % os.path.split(relative)[1] config.base.abrir(None, relative, config.base.get_current_opened()) else: aviso = gtk.Dialog(_('Aviso'), None, gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)) mensaje = gtk.Label(_("No se puede acceder al archivo ") + self.config["enlace_a_mosaico"] + _(". Revise que existe y que tiene permisos de lectura.")) mensaje.set_line_wrap(True) aviso.vbox.pack_start(mensaje) aviso.show_all() aviso.run() aviso.destroy() def volup(self): if not (self.ispreview or self.ismini): config.base.volume(+10) def voldown(self): if not (self.ispreview or self.ismini): config.base.volume(-10) def eraseall(self): if not (self.ispreview or self.ismini): config.base.borrar_todo(None) def eraselast(self): if not (self.ispreview or self.ismini): config.base.borrar(None) def send_by_mail(self): if not (self.ispreview or self.ismini): self.enviar_correo() def enviar_correo(self, coding = 'utf-8'): sender = config.global_config["sender_email"] user = config.global_config["usuario"] header = config.global_config["encabezado"] receiver = self.config["mail"] text = config.base.out["texto"].get_text(config.base.out["texto"].get_start_iter(), config.base.out["texto"].get_end_iter()) password = base64.b64decode(config.global_config["password"]) smtpserver = config.global_config["smtpserver"] tls = config.global_config["tls"] if sender and password and smtpserver: aviso = gtk.Dialog(_('Aviso'), None, gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_CLOSE)) mensaje = gtk.Label(_("El siguiente mensaje se enviará automáticamente en 5 segundos")) de = gtk.Label(_("DE:")+sender) de.set_alignment(0, 0) para = gtk.Label(_("PARA:")+receiver) para.set_alignment(0, 0) asunto = gtk.Label(_("ASUNTO:")+header) asunto.set_alignment(0, 0) contenido = gtk.Label(text) contenido.set_alignment(0, 0) logoad = gtk.Image() iconad = aviso.render_icon(gtk.STOCK_DIALOG_WARNING, 1) aviso.set_icon(iconad) aviso.vbox.pack_start(mensaje) aviso.vbox.pack_start(gtk.HSeparator()) aviso.vbox.pack_start(de) aviso.vbox.pack_start(para) aviso.vbox.pack_start(asunto) aviso.vbox.pack_start(contenido) aviso.show_all() timer = gobject.timeout_add(5000, aviso.destroy) response = aviso.run() if response == gtk.RESPONSE_CLOSE: gobject.source_remove(timer) aviso.destroy() return 0 else: aviso.destroy() import smtplib from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate body = unicode(text, 'utf-8') msg = MIMEText(body.encode(coding), 'plain', coding) msg['From'] = sender msg['To'] = receiver msg['Date'] = formatdate(localtime=1) msg['Subject'] = Header(header, coding) # la 'ñ' no se puede codificar en ASCII try: server = smtplib.SMTP(smtpserver) except: print "Fallo al conectar al servidor SMTP '%s'" % smtpserver return 0 else: server.set_debuglevel(1) server.ehlo(sender) if tls: server.starttls() server.ehlo(sender) try: server.login(user, password) except: print u"Fallo de autenticación" return 0 else: server.sendmail(sender, receiver, msg.as_string()) server.quit() return 1 else: aviso = gtk.Dialog(_('Aviso'), None, gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_CLOSE)) mensaje = gtk.Label(_(u"No ha configurado aún las opciones de correo saliente.")) aviso.vbox.pack_start(mensaje) aviso.run() aviso.show_all() aviso.destroy() class Propiedades: def __init__(self, p): self.pulsador_original = p self.pulsador = p.preview() self.window = gtk.Dialog(_("Propiedades del Pulsador"), None, gtk.DIALOG_MODAL, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) self.window.set_has_separator(True) contenedor=gtk.Table(5, 4, False) contenedor.set_row_spacing(3, 5) contenedor.set_row_spacing(4, 20) name=gtk.Label(_("Nombre")) image=gtk.Label(_("Imagen")) fondo=gtk.Label(_("Color de fondo")) texto=gtk.Label(_("Color del texto")) accion=gtk.Label(_(u"Acción")) self.campo= gtk.Label("") self.entryname = gtk.Entry() self.entryname.set_text(p.config["nombre"]) self.entry = gtk.Entry() self.entryimage = gtk.Entry() self.entryimage.set_text(p.config["imagen"]) liststore = gtk.ListStore(str, str) self.combobox = gtk.ComboBox(liststore) for a, d in p.actions.iteritems(): liststore.append([a, d]) #action = gtk.CellRendererText() #self.combobox.pack_start(action, True) #self.combobox.add_attribute(action, 'text', 0) desc = gtk.CellRendererText() self.combobox.pack_start(desc, True) self.combobox.add_attribute(desc, 'text', 1) i = 0 for a in self.combobox.get_model(): if a[0] == p.config["action"]: self.combobox.set_active(i) break i += 1 self.combobox.connect("changed", self.action_changed) self.ex=gtk.Button(_("Examinar")) self.ex.connect("clicked", self.buscar_archivo) ex2=gtk.Button(_("Examinar")) ex2.connect("clicked", self.buscar_imagen) self.fontbutton = gtk.FontButton("%s %d" %(p.config["tipo_letra"], p.config["size_letra"])) self.fontbutton.set_use_font(True) self.fontbutton.set_title('Fuente') self.colorfont = gtk.ColorButton(color=p.get_colormap().alloc_color(p.config["color_letra"])) self.colorback = gtk.ColorButton(color=p.get_colormap().alloc_color(p.config["color_fondo"])) adj = gtk.Adjustment(p.config["escalado_imagen"], 1.0, 10.0, 1.0, 1.0, 0.0) self.hscale = gtk.HScale(adj) self.hscale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) self.hscale.set_digits(0) self.hscale.connect("value-changed", self.actualizar) self.entryname.connect("focus-out-event", self.actualizar) #primera columna contenedor.attach(self.pulsador, 0, 1, 0, 5, gtk.SHRINK|gtk.FILL, gtk.SHRINK, 10, 10) contenedor.attach(texto, 0, 1, 4, 5, gtk.SHRINK, gtk.SHRINK, 0, 0) #seguna columna contenedor.attach(name, 1, 2, 0, 1, gtk.SHRINK|gtk.FILL, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(accion, 1, 2, 1, 2, gtk.SHRINK|gtk.FILL, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(self.campo, 1, 2, 2, 3, gtk.SHRINK|gtk.FILL, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(image, 1, 2, 3, 4, gtk.SHRINK|gtk.FILL, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(self.colorfont, 1, 2, 4, 5, gtk.SHRINK, gtk.SHRINK, 0, 0) #tercera columna contenedor.attach(self.entryname, 2, 3, 0, 1, gtk.EXPAND|gtk.SHRINK|gtk.FILL, gtk.EXPAND|gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(self.combobox, 2, 4, 1, 2, gtk.EXPAND|gtk.SHRINK|gtk.FILL, gtk.EXPAND|gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(self.entry, 2, 3, 2, 3, gtk.EXPAND|gtk.SHRINK|gtk.FILL, gtk.EXPAND|gtk.SHRINK|gtk.FILL, 0, 0) #contenedor.attach(self.entryimage, 2, 3, 3, 4, gtk.SHRINK|gtk.FILL, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(self.hscale, 2, 3, 3, 4, gtk.EXPAND|gtk.SHRINK|gtk.FILL, gtk.EXPAND|gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(fondo, 2, 3, 4, 5, gtk.SHRINK, gtk.SHRINK, 0, 0) #cuarta columna contenedor.attach(self.fontbutton, 3, 4, 0, 1, gtk.SHRINK, gtk.SHRINK, 0, 0) contenedor.attach(self.ex, 3, 4, 2, 3, gtk.SHRINK, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(ex2, 3, 4, 3, 4, gtk.SHRINK, gtk.SHRINK|gtk.FILL, 0, 0) contenedor.attach(self.colorback, 3, 4, 4, 5, gtk.SHRINK, gtk.SHRINK, 0, 0) self.window.vbox.pack_start(contenedor) contenedor.show_all() self.window.move(150,150) self.action_changed(None) response = self.window.run() if response == gtk.RESPONSE_ACCEPT: self.guardar() elif response == gtk.RESPONSE_APPLY: self.guardar() elif response == gtk.RESPONSE_CANCEL: pass self.window.destroy() def action_changed(self, widget): model = self.combobox.get_model() action = model[self.combobox.get_active()][0] if action == "read": self.campo.set_text(_(u"Pronunciación")) self.entry.set_text(self.pulsador.config["pronunciacion"]) self.campo.set_sensitive(True) self.entry.set_sensitive(True) self.ex.hide() elif action == "play": self.campo.set_text(_("Sonido")) self.entry.set_text(self.pulsador.config["sonido"]) self.campo.set_sensitive(player.pymedia_installed) self.entry.set_sensitive(player.pymedia_installed) self.ex.set_sensitive(player.pymedia_installed) self.ex.show() elif action == "close" or action == "exit" or action == "fullscreen" \ or action == "eraseall" or action == "eraselast" \ or action == "volup" or action == "voldown": self.campo.set_text("") self.entry.set_text("") self.campo.set_sensitive(False) self.entry.set_sensitive(False) self.ex.hide() elif action == "goto": self.campo.set_text(_("Mosaico")) self.entry.set_text(self.pulsador.config["enlace_a_mosaico"]) self.campo.set_sensitive(True) self.entry.set_sensitive(True) self.ex.show() elif action == "send_by_mail": self.campo.set_text(_("Correo")) self.entry.set_text(self.pulsador.config["mail"]) self.campo.set_sensitive(True) self.entry.set_sensitive(True) self.ex.hide() self.actualizar(None) def update_preview_cb(self, file_chooser, preview): filename = file_chooser.get_preview_filename() try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 256, 256) preview.set_from_pixbuf(pixbuf) have_preview = True except: have_preview = False file_chooser.set_preview_widget_active(have_preview) def guardar(self): self.actualizar(None) self.pulsador_original.config = self.pulsador.config self.pulsador_original.aplicar_formato() def actualizar(self, event, o = None): model = self.combobox.get_model() action = model[self.combobox.get_active()][0] fuente=(self.colorfont.get_color().red, self.colorfont.get_color().green,self.colorfont.get_color().blue) fondo=(self.colorback.get_color().red, self.colorback.get_color().green,self.colorback.get_color().blue) if action == "read": self.pulsador.modificar_boton(pronunciacion=self.entry.get_text()) elif action == "play": self.pulsador.modificar_boton(sonido=self.entry.get_text()) elif action == "send_by_mail": self.pulsador.modificar_boton(mail=self.entry.get_text()) elif action == "goto": self.pulsador.modificar_boton(enlace_a_mosaico=self.entry.get_text()) icon=self.entryimage.get_text() if icon and os.path.exists(icon) and not os.path.splitext(os.path.split(icon)[1])[0] in self.pulsador.actions.keys(): pass elif action == "read" and not self.pulsador.config["action"] == "read": icon = "" print "no image" else: icon = "/usr/share/pixmaps/%s.png" % action self.pulsador.modificar_boton(action=action, nombre=self.entryname.get_text(), imagen=icon, tipo_letra=self.fontbutton.get_font_name()[:-2], tamano_letra=int(self.fontbutton.get_font_name()[-2:]), escalado=int(self.hscale.get_value()), color_fondo=fondo, color_letra=fuente) #self.window.reshow_with_initial_size() def buscar_archivo(self, widget): model = self.combobox.get_model() action = model[self.combobox.get_active()][0] if action == "play": file = self.examinar("Audio") if file: self.entry.set_text(file) self.pulsador.modificar_boton(sonido=self.entry.get_text()) elif action == "goto": file = self.examinar("Mosaico") if file: self.entry.set_text(file) self.pulsador.modificar_boton(enlace_a_mosaico=self.entry.get_text()) def buscar_imagen(self, widget): file = self.examinar("Image") if file: self.entryimage.set_text(file) self.pulsador.modificar_boton(imagen=self.entryimage.get_text()) def examinar(self, tipo): selected = None #Filtro para imagenes imagefilter = gtk.FileFilter() imagefilter.set_name(_("Imagenes")) imagefilter.add_mime_type("image/png") imagefilter.add_mime_type("image/jpeg") imagefilter.add_mime_type("image/gif") imagefilter.add_pattern("*.png") imagefilter.add_pattern("*.jpg") imagefilter.add_pattern("*.gif") #imagefilter.add_pattern("*.tif") #imagefilter.add_pattern("*.xpm") #Filtro para audio audiofilter = gtk.FileFilter() audiofilter.set_name(_("Audio")) audiofilter.add_mime_type("audio/mp3") audiofilter.add_mime_type("audio/ogg") audiofilter.add_pattern("*.mp3") audiofilter.add_pattern("*.ogg") #Filtro para mosaicos mosfilter = gtk.FileFilter() mosfilter.set_name(_("Mosaicos")) mosfilter.add_pattern("*.mos") if tipo == "Image": title =_("Seleccione una imagen") chooser = gtk.FileChooserDialog(title,action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) chooser.add_filter(imagefilter) preview = gtk.Image() chooser.set_preview_widget(preview) chooser.connect("update-preview", self.update_preview_cb, preview) chooser.set_current_folder(config.global_config["im_dir"]) elif tipo == "Audio": title=_("Seleccione un archivo de audio") chooser = gtk.FileChooserDialog(title,action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) chooser.add_filter(audiofilter) chooser.set_current_folder(config.global_config["aud_dir"]) elif tipo == "Mosaico": title=_("Seleccione una mosaico") chooser = gtk.FileChooserDialog(title,action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) chooser.add_filter(mosfilter) chooser.set_current_folder(config.global_config["mos_dir"]) chooser.set_default_response(gtk.RESPONSE_OK) response = chooser.run() if response == gtk.RESPONSE_OK: selected = chooser.get_filename() if tipo == "Image": selected = self.redimensionar(selected) elif response == gtk.RESPONSE_CANCEL: pass else: print _(u"Opción desconocida") chooser.destroy() return selected def redimensionar(self, picture): size = config.global_config["resolucion_maxima"],config.global_config["resolucion_maxima"] quality = Image.ANTIALIAS path = config.temp_dir thumbnail = picture if os.path.exists(picture): im = Image.open(picture) im.thumbnail(size, quality) thumbnail = os.path.join(path, ("thumbnail_" + str(randint(1, 10**6)) + '.png')) while os.path.exists(thumbnail): thumbnail = os.path.join(path, ("thumbnail_" + str(randint(1, 10**6)) + '.png')) im.save(thumbnail, "PNG") del im return thumbnail