abril 24, 2014

Instalar sublime text en chakra y en otros linux



Primero debemos bajarnos el archivo tar.bz2 de http://www.sublimetext.com/ .

Luego debemos descomprimirlo:

Para 32bit:
tar -jxvf Sublime\ Text\ 2\ 2.0.1.tar.bz2

Para 64bits:
tar -jxvf Sublime\ Text\ 2\ 2.0.1\ x64.tar.bz2

febrero 19, 2014

ReportLab: Gráficos (16)

Está es la última parte de ReportLab, y pueden usarlo, como muchos, con Django. Yo lo uso más en aplicaciones de escritorio, pero donde este Python, ReportLab es una manera fácil de trabajar con pdf.


Por si necesitan alguna función bastante rebuscada, pueden acceder al REFERENCE de ReportLab.

Bien, en cuanto a gráficos, podemos decir que es un subpaquete de ReportLab integrado a este,  veamos como se trabaja con ellos:

  

febrero 18, 2014

ReportLab: Platypus - Sobre las tablas (15)

Las tablas trabajan con un mecanismo de grilla, se ajustan al contenido. Entre sus argumentos principales tenemos:

Table(data, colWidths=None, rowHeights=None, style=None)

La data debe ser texto, instancias de Flowables, una lista o una tupla. colWidths es el ancho de las columnas, asi como el alto sería rowHeights. Para poner los estilos se puede usar el método setStyle. Además tenemos TableSyle, como veremos su uso en el ejemplo, pero sea cuál sea el método que usemos, los argumentos disponibles son:

febrero 17, 2014

ReportLab: Platypus - Sobre los párrafos (14)

Paragraph(text, style, bulletText=None)

Evidentemente text es el texto a escribir. Algo importante y a destacar es que permite el uso de texto Python entre las triples comillas simples (''' y '''). bulletText provee al texto un punto y aparte por defecto para el párrafo. El tipo de letra y otras propiedades del texto se configuran en el argumento style, que es una instancia de la clase ParagraphStyle, y que pueden obtenerse y usarse de la siguiente forma:

from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
estilo=getSampleStyleSheet()
estilo.add(ParagraphStyle(name = "ejemplo",  alignment=TA_CENTER, fontSize=20,
           fontName="Helvetica-BoldOblique"))

Los argumentos principales de la clase ParagraphStyle son:

class ParagraphStyle(PropertySet):
defaults = {
'fontName':'Times-Roman',  # Nombre de la fuente
'fontSize':10,  # Tamaño de fuente
'leading':12,  # Espaciado entre lineas
'leftIndent':0,  # Identación a la izquierda
'rightIndent':0,  # Identación a la derecha
'firstLineIndent':0,  # Primera linea identada
'alignment':TA_LEFT,  # Alineación
'spaceBefore':0,  # Espacio antes del párrafo (excepto en el top de un frame)
'spaceAfter':0,  # Espacio después del párrafo (excepto en botton de un frame)
'textColor': black,  # Color de Texto
'backColor':None,  # Color de fondo
'borderWidth': 0,  # Ancho de borde
'borderPadding': 0,  # Padding desde el borde
'borderColor': None,  # Color de Borde
'borderRadius': None,  # Radio de las intersecciones del borde
'bulletFontName':'Symbol',  # Nombre de la Fuente de la viñeta
'bulletFontSize':10,  # Tamaño de la viñeta
'bulletIndent':0,  # Identación de la viñeta
 }

ReportLab: Platypus - Canvas como Flowable, ejemplo resumen (13)

En la entrada anterior, vimos como trabajan los niveles de platypus, sin embargo no se vio el paso directo entre el nivel 1 (canvas) y el nivel 2 (flowables), ya que los dibujos creados en el nivel 1 fueron del tipo No-Flowables, usados como pie de página y encabezado.

En este ejemplo veremos el uso de la clase Flowable, en la que heredaremos sus atributos y crear nosotros nuestros propios dibujos con canvas:


 

febrero 15, 2014

ReportLab: Platypus - PageTemplate y DocTemplate (12)

Los niveles más altos en platypus son los PageTemplates y DocTemplates. Los DocTemplates están formados por un conjunto de PageTemplates.

Los DocTemplates son expresado a trávez de BaseDocTemplate, que es una clase que implementa la maquinaria básica para el formateo del documento. Posee un método build que procesa una lista de Flowables (obviamente, estos almacenados en los frames, y los frames en los pagetemplates) y un método addPageTemplates que agrega los pagetemplates. De esta forma se llega a producir el documento PDF a alto nivel.

Los argumentos principales del BaseDocTemplate son los siguientes:

BaseDocTemplate( nombreArchivo,  # Nombre de nuestro pdf
                    pagesize=defaultPageSize,  # Tamaño de página
                    pageTemplates=[],  # Lista de pagetemplates
                    showBoundary=0,  # Para mostrar el borde
                    leftMargin=inch,  # Magen izquierdo
                    rightMargin=inch,  # Margen derecho
                    topMargin=inch,  # Margen superior
                    bottomMargin=inch,  # Margen inferior
                    title=None,  # Titulo del pdf
                    author=None,  # Autor del pdf
                    )


febrero 13, 2014

ReportLab: Platypus - Frames (11)

