viernes, 31 de enero de 2014

Convertir imagenes a otro formato

   Quiero usar archivos .py como módulos donde lo que tenga almacenado sean imágenes en formato xpm para añadirlas a futuras aplicaciones GtkBuilder con python. Este formato de imagen se puede abrir con editores de textos para ver realmente como está formado.

  Así que me he puesto a buscar un script en bash para hacer  la conversión mas fácil, ya que tengo la herramienta "convert" instalada que es:

Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org

He visto varios scripts, y el que me ha convencido es el ofrecido en esta página:
TuxyLinux

El codigo es el siguiente:


#!/bin/bash
 
if [[ -z $@ ]] ; then
  echo -e "Convierte todas las imágenes de la carpeta.
  Uso:
    sh $0 extension-original extension-nueva
 
  Ejemplo:
    sh $0 tga png"
  exit 1
fi
 
ORIGINAL=$1  #extension original
FORMATO=$2   #nueva extension
 
mkdir ${FORMATO}
 
for A in `ls *.${ORIGINAL}` ; do
  convert ${A} ${A}.${FORMATO}
done
 
for A in `ls *.${ORIGINAL}.${FORMATO}` ; do
  NAME=`echo ${A} |cut -d '.' -f1`
  mv ${A} ${FORMATO}/${NAME}.${FORMATO}
done


Lo copio a un archivo que llamo imgcon, le doy permisos de ejecucion

chomod +x imgconv

y luego lo meto en /usr/bin para poder ejecutarlo desde cualquier directorio.

Hecho esto, solo hay que ejecutarlo pasando el formato origen y el destino, así yo creo todos los png a xpm de esta forma

imgcon pcg xpm

y el archivo me crea un subdirectorio desde donde lo ejecute con el nombre de la extensión de los nuevos archivos creados, mas fácil imposible :).

jueves, 30 de enero de 2014

Uso de GTK3 con python y Glade

Estaba haciendo unas pruebas de edición en el glade, cuando me ha dado el siguiente error:


**
Gtk:ERROR:/build/buildd/gtk+2.0-2.24.10/gtk/gtknotebook.c:1167:gtk_notebook_buildable_add_child: assertion failed: (page != NULL)
Abortado (`core' generado)

Eso ha sucedido una vez que he añadido el control gtknotebook, y pensando que podría ser problema de versión del gtk he decidido probar GTK3, para ello lo único que he tenido que cambiar en el código de prueba es lo siguiente:

import gtk

sustituirlo por

from gi.repository import Gtk

y mas abajo en el codigo, sustituir el encabezado de los metodos por Gtk en vez de gtk, ejemplo:

gtk.main_quit()
builder = gtk.Builder()
gtk.main()

por estos

Gtk.main_quit()
builder = Gtk.Builder()
Gtk.main()

Como se ve, la diferencia es mínima, lo he corrido y Ohhhhhhh!


**
Gtk:ERROR:/build/buildd/gtk+3.0-3.4.2/./gtk/gtknotebook.c:1234:gtk_notebook_buildable_add_child: assertion failed: (page != NULL)
Abortado (`core' generado)

como ven, el problema no era por la versión utilizada, así que al seguir mirando y como no, gracias a goolge, la solución era mas fácil de lo que pensaba, solo hay que añadir algo a alguna de las paginas del notebook, con eso ya no da ese feo Gtk:ERROR

Salu2 Sierra21

GtkBuilder + Glade sin libglade

   Hola, empiezo aquí a dejar mis apuntes, recetas o como  quiera llamarse, y empiezo por describir como hacer un ejemplo muy simple de programa en python, usando GTK mas Glade, vamos a ello.

  La versión que uso de Glade es la 3.8.0, aunque tengo también instalada la 3.12.1 que es para GTK3 pero da algunos problemas, como las cajas creadas con GtkVBox o GtkHBox, pues crea GtkBox, también pasa lo mismo con los controles  GtkHButtonBox y GtkVButtonBox, crando GtkButtonBox. Dicho esto vamos al lío.

   Uso el editor geany, que ha sido una grata sorpresa por lo liviano y rápido que es, además de tener para mi lo necesario. Eclipse esta bien, pero desde que tengo genay, casi no lo uso.

  Para empezar, creo el código fuente del programa, algo básico como esto:

  
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import gtk

class gui:
    #
    #          METODOS DE RETROLLAMADA
    #------------------------------------
    def hola(self, widget):
        print "Hola!!!"

    def destroy(self, widget):
        gtk.main_quit()


    def __init__(self):
    #
    #        CDIGO DE CONSTRUCCION DE GUI
    #-----------------------------------------------
        filename = "foo.glade"
        builder = gtk.Builder()
        builder.add_from_file(filename)
        builder.connect_signals(self)

    #
    # En espea de eventos y acciones usuario
    #

    def main(self):
        gtk.main()

if __name__ == "__main__":
    gui_instance = gui()       # crea un objeto gu
    gui_instance.main()        # llama al mtodo principal 


A continuación creo la parte gráfica con glade. A tener en cuenta que hay que configurar la salida del formato para GtkBuilder y no para libglade. Y también que cuando creemos la ventana principal, ir a las propiedades comunes para hacer visible la ventana, ya que sin esto el programa se ejecuta pero no mostraría la ventana.

  Creo la ventana principal, en sus propiedades, en señales busco la opcion destroy y la asocio con el método destroy, y en comunes, la hago visible. A continuación creo un caja vertical de dos porciones, una para cada botón. Los creo y les pongo nombre en la propiedad etiqueta, busco la señal clicked y la asocio con el botón llamado Salir en su señal destroy, al otro lo asocio su señal clicked con hola, para mostrar el Hola!!! por consola.

   Así de fácil, crear los métodos o funciones para cada evento o acción realizada por el usuario y conectarlas por su nombre en glade en la sección señales de los controles usados.

  En cuanto al uso de Glade 3.12.1, lo intercambio con 3.8.0 , pues no puedo crear cajas en el, o bien si se crean después hay que ir a editar el archivo en cuestión y añadirles la V o la H que corresponda.

Salu2 Sierra21