Um simples Web Browser com WebKit e PyGObject

Webkit  é uma engine open source para web browser utilizada em diversos projetos onde uma lista dos mesmos pode ser vista aqui. Entre os projetos que utilizam o webkit estão grandes aplicativos como o google chrome e o safari da apple mostrando o quão poderosa é essa engine e o motivo de eu utiliza-la para criar um web browser.

A interface do browser foi criada com o glade, com a seguinte estrutura de widgets:


Gtk.Window  -- Janela principal
     |
   Gtk.Vbox   -- Divide a janela principal em 2 verticalmente
         |
         \_ _ _ Gtk.Hbox  -- Divide a primeira parte da janela principal em 4 horizontalmente
          |       |
          |       \_ _ _Gtk.Toolbar  -- Espaço onde ficará os botões voltar, avançar e atualizar a pagina
          |       |
          |       \_ _ _Gtk.Entry  -- Barra para digitar a URL
          |       |
          |   Gtk.Toolbar -- Adicionei apenas para separar as barras de texto pura estética
          |       |
          |   Gtk.Entry  --  Barra para pesquisa no google
          |
        Gtk.ScrolledWindow --   Barras de rolagem da página web


Bem simples de ser moldada no glade




Segue o código comentado:

 
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gi.repository import Gtk, WebKit


class Browser(object):
    def __init__(self):

        # Obtendo os widgets do arquivo gerado pelo glade
        builder = Gtk.Builder()
        builder.add_from_file("browser.glade")
        self.window = builder.get_object("window")
        self.window.show()
        self.go_back_button = builder.get_object("go_back")
        self.go_forward_button = builder.get_object("go_forward")
        self.refresh_button = builder.get_object("refresh")
        self.scrolledwindow = builder.get_object("scrolledwindow")
        self.url = builder.get_object("entry")
        self.search_entry = builder.get_object("search_entry")

        # Instanciando a classe do webkit que irá exibir a página
        self.view = WebKit.WebView()
        self.scrolledwindow.add(self.view)

        # página inicial a ser carregada ao iniciar o navegador
        self.view.open("http://sourcecode.net.br")
        self.view.show()
        
        # Conectando os sinais do webkit
        self.view.connect("load-committed", self.check_buttons) 
        self.view.connect("title-changed", self.change_title)
        
        # Conectando os sinais do Gtk
        builder.connect_signals({
                                "gtk_main_quit": Gtk.main_quit,
                                "on_entry_activate": self.go_,
                                "on_search_activate": self.search,
                                "go_back_clicked": self.go_back,
                                "go_forward_clicked": self.go_forward,
                                "refresh_clicked": self.refresh,
                                })
                                
    def go_(self, widget):
        """Carrega a página da barra de endereço"""
        link = self.url.get_text()
        if link.startswith("http://"):
            self.view.open(link)
        else:
            self.view.open("http://" + link)
        self.view.show()
        
    def search(self, widget):
        """ Pesquisa no google o conteúdo contido
            na barra de pesquisa"""
        text = self.search_entry.get_text()
        text = text.replace(" ", "+")
        self.url.set_text("http://www.google.com.br/search?q=" + text)
        self.search_entry.set_text("")
        self.go_(self)

            
    def check_buttons(self, widget, data):
        """Verifica se os botões voltar, avançar estão disponíveis,
           em caso verdadeiro os botões podem ser utilizados caso
           contrário os botões são desativados.
           Também atualiza a barra de endereços com a página
           atualmente carregada."""
        uri = widget.get_main_frame().get_uri()
        self.url.set_text(uri)
        self.go_back_button.set_sensitive(self.view.can_go_back())
        self.go_forward_button.set_sensitive(self.view.can_go_forward())
        
        
    def change_title(self, widget, data, arg):
        """ Altera o título do navegador para título
            da página atualmente carregada """
        title = widget.get_main_frame().get_title()
        self.window.set_title("Makai Browser - %s" % title)
        
        
    def go_back(self, widget):
        """Volta a página"""
        self.view.go_back()
        
        
    def go_forward(self, widget):
        """Avança a página"""
        self.view.go_forward()
        
        
    def refresh(self, widget):
        """Atualiza a página"""
        self.view.reload()
        
if __name__ == "__main__":
    browser = Browser()
    Gtk.main()
        

Navegador pronto para uso, agora é só surfar pela web





Caso queira utilizar esse código ou implementa-lo fique a vontade.  E uma dica, se desejar implementar suporte a abas pesquise sobre Gtk.Notebook

 O arquivo .glade e o .py podem ser baixados aqui 

Referência:

http://webkitgtk.org/reference/webkitgtk/stable/webkitgtk-webkitwebview.html

2 Comentário(s) em “Um simples Web Browser com WebKit e PyGObject”

  1. Amigo , eu também uso o fedora... , não sei mt bem mecher com o glade , meu primeiro dia.... , eu tentei abrir o arquivo .glade com o proprio glade , só que aparece um quadrado para modelar , mais não o quadrado do browser.

    [Responder comentário]
  2. Olá Henrique, se você abrir o arquivo .glade com o próprio glade ele irá abriar a janela do browser para ser modelado mesmo, se você quer rodar o browser para testa-lo rode o arquivo .py. Se ao tentar abrir o arquivo com o glade e os widgets do browser não aparecer para serem editados alguma coisa está errada, verifique a versão do glade, esse arquivo foi criado na versão 3.x.

    [Responder comentário]

Deixe um comentário