Los Frames son contenedores activos, quienes a su vez son contenidos en un PageTemplates. Tienen una localización y tamañon, manteniendo el concepto de espacio dibujable restante.

Frame (x1, y1, ancho, alto, leftPadding=6, bottomPadding=6, rightPadding=6, topPadding=6, id=None, showBoundary=0)

El comando anterior, crear una instancia del Frame con cordenadas x,y que son relativas a la página en uso. Los Padding reducen espacio para dibujar. El id, sirve como un identificador (ej: 'ColumnaDerecha'). Si el showBoundary es distinto de cero, se mostrará las fronteras del frame en tiempo de ejecución.

- Frame.addFromList(drawList, canvas) Añade la lista de flowables
- Frame.split(flowable, canvas) Devuelve una lista de flowables
- Frame.drawBoundary(canvas) Dibuja el marco del Frame


ReportLab. Platypus - Flowables (10)

Ya vimos en temas anteriores el nivel más bajo de todos, el pdfgen.canvas. Ahora veremos las capas superiores, que en su conjunto serán usadas por Platypus.

El Flowables es una clase abstracta para cosas que pueden ser dibujadas; por ejemplo: los párrafos y las tablas. Usa métodos como:

- Flowable.drawOn(canvas, x, y) Envía el flowable a un canvas en particular. Maneja el traslado de las coordenadas del canvas (x,y) , de manera que dicho canvas pueda dibujar el flowable en un frame de coordenadas absolutas.

- Flowable.wrap(width, height) Calcula el espacio que usará el flowable.

ReportLab: Platypus - Entendiendo la relación con pdfgen.canvas (09)

Platypus (Page Layout and Typography Using Scripts), es una librería para disponer las páginas en un alto nivel, permitiendonos crear documentos complejos con poco esfuerzo.

Platypus busca separar el diseño del contenido de los documentos. Así por ejemplo, los párrafos son construidos usando estilo de párrafos, y las páginas usando plantillas. De esta forma, si se crea un millar de páginas, bastará con modificar las especificaciones de estilo para que resulte efecto en todo el documento.

Platypus usa un diseño de capas:

DocTemplates: Es la plantilla del documento.
PageTemplates: Es la plantilla para las páginas.
Frames: Son las regiones en las páginas que contienen texto o gráficos
Flowables: Elementos de texto ó gráficos que están incrustados en el documento (párrafos, tablas, imágenes, pero no pies de página)
pdfgen.Canvas: El que se encarga de pintar el documento, a partir de las órdenes de las otras capas superiores.

El gráfico siguiente lo explica mejor ( Los de color púrpura son los Frames):


febrero 06, 2014

Python: Convertir variable a cadena

Una de las cosas particulares que encontré en la red, fue el de convertir una variable en una cadena.
Claro, algunos no le verán el sentido, ya que se podría usar diccionarios, pero sé que en algún momento podría ser útil.


febrero 04, 2014

Mostrar Folder con python en multiplataforma

Al crear una aplicación quería lanzar un Folder, para que el usuario lo viera. Me encontré con varias soluciones, pero no las he probado todas en multiplataforma.


Supongo que la desición radica en cúan multiplataforma es la solución, como en el caso de Linux, si la solución se aplica a la mayoría de distros.

Solución 01
import os
import platform

def open_file(path):
    if platform.system() == "Windows":
        os.startfile(path)
    elif platform.system() == "Darwin":
        subprocess.Popen(["open", path])
    else:
        subprocess.Popen(["xdg-open", path])

open_file(path)

febrero 03, 2014

ReportLab: Insertando Fuentes TTF (08)

Insertar fuentes TrueType, se puede realizar no solo con pdfgen.canvas, sino también con platypus (que lo veremos más adelante).

ReportLab: Encoding UTF8 - Solución UnicodeDecodeError: 'utf8' (07)

El error siguiente: UnicodeDecodeError: 'utf8' codec can't decode bytes in position... 


por lo general aparece cuando leemos datos de otra fuente el cuál contiene datos en bytes, como latin-1, ANSI, estos se necesitan convertir a Unicode. Python provee tal conversión, por lo tanto la solución es inmediata.

ReportLab: pdfgen - Objeto de trayectoria y Tipo de líneas (06)

Ya vimos sobre los objetos de texto, que permiten dibujar de forma más comoda los textos. Para los gráficos, contamos con path object. La ventaja de usarlo, reside en la comparativa de dibujar a mano alzada, en la que el cierre de los puntos de unión se da automáticamente.

ReportLab: pdfgen - La librería lib.colors y transparencia (05)

Por lo general, al rellenar dibujos usamos colores rgb, cmyk, escala de grises, insertando valores para que en combinación nos de un determinado color. Si uno quiere insertar de forma grosa; por ejemplo el color azul, lo puede hacer directamente desde lib.colors. Además que da la opción de insertar colores transparentes:
Veamos el ejemplo:

febrero 01, 2014

ReportLab: pdfgen - Objeto de texto (04)

Al usar canvas.drawstring, nos vemos limitados a dibujar de forma lineal el texto, y si el texto es demasiado largo, no se mostrará en todo la página. Además, hay oportunidades en que nuestro texto lo tenemos en un archivo, talvez un txt. En esos casos se puede usar objectText.

Veamos el siguiente código que lo explica (se usa un archivo llamado lorem.txt, que contiene un párrafo de Lorem Ipsum:

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.