Lento-Lento y Rápido-Rápido (video)
No está listo para usarse todavía, pero si se busca se encuentra ;-)
No está listo para usarse todavía, pero si se busca se encuentra ;-)
Entonces googleé y me encontré con CutyCapt que usa Qt y WebKit para convertir páginas web en imágenes. ¡Me sirve!
Como quiero usarlo desde una aplicación PyQt, tiene sentido hacer lo mismo que CutyCapt hace, pero desde un módulo python así que acá está una implementación rapidita que funciona para mí, unque carece de muchos features de CutyCapt.
Con un poco más de esfuerzo, puede guardar como PDF o SVG, lo que permitiría usarla casi como una página web de verdad.
Se usa así:
python capty.py http://www.kde.org kde.png
Y acá está el código [descargar capty.py]
# -*- coding: utf-8 -*- """This tries to do more or less the same thing as CutyCapt, but as a python module. This is a derived work from CutyCapt: http://cutycapt.sourceforge.net/ //////////////////////////////////////////////////////////////////// // // CutyCapt - A Qt WebKit Web Page Rendering Capture Utility // // Copyright (C) 2003-2010 Bjoern Hoehrmann <bjoern@hoehrmann.de> // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // $Id$ // //////////////////////////////////////////////////////////////////// """ import sys from PyQt4 import QtCore, QtGui, QtWebKit class Capturer(object): """A class to capture webpages as images""" def __init__(self, url, filename): self.url = url self.filename = filename self.saw_initial_layout = False self.saw_document_complete = False def loadFinishedSlot(self): self.saw_document_complete = True if self.saw_initial_layout and self.saw_document_complete: self.doCapture() def initialLayoutSlot(self): self.saw_initial_layout = True if self.saw_initial_layout and self.saw_document_complete: self.doCapture() def capture(self): """Captures url as an image to the file specified""" self.wb = QtWebKit.QWebPage() self.wb.mainFrame().setScrollBarPolicy( QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff) self.wb.mainFrame().setScrollBarPolicy( QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff) self.wb.loadFinished.connect(self.loadFinishedSlot) self.wb.mainFrame().initialLayoutCompleted.connect( self.initialLayoutSlot) self.wb.mainFrame().load(QtCore.QUrl(self.url)) def doCapture(self): self.wb.setViewportSize(self.wb.mainFrame().contentsSize()) img = QtGui.QImage(self.wb.viewportSize(), QtGui.QImage.Format_ARGB32) painter = QtGui.QPainter(img) self.wb.mainFrame().render(painter) painter.end() img.save(self.filename) QtCore.QCoreApplication.instance().quit() if __name__ == "__main__": """Run a simple capture""" app = QtGui.QApplication(sys.argv) c = Capturer(sys.argv[1], sys.argv[2]) c.capture() app.exec_()
Cada sábado podés aprender algo de algunos de los mejores programadores Python de la comarca (o de mí).
Voy a enseñar virtualenv, buildout, nose y otras cosas el 21/8, cosas de GUI el 25/9 y 2/10 y PyQt el 30/10.
¡Todo es gratis, y ojalá venga mucha gente!
Cronograma completo acá.
Para más información sobre este libro, pueden ver la página del mismo en Packt Publishing
Pero eso no es tan importante, yo podría ganarme la vida haciendo otra cosa. Estoy seguro que sería competente para algo, aún si no se me ocurre nada en este momento.
Más importante es que me da libertad para jugar. Por lo tanto este post es una especie de reporte de las cosas con las que jugué. No juegos, no son lo mío, pero cosas que hago por diversión.
Sí, algunas de estas significan que soy un tipo muy raro.
Limitándome al último par de semanas o algo así:
Hubo bastante interés en Marave, mi editor sin distracciones y es porque salió en Linux Journal.
Leí el artículo (lamentablemente no puedo poner un link) y fué super positivo, algunas citas:
"marave makes the dull world of text editing romantic and immersive with beautiful minimalism"
"... it doesn't just have minimalism and simplicity, it has minimalism and simplicity combined with beauty and a palpable design ethic. marave has soul, and I love that."
Así que gracias por la amabilidad al autor, y algo que noté: se encontró con un bug enorme y no se dio cuenta :-)
El icono del destornillador debería mostrar el diálogo de configuración. Sin embargo, parece que en Ubuntu (y tal vez en otras distros, no lo sé) no aparece, y todo lo que se ve es que el texto se mueve un poco. Esto es lo que debería haber visto:
Yo nunca lo pude reproducir, pero voy a instalar una VM de Ubuntu para verlo, así que tal vez pronto.
En cosas relacionadas, marave salió en una revista alemana hace un par de meses, pero no pude obtener una copia del artículo. (De paso: no es razonable enviar una copia de estas cosas al autor del programa que estás probando? Ninguna revista no siquiera me avisó!)
En cualquier caso, si alguien tiene esta revista y me puede decir que dice el artículo sobre editores sin distracciones, me va a poner contento:
Acá está el adelanto del artículo
Y esta parece ser la revista:
En cuanto a proyectos nuevos (sí, siempre tengo proyectos nuevos) me encontré con este excelente artículo de Roger Alsing acerca de aproximar la Mona Lisa con 50 polígonos <http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/ > y, siendo un nerd con asombrosas herramientas de programación a mi alcance... escribí un framework para probar esa clase de algoritmos.
Le puse evoluto y está en http://evoluto.googlecode.com.
Sólo hice un algoritmo muy simple, basado en triángulos semitransparentes, pero funciona... mirado con cariño.
Se puede ver como el ojo derecho se queda trabado en un mínimo local :-)
Evoluto tiene una biblioteca de algoritmos (actualmente vacía) y se pueden editar y reaplicar instantáneamente si uno quierem y ver las generaciones cambiar en pantalla.
Necesitaría bastante trabajo para ser un programa pulido, pero algo es algo.
Estuve paveando con crear un programa para ver presentaciones en PDF pero todavia le falta una vida:
En lo que es tal vez mi proyecto más establecido, rst2pdf. Corregí varios bugs, y le está haciendo falta un release:
Lo arreglé con una opción nueva, así que el comportamiento por default es el mismo, pero anda. No quedo muy bueno, pero anda.
Fué un problema muy interesante, muy divertido!
Hay una parte que sigue rota, pero lo que arreglé no fué terrible.
le falta muchísimo laburo, pero por lo menos lo que andaba antes anda de nuevo. Si no sabés que es bookrest, es un frontend gráfico para rst2pdf / procesador de textos, acá lo ves en acción:
También hice varios releases de mis paquetes de AUR
Además trabajé, y algunas otras cosas. Bastante productivo!