enero 31, 2014

ReportLab: pdfgen - Insertando imágenes en canvas (03)

En ReportLab hay dos formas principales de insertar imágenes: una es usando reportlab.graphics.shapes y la otra es canvas. La diferencia reside en que canvas inserta la imágen en una posición estática, mientras que la otra permite operaciones de rotado, escalado y traslado.

Si nuestro caso es solo insertar una imágen en cierta posición, sin modificarla y usando canvas, está es nuestra opción.


ReportLab: pdfgen - Formas básicas y Texto en canvas (02)

Es esta parte veremos algunas operaciones de texto y creación de formas básicas.



ReportLab: pdfgen - Lo básico de Canvas (01)

PDFGEN es la interfaz más baja para generar PDF. Son secuencias de instrucciones para pintar un documento sobre una secuencia de páginas. El objeto que provee tal operación de pintado es el pdfgen canvas.

El canvas debe ser considerado como un papel con coordenadas x, y cuyo punto de origen es la esquina inferior izquierda. Se incrementa a la derecha y hacia arriba.


ReportLab: Libreria PDF para Python (00)


ReportLab, es una libreria que permite crear directamente documentos en PDF (Formato de Documento Portable) usando Python como lenguaje de programación. También permite crear gráficos en bitmap y vectores.

Me interese sobre ReportLab, debido a su capacidad de generar reportes, ya en el trabajo solicitan crear cantidad de reportes para ser impresos y hacerlo llegar a los clientes. Python es uno de mis lenguajes favoritos, y ReportLab me llamo mucho la atención.

ReportLab, actualmente trabaja con Python 2.7, por lo que la versión 3, tendrá que esperar (talvez este sea uno de los motivos por lo que soy renuente a desechar el 2.7)

Instalación: 

enero 29, 2014

Nuestro propio widget con PyCairo

Estos días estaba jugando con Cairo, debido a la curiosidad de saber de como hacen aquellos widgets que no encuentras en un editor de interfaz. Un ejemplo es el ecualizador de Clementine.

En fin, hay muchas formas de hacerlo, y Cairo me llamo la atención, ya que se integra con Python y GTK. Mi idea fue crear un progress bar algo distinto (sólo con fines de probar), en el cuál si cargaba hasta el 50% se mostrara en rojo, si cargaba hasta el 80% se mostrara en amarillo y el resto en azul. Y al completarse todo la carga, se muestre un texto "100% completo" sobre un fondo degradado:



enero 28, 2014

Test SyntaxHighlighter

Estaba haciendo algunas pruebas con SyntaxHighlighter para publicar código con resaltadores de texto, el cuál es relativamente fácil de instalar. Se puede hacer de dos formas:

1. La primera es descargarse los archivos desde la página http://http://alexgorbatchev.com/SyntaxHighlighter/download/, y subirlos junto a nuestro web. Tenemos que poner esto en la cabecera:





2. Se puede enlazar desde el servidor del autor de la siguiente forma:



Luego donde insertemos el código, podemos hacerlo con la etiqueta pre o script, pero se ha de usar la clase de la siguiente forma:
    

Ahora se muestra el código resaltado

Soporta una gran cantidad de lenguajes, solo es cuestión de añadir el archivo js en el head. Además cuenta con temas.

Por ejemplo aquí muestro código en python:
#!/usr/bin/python
# -*- coding: utf-8 -*- 
import gtk
import glib
import cairo

class App(object):
    def __init__ (self):
        #Variables Iniciales
        self.percent = 0
        
        # Se carga el archivo glade con la ventana
        builder = gtk.Builder()
        builder.add_from_file('Final.ui')
        
        # Se recuperan los widget a usar (no son necesarios todos)
        self.winMain = builder.get_object('window1')
        self.drawingarea = builder.get_object('drawingarea1')
        self.pbBGR = ProgressBarBGR(self.drawingarea)  # INSTANCIAMOS
        
        # Se asocian las señales
        builder.connect_signals(self)
        self.winMain.show()


enero 11, 2014

gtk.gdk.thread_init() cuelga el programa en Windows XP (SOLUCIONADO)

Cuando usamos gtk.gdk.thread_init() con python todo parece genial, corre en plataformas Linux y Windows, pero en este último, no lo hace en todas sus versiones. Hay empresas que hasta el día de hoy siguen usando Windows XP, y es aquí cuando nuestro programa crashea.

La solución es simple, y consultando en el IRC, en vez de usar gtk.gdk.thread_init(), hemos de usar:
import gobject
gobject.thread_init()

Con ello podremos correr nuestros hilos sin problemas :)

enero 10, 2014

Evitar el log file generado por py2exe



Para los que usamos py2exe para crear ejecutables en windows, nos habremos dado cuenta en algún momento, que si nuestro aplicativo cae en error, automaticamente se crea un archivo *.exe.log y se muestra en una ventana similar a esta:


enero 09, 2014

Barra Transparente en Gnome Shell




Para tener la barra transparente en Gnome Shell, basta con editar el css del tema:
cd /usr/share/gnome-shell/theme
sudo nano gnome-shell.css

Ahi buscamos el campo referido a Panel, y remplazamos o agregamos el siguiente código (según sea el caso):
background-color: rgba(0,0,0,0.20);

el último parámetro "0.20" indica cuán transparente será la barra, el valor de 1 indicará: no transparencia.

enero 07, 2014

Notas gtk: Redimensionar ventana cuando una elemento se oculta y es re-mostrado

Por lo general cuando una ventana es lanzada, tiene un tamaño determinado, o bien es de tamaño "Natural", o con un tamaño especificado o con valores default que le podemos asignar.

Sea el caso que tenemos un elemento como un textView con barras de desplazamiento que lo ocultamos y lo mostramos según conveniencia y que nuestra ventana principal tiene valores default (150*50, suponiendo que trabajemos con glade). Lo que sucedera sera lo siguiente:

1. Ventana lanzada con el textView oculto entre el button y el progressbar:


enero 03, 2014

Contar filas en un liststore de GTK con python


Bueno, hay una forma de contar la cantidad de filas de forma directa sin la necesidad de emplear contadores u otros.

Por ejemplo si tenemos un liststore llamada self.milista podemos usar Gtk.TreeModel.iter_n_children, de la siguiente forma:

cantidadFilas = self.milista.iter_n_children(None)


Esta propiedad solicita un elemento iter, que funciona muy bien en un TreeStore, en el que encontramos nodos superiores y nodos hijos (children). En cambio en un ListStore no tenemos los nodos hijos, por tal motivo pasamos el argumento None, para que retorne solo el número de los nodos superiores y ya no el número de nodos hijos que contiene algún iter.