Inicio > codear, programación, python, ubuntu-ar > Navegador simple con Python + Webkit/GTK

Navegador simple con Python + Webkit/GTK

Jueves, 19 de noviembre de 2009 Dejar un comentario Ir a comentarios

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

Categories: codear, programación, python, ubuntu-ar Tags:
  1. Viernes, 20 de noviembre de 2009 a las 11:53 | #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. rachell
    Sábado, 11 de septiembre de 2010 a las 15:32 | #2

    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

  3. Lunes, 13 de septiembre de 2010 a las 19:49 | #3

    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!

  4. Zpace
    Domingo, 5 de diciembre de 2010 a las 10:57 | #4

    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?

  5. Lunes, 20 de diciembre de 2010 a las 16:38 | #5

    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

  6. angel
    Miércoles, 7 de marzo de 2012 a las 23:25 | #6

    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….

  7. Jueves, 8 de marzo de 2012 a las 11:48 | #7

    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

  8. danilo
    Viernes, 22 de junio de 2012 a las 05:27 | #8

    alguien sabe como instalar pywebkitgtk-1.1.8 en windows?

  9. satoshi
    Miércoles, 13 de febrero de 2013 a las 14:48 | #9

    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_())

  10. Miércoles, 13 de febrero de 2013 a las 15:11 | #10

    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

  1. Jueves, 19 de noviembre de 2009 a las 22:38 | #1
  2. Sábado, 28 de agosto de 2010 a las 20:06 | #2
  3. Sábado, 9 de octubre de 2010 a las 22:28 | #3
  4. Domingo, 26 de mayo de 2013 a las 19:29 | #4