Un navegador en 42 líneas de código

Jueves, 27 de mayo de 2010

LA MAGIA…

Todo comenzó en Ubuntuforums con la típica discusión acerca de navegadores livianos. Aparecieron por supuesto, lo conocidos navegadores minimalistas como Dillo, Uzbl y toda la amplia gama de proyectos alojados en Sourceforge. Pero sin duda lo más sorprendente fue la contribución del usuario juancarlospaco, que consistió en un pequeño script en Python que permite navegar cómodamente en cualquier sitio web, utilizando menos de 2 Kb de espacio en disco en 42 líneas de código. Aquí tienen el código publicado (con una modificación en la línea 11, para agrandar el tamaño inicial de la ventana del navegador):

Bueno, copien el pedazo de código, péguenlo en su editor de texto favorito, guárdenlo (yo le asigné el nombre de browser.py) y asígnenle permisos de ejecución. Luego en un emulador de terminal escriban ./browser.py y… ¡magia! Tendrán un navegador completamante compatible con los acutuales estándares web. Otra forma de utilizarlo es entregarle como parámetro la url que se desa visitar, por ejemplo: ./browser.py http://www.gmail.com y magia otra vez (muy importante no olvidar el http://).

EL TRUCO…

Seguramente los más avezados mirando el código, ya habrán pillado el truco detrás de la magia, bueno, el truco de este script, consiste en utilizar las librerías gtk y libwebkit-gtk, algo así como un Midori, pero muy simplificado. Por lo tanto, no es un navegador en sí, es tan sólo un simple script que delega todo el trabajo de dibujado de la ventana a las librerías gtk y el trabajo de renderizado de páginas a la librería libwebkit-gtk, es por ésto que en general las paginas cargan bien, y al estar basado en Webkit ofrece una muy buena compatibilidad con las tecnologías web actuales y las que están por venir.

Categories: Código, desktop, Tips Tags: , ,






  1. Jueves, 27 de mayo de 2010 a las 15:06 | #1

    cool!! utilicen algún plugin para desplegar código, saludos.-

  2. Juan Manuel Doren
    Jueves, 27 de mayo de 2010 a las 15:08 | #2

    Es engañoso eso de decir pocas líneas e incluir miles de líneas en librerías prehechas
    es como decir, navegador en una sola linea ( pseudo lenguaje )
    exec firefox

    lo liviano en verdad se ve a nivel del código de máquina generado y los recursos consumidos

  3. alvaro
    Jueves, 27 de mayo de 2010 a las 15:23 | #3

    Ta weno pa ver como se usan las librerias y cosas así. pero me tira error en la linea 7:

    alvaro@debian:~$ ./*py
    File “./navegador.py”, line 7
    def __init__(self):
    ^
    IndentationError: expected an indented block

  4. Jueves, 27 de mayo de 2010 a las 16:05 | #4

    Python es sensible a la identacion y …. el ejemplo se comió toda la identación.

    ClaudioMet where are you?

  5. Jueves, 27 de mayo de 2010 a las 16:18 | #5

    @alvaro me sale lo mismo

  6. Jueves, 27 de mayo de 2010 a las 16:34 | #6

    #!/usr/bin/env python
    import sys
    import gtk
    import webkit
    DEFAULT_URL = ‘http://www.google.com’ # Change this as you Wish
    class SimpleBrowser: # needs GTK, Python, Webkit-GTK
    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(350, 20)
    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.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(‘%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
    gtk.gdk.threads_init()
    browser = SimpleBrowser()
    browser.open(url)
    browser.show()
    gtk.main()

  7. Jueves, 27 de mayo de 2010 a las 16:39 | #7

    desde el primer def son 3 espacios, quedando el def en el 4to espacio. los siguientes “self. son 7 espacios, quedando el self en el 8vo.

    y repitan los def en cuarto espacio y los self en el 8vo. el primer IF qued aal comienzo de la linea y el segundo if en el 4to espacio el url en el 8vo el else a la isma altura del segundo IF y el siguiente URL a la altura del primero y lo que siga a la altura del “else”

    espero ser claro (?)
    saludos.

  8. Jueves, 27 de mayo de 2010 a las 16:43 | #8

    #!/usr/bin/env python
    import sys
    import gtk
    import webkit
    DEFAULT_URL = ‘http://www.google.com’ # Change this as you Wish
    class SimpleBrowser: # needs GTK, Python, Webkit-GTK
    123def __init__(self):
    1234567self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    1234567 self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
    1234567self.window.connect(‘delete_event’, self.close_application)
    1234567self.window.set_default_size(350, 20)
    1234567vbox = gtk.VBox(spacing=5)
    1234567vbox.set_border_width(5)
    1234567self.txt_url = gtk.Entry()
    1234567self.txt_url.connect(‘activate’, self._txt_url_activate)
    1234567self.scrolled_window = gtk.ScrolledWindow()
    1234567self.webview = webkit.WebView()
    1234567self.scrolled_window.add(self.webview)
    1234567vbox.pack_start(self.scrolled_window, fill=True, expand=True)
    1234567self.window.add(vbox)
    123def _txt_url_activate(self, entry):
    1234567self._load(entry.get_text())
    123def _load(self, url):
    1234567self.webview.open(url)
    1234567def open(self, url):
    1234567self.txt_url.set_text(url)
    1234567self.window.set_title(‘%s’ % url)
    1234567self._load(url)
    123def show(self):
    1234567self.window.show_all()
    123def close_application(self, widget, event, data=None):
    1234567gtk.main_quit()
    if __name__ == ‘__main__’:
    123if len(sys.argv) > 1:
    1234567url = sys.argv[1]
    123else:
    1234567url = DEFAULT_URL
    1234567gtk.gdk.threads_init()
    1234567browser = SimpleBrowser()
    1234567browser.open(url)
    1234567browser.show()
    1234567gtk.main()

    Reemplacen los numeros por espacios..

    saludos.

  9. Jueves, 27 de mayo de 2010 a las 16:55 | #9

    Listo, pegado el código en pastebin.
    Sorry por las molestias

  10. Jueves, 27 de mayo de 2010 a las 17:11 | #10

    Tienes a los pobres cabros indentando jaja

  11. alvaro
    Jueves, 27 de mayo de 2010 a las 17:41 | #11

    Yo siempre tengo mala suerte con estos scripts. Ahora me está pidiendo la importación de webkit y ya he instalador todo lo que tiene que ver con eso (*webkit*) en debian lenny.

    #!/usr/bin/env python
    import sys
    import gtk
    import webkit
    DEFAULT_URL = ‘http://www.google.com’ # Change this as you Wish
    class SimpleBrowser: # needs GTK, Python, Webkit-GTK
    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(350, 20)
    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.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(‘%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
    gtk.gdk.threads_init()
    browser = SimpleBrowser()
    browser.open(url)
    browser.show()
    gtk.main()

  12. Viernes, 28 de mayo de 2010 a las 11:54 | #12

    Aquí en 10 líneas, con Qt 😉 http://pastebin.com/HnyuzFUf

  13. Krash
    Martes, 8 de junio de 2010 a las 12:35 | #13

    Franco me funciona bien el scropt, pero el unico detalle es que no muestra la barra para poner la direccion web.

  14. Martes, 8 de junio de 2010 a las 12:50 | #14

    @Krash pásale la url como argumento, p ej. :

    ./browser.py http://www.arealinux.cl

    no olvides el http://

Comentarios cerrados.