Guest User

Son Link

a guest
Feb 17th, 2010
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.89 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # RedImages
  4. # (c) 2009 Son Link <[email protected]>
  5. # Under GNU/GPL v3 licence
  6.  
  7. import pygtk
  8.  
  9. import gtk
  10. import gtk.glade
  11. import sys
  12. import time
  13. import gobject
  14. import re
  15. import Image
  16. import gettext
  17. import os
  18.  
  19. # Algunas cosas para gettext (para las traducciones)  
  20. APP="RedImages"  
  21. DIR="po"  
  22. # Esto permite traducir los textos escritos en el .py (no en glade)  
  23. gettext.textdomain(APP)  
  24. gettext.bindtextdomain(APP, DIR)  
  25.    
  26. # Y las siguientes 2 lineas permiten traducir los textos del Glade  
  27. gtk.glade.textdomain(APP)  
  28. gtk.glade.bindtextdomain(APP, DIR)  
  29.    
  30. # Y con esto podemos marcar las cadenas a traducir de la forma _("cadena")  
  31. _ = gettext.gettext
  32.  
  33. class gui:
  34.     def __init__(self):
  35.         # Esta es la funci�n principal
  36.         # En esta variable simplemente guardamos un numero el cual indicara si al encontrar ur archivo con un nombre
  37.         # se a respondido si se sobreescriben todos (1) o no (2)
  38.         self.overwrite = 0
  39.         # Nota: los comentarios que terminan en * son partes que quedan por terminar de implementar
  40.         self.glade = gtk.glade.XML("redi_images_3.glade")
  41.         dic =( { "on_mainwin_destroy": self.destroy,
  42.         "on_add_button_clicked": self.add,
  43.         "on_conv_button_clicked": self.resize,
  44.         "on_cancel_button_clicked": self.destroy,
  45.         "on_add_dialog_button_clicked": self.act_list,
  46.         "on_cancel_dialog_button_clicked": self.close_add_img,
  47.         "on_sel_res_changed": self.redi,
  48.         "on_del_all_button_clicked": self.clear_all,
  49.         "on_sel_dir_des_selection_changed": self.change_dir,
  50.         "on_button1_clicked": self.close_dialogs,
  51.         "on_del_button_clicked": self.delete,
  52.         "on_view_info_clicked": self.view_info,
  53.         } )
  54.         self.glade.signal_autoconnect(dic)
  55.         # Indicamos cual sera el valor por defecto del combobox
  56.         combobox = self.glade.get_widget("sel_res").set_active(0)
  57.         # En esta variable iremos guardando la ultima posicion de la lista para ir actualizando
  58.         # Creamos la tabla donde se mostraran los archivos que se procesaran
  59.         self.liststore = self.glade.get_widget("file_list")
  60.         self.model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
  61.         self.liststore.set_model(self.model)
  62.         self.liststore.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
  63.         # La lista con el nombre de los archivos
  64.         render=gtk.CellRendererText()
  65.         column1=gtk.TreeViewColumn(_("Imagen"),render, text=1)
  66.         self.liststore.append_column(column1)
  67.         # Si le pasamos imagenes como parametros (bien mediante consola o a traves de algun gestor de archivos)
  68.         # se a�adiran al listado automaticamente
  69.         if len(sys.argv[1:]) >= 1:
  70.             for s in sys.argv[1:]:
  71.                 try :
  72.                     Image.open(s)
  73.                     self.model.append((0, s))
  74.                 except:
  75.                     pass
  76.        
  77.     def redi(self, widget):
  78.         # Esta funcion se encarga de mostrar o no la caja horizontal que contiene las cajas de tama�o manual
  79.         if widget.get_active_text() == _("Other"):
  80.             self.glade.get_widget("hbox4").show()
  81.         else:
  82.             self.glade.get_widget("hbox4").hide()
  83.        
  84.     def resize(self, widget):
  85.         # esta funcion se encarga de llamar cada vez que se necsesite a las funcion encargada de ir rellenando la barra de progreso
  86.         # Obtenemos los valores
  87.         self.i = 0
  88.         self.progressbar = self.glade.get_widget("progress")
  89.         task = self.progressbar_f()
  90.         if gobject.idle_add(task.next):
  91.             self.i += 1
  92.        
  93.     def add(self, widget):
  94.         # Esta funcion se encarga simplemente de a�adir imagenes al programa
  95.         addimg = self.glade.get_widget("add_img")
  96.         filter = gtk.FileFilter()
  97.         filter.set_name(_("Images"))
  98.         filter.add_mime_type("image/png")
  99.         filter.add_mime_type("image/jpeg")
  100.         filter.add_mime_type("image/gif")
  101.         filter.add_pattern("*.png")
  102.         filter.add_pattern("*.jpg")
  103.         filter.add_pattern("*.gif")
  104.         filter.add_pattern("*.tif")
  105.         filter.add_pattern("*.xpm")
  106.         filter.add_pattern("*.bpm")
  107.         addimg.add_filter(filter)
  108.         addimg.show()
  109.  
  110.     def act_list(self, widget):
  111.         # esta funcion se encarga de actualizar la lista segun se a�aden imagenes
  112.         addimg = self.glade.get_widget("add_img")
  113.         addimg.hide()
  114.         for s in addimg.get_filenames():
  115.             self.model.append((0, s))
  116.        
  117.     def progressbar_f(self):
  118.         # Esta funcion es la encargada tanto de comverit el video como de actualizar la barra de progeso
  119.         i = 1
  120.         total = 0
  121.         # El siguiente trozo de codigo cuanta cuantas imagenes hay listadas en el programa
  122.         treeiter = self.model.get_iter_first()
  123.         while (treeiter != None):
  124.             total += 1
  125.             treeiter = self.model.iter_next(treeiter)
  126.        
  127.         # Si la barra de progreso esta llena de un proceso anterior se pone a 0
  128.         if self.progressbar.get_fraction() == 1.0:
  129.             self.progressbar.set_fraction(0.0)
  130.        
  131.         treeiter = self.model.get_iter_first()
  132.         # Este bucle se encarga de hacer todo el proceso
  133.         while (treeiter != None):
  134.             imagen = self.model.get_value(treeiter, 1)
  135.             self.dir = self.glade.get_widget("sel_dir_des").get_filename()
  136.             time.sleep(1.0)
  137.             name = os.path.splitext(imagen)[0]
  138.             ext = os.path.splitext(imagen)[1]
  139.             name = re.split("/", name)
  140.             file = self.name(name[-1], i, ext)
  141.             #Ahora se llama a la funci�n de escalar
  142.             dest_file = self.dir+'/'+file
  143.             compfile = self.comp_file(dest_file)
  144.             if self.overwrite == 0:
  145.                 if compfile:
  146.                     self.scale(imagen, dest_file)
  147.                     treeiter = self.model.iter_next(treeiter)
  148.                 elif compfile == False:
  149.                     pass
  150.                 elif compfile == -1:   
  151.                     quit()
  152.             elif self.overwrite == 1:
  153.                 self.scale(imagen, dest_file)
  154.                 treeiter = self.model.iter_next(treeiter)
  155.             elif self.overwrite == 2:
  156.                 pass
  157.            
  158.             porcion = 1.0 / total
  159.             porcentaje = round(porcion*i,2)
  160.             self.progressbar.pulse()
  161.             self.progressbar.set_fraction(porcentaje)
  162.             i += 1
  163.             yield True
  164.         yield False
  165.        
  166.     def name(self, *args):
  167.         # Esta funcion es la encargada de renombrar los ficheros de salida segun los parametros que se le pasen
  168.         date = time.strftime("%Y%m%d%H%M%S")
  169.         re_name = self.glade.get_widget("name_entry").get_text()
  170.         re_name = re.sub('%N', args[0], re_name)
  171.         re_name = re.sub('%n', str(args[1]), re_name)
  172.         re_name = re.sub('%d', date, re_name)
  173.         print re_name + args[2]
  174.         return re_name + args[2]
  175.    
  176.     def scale (self, fname, fname_scaled):
  177.         # Esta funcion es la encargada de redimensionar las imagenes
  178.         print fname_scaled
  179.         try:
  180.             img = Image.open(fname)
  181.         except:
  182.             return False
  183.        
  184.         if self.glade.get_widget("sel_res").get_active() == 3:
  185.             try:
  186.                 height = int(self.glade.get_widget("height").get_text())
  187.                 width = int(self.glade.get_widget("width").get_text())
  188.             except:
  189.                 print 'ERROR: Debe de indicar el nacho y el alto'
  190.         else:
  191.             size = self.glade.get_widget("sel_res").get_active_text().split('x')
  192.             width = int(size[0])
  193.             height = int(size[1])
  194.            
  195.         if self.glade.get_widget("checkbutton1").get_active():
  196.             if width > height:
  197.                 height = width * img.size[1] / img.size[0]
  198.             elif width < height:
  199.                 width = height * img.size[0] / img.size[1]
  200.                
  201.         img = img.resize((width, height), Image.ANTIALIAS)
  202.         try:
  203.             img.save(fname_scaled)
  204.             return True
  205.         except:
  206.             return False
  207.    
  208.     def comp_file(self, file):
  209.         # Esta funcion comprueba si ya existe un fichero con el mismo nombre
  210.         try:
  211.             f = open(file, 'r')
  212.             comp_file = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_YES_NO, message_format="Error!!")
  213.             comp_file.format_secondary_text("The file %f exists\n Overwrite??")
  214.             comp_file.add_buttons("Yes to all", 100, "No to all", 101, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
  215.             comp_file.show()
  216.                
  217.             def close(w, res):
  218.                 if res == gtk.RESPONSE_NO:
  219.                     return False
  220.                     w.hide()
  221.                 elif res == gtk.RESPONSE_YES:
  222.                     return True
  223.                     w.hide()
  224.                 elif res == 100:
  225.                     w.hide()
  226.                     self.overwrite = 1
  227.                 elif res == 101:
  228.                     print 'no a todo'
  229.                     w.hide()
  230.                     self.overwrite = 2
  231.                 elif res == gtk.RESPONSE_CANCEL:
  232.                     return -1
  233.                     w.hide()
  234.             comp_file.connect("response", close)           
  235.         except:
  236.             return -3
  237.        
  238.        
  239.     def change_dir(self, widget):
  240.         self.dir = widget.get_filename()
  241.    
  242.     def delete(self, widget):
  243.         # Esta funcion borra de la lista los campos seleccionados
  244.         selection = self.liststore.get_selection()
  245.         selected_rows = selection.get_selected_rows()[1]
  246.         args = [(self.model.get_iter(path)) for path in selected_rows]
  247.         for iter in args:
  248.             self.model.remove(iter)
  249.    
  250.     def clear_all(self, widget):
  251.         # Esta funcion borra el listado entero
  252.         self.model.clear()
  253.        
  254.     def view_info(self, widget):
  255.         # esta funcion se limita a mostrar y cerrar el dialogo de la info
  256.         info = self.glade.get_widget("aboutdialog1")
  257.         info.show()
  258.         def close(w, res):
  259.             if res == gtk.RESPONSE_CANCEL:
  260.                 w.hide()
  261.        
  262.         print res
  263.         info.connect("response", close)
  264.  
  265.                        
  266.     def close_dialogs(self, widget):
  267.         widget.hide()
  268.        
  269.     def close_add_img(self, widget):
  270.         self.glade.get_widget("add_img").hide()
  271.        
  272.     def destroy(self, widget):
  273.         # Borra la ventana principal y por lo tanto cierra el programa
  274.         gtk.main_quit()
  275.  
  276. if __name__ == "__main__":
  277.     gui()
  278.     gtk.main()
  279.  
Advertisement
Add Comment
Please, Sign In to add comment