Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # RedImages
- # (c) 2009 Son Link <[email protected]>
- # Under GNU/GPL v3 licence
- import pygtk
- import gtk
- import gtk.glade
- import sys
- import time
- import gobject
- import re
- import Image
- import gettext
- import os
- # Algunas cosas para gettext (para las traducciones)
- APP="RedImages"
- DIR="po"
- # Esto permite traducir los textos escritos en el .py (no en glade)
- gettext.textdomain(APP)
- gettext.bindtextdomain(APP, DIR)
- # Y las siguientes 2 lineas permiten traducir los textos del Glade
- gtk.glade.textdomain(APP)
- gtk.glade.bindtextdomain(APP, DIR)
- # Y con esto podemos marcar las cadenas a traducir de la forma _("cadena")
- _ = gettext.gettext
- class gui:
- def __init__(self):
- # Esta es la funci�n principal
- # En esta variable simplemente guardamos un numero el cual indicara si al encontrar ur archivo con un nombre
- # se a respondido si se sobreescriben todos (1) o no (2)
- self.overwrite = 0
- # Nota: los comentarios que terminan en * son partes que quedan por terminar de implementar
- self.glade = gtk.glade.XML("redi_images_3.glade")
- dic =( { "on_mainwin_destroy": self.destroy,
- "on_add_button_clicked": self.add,
- "on_conv_button_clicked": self.resize,
- "on_cancel_button_clicked": self.destroy,
- "on_add_dialog_button_clicked": self.act_list,
- "on_cancel_dialog_button_clicked": self.close_add_img,
- "on_sel_res_changed": self.redi,
- "on_del_all_button_clicked": self.clear_all,
- "on_sel_dir_des_selection_changed": self.change_dir,
- "on_button1_clicked": self.close_dialogs,
- "on_del_button_clicked": self.delete,
- "on_view_info_clicked": self.view_info,
- } )
- self.glade.signal_autoconnect(dic)
- # Indicamos cual sera el valor por defecto del combobox
- combobox = self.glade.get_widget("sel_res").set_active(0)
- # En esta variable iremos guardando la ultima posicion de la lista para ir actualizando
- # Creamos la tabla donde se mostraran los archivos que se procesaran
- self.liststore = self.glade.get_widget("file_list")
- self.model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
- self.liststore.set_model(self.model)
- self.liststore.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
- # La lista con el nombre de los archivos
- render=gtk.CellRendererText()
- column1=gtk.TreeViewColumn(_("Imagen"),render, text=1)
- self.liststore.append_column(column1)
- # Si le pasamos imagenes como parametros (bien mediante consola o a traves de algun gestor de archivos)
- # se a�adiran al listado automaticamente
- if len(sys.argv[1:]) >= 1:
- for s in sys.argv[1:]:
- try :
- Image.open(s)
- self.model.append((0, s))
- except:
- pass
- def redi(self, widget):
- # Esta funcion se encarga de mostrar o no la caja horizontal que contiene las cajas de tama�o manual
- if widget.get_active_text() == _("Other"):
- self.glade.get_widget("hbox4").show()
- else:
- self.glade.get_widget("hbox4").hide()
- def resize(self, widget):
- # esta funcion se encarga de llamar cada vez que se necsesite a las funcion encargada de ir rellenando la barra de progreso
- # Obtenemos los valores
- self.i = 0
- self.progressbar = self.glade.get_widget("progress")
- task = self.progressbar_f()
- if gobject.idle_add(task.next):
- self.i += 1
- def add(self, widget):
- # Esta funcion se encarga simplemente de a�adir imagenes al programa
- addimg = self.glade.get_widget("add_img")
- filter = gtk.FileFilter()
- filter.set_name(_("Images"))
- filter.add_mime_type("image/png")
- filter.add_mime_type("image/jpeg")
- filter.add_mime_type("image/gif")
- filter.add_pattern("*.png")
- filter.add_pattern("*.jpg")
- filter.add_pattern("*.gif")
- filter.add_pattern("*.tif")
- filter.add_pattern("*.xpm")
- filter.add_pattern("*.bpm")
- addimg.add_filter(filter)
- addimg.show()
- def act_list(self, widget):
- # esta funcion se encarga de actualizar la lista segun se a�aden imagenes
- addimg = self.glade.get_widget("add_img")
- addimg.hide()
- for s in addimg.get_filenames():
- self.model.append((0, s))
- def progressbar_f(self):
- # Esta funcion es la encargada tanto de comverit el video como de actualizar la barra de progeso
- i = 1
- total = 0
- # El siguiente trozo de codigo cuanta cuantas imagenes hay listadas en el programa
- treeiter = self.model.get_iter_first()
- while (treeiter != None):
- total += 1
- treeiter = self.model.iter_next(treeiter)
- # Si la barra de progreso esta llena de un proceso anterior se pone a 0
- if self.progressbar.get_fraction() == 1.0:
- self.progressbar.set_fraction(0.0)
- treeiter = self.model.get_iter_first()
- # Este bucle se encarga de hacer todo el proceso
- while (treeiter != None):
- imagen = self.model.get_value(treeiter, 1)
- self.dir = self.glade.get_widget("sel_dir_des").get_filename()
- time.sleep(1.0)
- name = os.path.splitext(imagen)[0]
- ext = os.path.splitext(imagen)[1]
- name = re.split("/", name)
- file = self.name(name[-1], i, ext)
- #Ahora se llama a la funci�n de escalar
- dest_file = self.dir+'/'+file
- compfile = self.comp_file(dest_file)
- if self.overwrite == 0:
- if compfile:
- self.scale(imagen, dest_file)
- treeiter = self.model.iter_next(treeiter)
- elif compfile == False:
- pass
- elif compfile == -1:
- quit()
- elif self.overwrite == 1:
- self.scale(imagen, dest_file)
- treeiter = self.model.iter_next(treeiter)
- elif self.overwrite == 2:
- pass
- porcion = 1.0 / total
- porcentaje = round(porcion*i,2)
- self.progressbar.pulse()
- self.progressbar.set_fraction(porcentaje)
- i += 1
- yield True
- yield False
- def name(self, *args):
- # Esta funcion es la encargada de renombrar los ficheros de salida segun los parametros que se le pasen
- date = time.strftime("%Y%m%d%H%M%S")
- re_name = self.glade.get_widget("name_entry").get_text()
- re_name = re.sub('%N', args[0], re_name)
- re_name = re.sub('%n', str(args[1]), re_name)
- re_name = re.sub('%d', date, re_name)
- print re_name + args[2]
- return re_name + args[2]
- def scale (self, fname, fname_scaled):
- # Esta funcion es la encargada de redimensionar las imagenes
- print fname_scaled
- try:
- img = Image.open(fname)
- except:
- return False
- if self.glade.get_widget("sel_res").get_active() == 3:
- try:
- height = int(self.glade.get_widget("height").get_text())
- width = int(self.glade.get_widget("width").get_text())
- except:
- print 'ERROR: Debe de indicar el nacho y el alto'
- else:
- size = self.glade.get_widget("sel_res").get_active_text().split('x')
- width = int(size[0])
- height = int(size[1])
- if self.glade.get_widget("checkbutton1").get_active():
- if width > height:
- height = width * img.size[1] / img.size[0]
- elif width < height:
- width = height * img.size[0] / img.size[1]
- img = img.resize((width, height), Image.ANTIALIAS)
- try:
- img.save(fname_scaled)
- return True
- except:
- return False
- def comp_file(self, file):
- # Esta funcion comprueba si ya existe un fichero con el mismo nombre
- try:
- f = open(file, 'r')
- comp_file = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_YES_NO, message_format="Error!!")
- comp_file.format_secondary_text("The file %f exists\n Overwrite??")
- comp_file.add_buttons("Yes to all", 100, "No to all", 101, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
- comp_file.show()
- def close(w, res):
- if res == gtk.RESPONSE_NO:
- return False
- w.hide()
- elif res == gtk.RESPONSE_YES:
- return True
- w.hide()
- elif res == 100:
- w.hide()
- self.overwrite = 1
- elif res == 101:
- print 'no a todo'
- w.hide()
- self.overwrite = 2
- elif res == gtk.RESPONSE_CANCEL:
- return -1
- w.hide()
- comp_file.connect("response", close)
- except:
- return -3
- def change_dir(self, widget):
- self.dir = widget.get_filename()
- def delete(self, widget):
- # Esta funcion borra de la lista los campos seleccionados
- selection = self.liststore.get_selection()
- selected_rows = selection.get_selected_rows()[1]
- args = [(self.model.get_iter(path)) for path in selected_rows]
- for iter in args:
- self.model.remove(iter)
- def clear_all(self, widget):
- # Esta funcion borra el listado entero
- self.model.clear()
- def view_info(self, widget):
- # esta funcion se limita a mostrar y cerrar el dialogo de la info
- info = self.glade.get_widget("aboutdialog1")
- info.show()
- def close(w, res):
- if res == gtk.RESPONSE_CANCEL:
- w.hide()
- print res
- info.connect("response", close)
- def close_dialogs(self, widget):
- widget.hide()
- def close_add_img(self, widget):
- self.glade.get_widget("add_img").hide()
- def destroy(self, widget):
- # Borra la ventana principal y por lo tanto cierra el programa
- gtk.main_quit()
- if __name__ == "__main__":
- gui()
- gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment