Navegador simple con Python + Webkit/GTK

Hoy me encontré con otro un hilo en la lista de PyAr que me deja un link más que interesante: ¡Existe un binding para usar Webkit sobre GTK desde Python, y lo mejor de todo es que ya está incluido en los repositorios de Ubuntu 9.10!

Webkit es un motor de renderizado («dibujado») de páginas web, que es utilizado en el corazón en cada vez más navegadores, como Chrome, Safari, Konqueror, etc. Es super completo y veloz; y permite ejecutarse en muchísimas plataformas y sistemas diferentes.  Si bien existen otros métodos para embeber un navegador en una aplicación PyGTK, como por ejemplo gtkmozembed (que embebe el motor de Firefox), éste no es muy poderoso, o por lo menos no deja meterle mucha «mano» para personalizarlo, y uno termina teniendo relativamente muy poco «poder». En cambio con Webkit/GTK se pueden hacer muchas más cosas, tan sólo hace falta ver la documentación y un ejemplo (links al final, claro). 🙂

No podía dejar de probarlo. Entonces me puse manos a la obra, y salió esto, tratando de imitar lo que se posteó en la lista:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
""" 
    SimpleBrowser - Navegador muy muy simple de internet, sólo de ejemplo,
                    que utiliza la biblioteca Webkit GTK desde Python (PyWebkitGTK).

    Marcelo Fidel Fernández - http://www.marcelofernandez.info 
    Licencia: BSD. Disponible en: http://www.freebsd.org/copyright/license.html
"""
    
import sys
import gtk
import webkit

DEFAULT_URL = 'http://www.python.org'

class SimpleBrowser:

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
        self.window.connect('delete_event', self.close_application)
        self.window.set_default_size(800, 600)

        vbox = gtk.VBox(spacing=5)
        vbox.set_border_width(5)

        self.txt_url = gtk.Entry()
        self.txt_url.connect('activate', self._txt_url_activate)

        self.scrolled_window = gtk.ScrolledWindow()
        self.webview = webkit.WebView()
        self.scrolled_window.add(self.webview)

        vbox.pack_start(self.txt_url, fill=False, expand=False)
        vbox.pack_start(self.scrolled_window, fill=True, expand=True)
        self.window.add(vbox)

    def _txt_url_activate(self, entry):
        self._load(entry.get_text())

    def _load(self, url):
        self.webview.open(url)

    def open(self, url):
        self.txt_url.set_text(url)
        self.window.set_title('SimpleBrowser - %s' % url)
        self._load(url)

    def show(self):
        self.window.show_all()

    def close_application(self, widget, event, data=None):
        gtk.main_quit()

if __name__ == '__main__':
    if len(sys.argv) > 1:
        url = sys.argv[1]
    else:
        url = DEFAULT_URL

    # PyWebkitGTK necesita habilitar el soporte de los hilos en PyGTK
    gtk.gdk.threads_init()
    browser = SimpleBrowser()
    browser.open(url)
    browser.show()
    gtk.main()

¡Y Listo!

Pantallazo_PyWebkitGTK

Todo lo que se necesita en Ubuntu 9.10 para poder correr esto es instalar el paquete «python-webkit»; sin embargo, esta versión es la 1.1.5, mientras que PyWebkitGTK va por la 1.1.7 y Webkit/GTK va por la 1.1.15, así que todavía hay lugar para mejoras.

Aquí dejo algunos links:

  • PyWebkitGTK se llama el proyecto de llevar Webkit/GTK (escrito naturalmente en C) a Python.
  • Acá hay un ejemplo muchísimo más completo de un navegador con múltiples pestañas y todo.
  • Lamentablemente, la documentación de la biblioteca en Python no existe aún (es un ticket del proyecto), así que por ahora habrá que conformarse con la documentación de Webkit/GTK; sin embargo, yo lo encuentro bastante legible, ya que enseguida uno se adapta a «traducir» cómo se llamaría un método en C a uno en Python.

Espero que les sirva. Me divertí mucho haciéndolo. 🙂

Saludos


Comentarios

14 respuestas a «Navegador simple con Python + Webkit/GTK»

  1. Plas, plas. Andaba tiempo buscando algo similar para realizar alguna integración de servicios web dentro de una aplicación python. Muchas gracias por compartirlo.

  2. […] semplice navigazione è perfetto, quindi consiglio di provarlo. Faccio i complimenti all'autore che negli ultimi giorni non ha ricevuto i giusti […]

  3. Hola a todos. quisiera saber quien me puede indicar una buena pagina donde me pueda informar sobre webkit necesito hacer un navegador pero como no manejo mucho estos terminos necesito una guia, les agradeceria mucho

  4. Hola Rachell, ¿los links que dejé en el artículo no son suficientes?

    Acá tenés un video estilo «Guía de Aprendizaje»:

    http://www.tuxradar.com/content/python-pygtk-webkit-20-minutes

    Cualquier otra duda/consulta te esperamos en la lista de correo del grupo de Programadores Python de Argentina, PyAr:

    http://www.python.org.ar

    Te esperamos, saludos!

  5. […] algunos posts (¡casi un año ya!) escribí sobre una manera fácil y rápida de tener un componente “navegador web” en Python […]

  6. Una pregunta, el navegador no funciona con algunas webs, sobre todo las de música en vivo tipo groveshark o fulltono, no se si spotify, esto es por algo?

  7. Hola, hay que ver el soporte de plugins que tenés en tu sistema, si no me equivoco, el WebkitGTK carga los mismos plugins del Firefox de tu sistema. Fijate si esas webs las podés ver con el Firefox o no y ahí vas descartando problemas.

    Saludos

  8. Avatar de angel

    Hola, tengo una intriga, me interesaría crear una app en c# (para usar el api de evernote pues ellos no permiten javascript) y que usara html5 con animaciones en jquery, mi primera idea era que el programa corriera un servidor, similar a hacer una pagina web y la gui simplemente se conectara a ese servidor y renderizara la pagina, no estoy seguro pero parece una mala idea (si no muchos programadores estarían haciendo eso y hasta ahora no conozco ninguno 😀 …) sabes si hay alguna pagina o algun recurso para entender bien como conectar el html con el javascript con el otro lenguaje que use??…gracias….

  9. Hola Angel, no entiendo bien lo que querés hacer y conozco bastante poco (por no decir nada) de C#, pero por lo que entiendo vos querés hacer una aplicación híbrida, donde la aplicación muestra una vista web que se conecta a un server web local (o remoto). Te sugiero que busques en Google (o el MSDN) para más info.

    Saludos

  10. Avatar de danilo

    alguien sabe como instalar pywebkitgtk-1.1.8 en windows?

  11. Avatar de satoshi

    Con Pyside (el binding python de Qt) sale mas pequeño, solo 9 lineas:

    import sys
    from PySide.QtCore import *
    from PySide.QtGui import *
    from PySide.QtWebKit import *
    app = QApplication(sys.argv)
    web = QWebView()
    web.load(QUrl(«http://google.com»))
    web.show()
    sys.exit(app.exec_())

  12. Hola @satoshi ,

    Si bien no discuto que QT tenga una integración un poco más homogénea con Webkit, el ejemplo que describí tiene más funcionalidad que el que comentás con PySide. Por ejemplo, el cuadro de texto para ingresar nuevas URLs, el cambio de título de la ventana, etc.

    Por otra parte, a partir de Phoenix, la versión en desarrollo de wxPython (que me dicen que está bastante avanzada), ya se implementa un objeto html2 en todas las plataformas, con el objetivo de solventar esta falencia:

    http://wxpython.org/Phoenix/docs/html/html2.1classindex.html

    Lo bueno (o malo, según cómo se quiera ver) es que en Windows usa Trident (el motor de IE), en Linux usa WebkitGTK (el de este ejemplo) y en Mac usa Webkit (el de Safari).

    Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *