Micro Navegador Web con Python


Captura MicroWeb

Captura MicroWeb

Otra vez con Python, pero esta vez con otras librerías. Me pasaron un linka a un navegador web con Python de 1.1K. Como no puedo con mi genio, me dediqué a modificarlo y agregarle lo que le faltaba para que funcione minimamente.

Entonces quedó esto: un navegador hecho con Python, GTK y Webkit, en un archivo de 4,1K, que tiene botones de “Atras”, “Adelante”, “Actiualizar”, barra de direcciones, barra de estado y barra de progreso. También actualiza el título de la ventana y la barra de url, según se vaya navegando.

Para usar, se necesita tener instalado Python, Python-GTK y Python-Weblit (en Ubuntu son los paquetes python python-gtk2 python-weblit).

El archivo para descarga: microweb.py.tar.gz

Y el código:

#!/usr/bin/python
import sys, re
import gtk, gobject
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(750, 500)
		vbox = gtk.VBox(spacing=5)
		vbox.set_border_width(5)
		self.txt_url = gtk.Entry()
		self.txt_url.connect('activate', self._txt_url_activate)

		# Genero una barra de herramientas
		toolbar = gtk.HBox(spacing=5)
		vbox.pack_start(toolbar,False,False)

		# Agrego el boton "Atras"
		self.btnback = gtk.Button()
		self.btnback.add(gtk.Arrow(gtk.ARROW_LEFT,gtk.SHADOW_OUT))
		self.btnback.connect('clicked',self._go_back)
		toolbar.pack_start(self.btnback,False,False)

		# Agrego el boton "Adelante"
		self.btnforward = gtk.Button()
		self.btnforward.add(gtk.Arrow(gtk.ARROW_RIGHT,gtk.SHADOW_OUT))
		self.btnforward.connect('clicked',self._go_forward)
		toolbar.pack_start(self.btnforward,False,False)

		# Agrego el boton "Actualizar"
		btnrefresh = gtk.Button('Actualizar')
		btnrefresh.connect('clicked',self._refresh)
		toolbar.pack_start(btnrefresh,False,False)

		# Agrego la barra de direcciones
		self.text = gtk.Entry()
		self.text.connect('activate',self._open_bar_url)
		toolbar.pack_start(self.text,True,True)

		# Agrego el boton de "Ir"
		button = gtk.Button('Ir')
		button.connect('clicked',self._open_bar_url)
		toolbar.pack_start(button,False,False)

		# Agrego el renderer del motor
		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)

		# Agrego un alinea de estado, con una etiqueta y una barra de progreso
		self.pbar = gtk.ProgressBar()
		self.status = gtk.Label()
		hbox2 = gtk.HBox(False,0)
		hbox2.pack_start(self.status,False,False)
		hbox2.pack_end(self.pbar,False,False)
		vbox.pack_start(hbox2,False,True)

		# Defino las acciones a realizar segun los eventos del motor html
		self.webview.connect('load-started',self._load_start)
		self.webview.connect('load-progress-changed',self._load_progress_changed)
		self.webview.connect('load-finished',self._load_finished)
		self.webview.connect('title-changed',self._title_changed)
		self.webview.connect('hovering-over-link',self._hover_link)

	def _open_bar_url(self, nada):
		self.open(self.text.get_text())
	def _txt_url_activate(self, entry):
		self._load(entry.get_text())
	def _load(self, url):
		self.webview.open(url)
	def open(self, url):
		# Si la url no tiene el http:// adelante, se lo agrego
		if url[0:7] != "http://":
			url = "http://"+url
		self.txt_url.set_text(url)
		self._load(url)
	def show(self):
		self.window.show_all()
	def close_application(self, widget, event, data=None):
		gtk.main_quit()
	def _load_start(self, view, nadas):
		self.status.set_text('Cargando...')
		self.pbar.set_fraction(0)
	def _load_progress_changed(self, view, prog):
		self.pbar.set_fraction(prog/100.0)
	def _load_finished(self, view, nada):
		self.pbar.set_fraction(0)
		self.status.set_text('Listo')
	def _go_back(self,nada):
		self.webview.go_back()
	def _go_forward(self,nada):
		self.webview.go_forward()
	def _refresh(self,nada):
		self.webview.reload()
	def _title_changed(self,view,frame,title):
		# Actualizo el titulo del navegador, la url en la barra de url y activo/desactivo los botones Adelante y Atras
		self.window.set_title('%s' % title)
		self.text.set_text(frame.get_uri())
		self.btnback.props.sensitive = self.webview.can_go_back()
		self.btnforward.props.sensitive = self.webview.can_go_forward()
	def _hover_link(self,view,frame,url):
		# Si se hace hover sobre un link, pongo en la barra de estado la url hacia la que linkea
		if view and url:
			self.status.set_text(url)
		else:
			self.status.set_text("")

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

, , , , ,

  1. #1 by Richzendy on 23 junio 2010 - 10:39

    Excelente script, es muy, pero muy rápido para navegar, voy a probarlo como navegador para una aplicación web para touchscreen que estamos desarrollando en el trabajo a ver que tal, en vez de firefox que es mucho más grande y tiene más dependencias.

    Se me ocurren otros usos:

    1. Una aplicación web para sistemas embebidos que soporten python.

    2. Lanzar una aplicación de escritorio que sea web y luzca como de escritorio.

    3. Embeber un browser en otra aplicación python.

    4. Navegador para una minisdistro que soporte python.

    Se que el script está en otros lados, pero el toque de la barra de navegación que le diste esta muy bueno, Muchas Gracias!

  2. #2 by Matias F. Gea on 23 junio 2010 - 11:22

    Por nada! Si necesitas alguna otra modificación o algo así, avisame que intentamos hacerlo funcionar.
    Es muy simple mejorarlo para algunas de las cosas que sugerís. Por ejemplo, son un par de líneas hacer que funcione en fullscreen y soporte atajos de teclado.

    Saludos!

  3. #3 by Richzendy on 23 junio 2010 - 17:24

    Para fullscreen coloque esta linea así:

    self.window.set_default_size(1280, 1024)

    Y se desplego la ventana en una resolución que abarcaba toda la pantalla :-D

    Se que no es lo más elegante, pero me funciono.

  4. #4 by Matias F. Gea on 23 junio 2010 - 17:30

    Habría que probar con self.window.fullscreen(), que sería más correcto y con self.window.unfullscreen() para salir de pantalla completa. Si te fijás en el reproductor de videos en python (http://www.mfgea.com.ar/2010/06/10/micro-reproductor-de-videos-en-python/) uso esta técnica en combinación con un atajo de teclado.

  5. #5 by Richzendy on 25 junio 2010 - 9:18

    Gracias por el dato, voy a chequear :-D

  6. #6 by Richzendy on 1 julio 2010 - 9:12

    Funciona perfecto fusionando parte del código del reproductor de vídeo para colocar atajos de teclado y la opción de fullscreen.

    Muy sencillo de entender el código a pesar de que no se nada de python :-D

(No será publicado)