goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

Aventuras em Python (parte 1)

Estou há cinco meses usando quase que exclusivamente o Ubuntu tanto em casa quanto no trabalho. Acho que já está na hora de tomar vergonha na cara 😛 e aprender a programar para Linux.

Tenho percebido que muitos dos programas disponíveis no Ubuntu foram escritos em Python. Não acredita? Experimente digitar isso no seu terminal:

locate *.py

Por ora, meu conhecimento sobre esta linguagem limita-se a saber que ela é interpretada, de alto nível, e com a curiosa característica de ter seus blocos de código definidos pela indentação.

Malgrado já haver tantos programas em Python numa instalação padrão do Ubuntu, preferi descarregar um novo aplicativo para dar uma olhada nos fontes, para ver se entendo alguma coisa. Pode parecer uma técnica esquisita para se aprender uma nova linguagem de programação, mas acredite, comigo funciona. O aplicativo em questão é o Turpial, um promissor cliente para o Twitter. Sua aparência lembra um pouco o TweetDeck, com a vantagem de rodar nativamente em Linux, apesar de (ainda) não ter tantas funcionalidades quanto aquele.

Para instalar o programa no Ubuntu (de modo a utilizá-lo), bastam as seguintes linhas de comando:

sudo add-apt-repository ppa:effie-jayx/turpial
sudo aptitude update
sudo aptitude install turpial

Para estudar o código fonte, porém, o melhor é baixar os fontes do Turpial a partir do GitHub, com o seguinte comando no terminal:

git clone git://github.com/satanas/Turpial.git turpial

Caso você queira me acompanhar, e ainda não tenha o cliente git instalado, execute isso antes:

sudo aptitude install git-core

Os fontes estarão na pasta turpial (cd turpial), com a seguinte estrutura:

Estrutura dos arquivos do código fonte do Turpial

Estrutura dos arquivos do código fonte do Turpial

Para ser direto, meu interesse é sobre como são construídas as interfaces gráficas no ambiente Linux. Seguindo meus instintos, fui procurar alguma coisa sob a pasta gtk (pra quem não sabe, GTK+ é o nome da biblioteca de interface gráfica utilizado pelo ambiente GNOME e pelos respectivos programas). Dentre os arquivos que lá estavam, abri o denominado about.py para dar uma olhada.

Interface do Turpial exibindo o <em>About Box</em>

Interface do Turpial exibindo o About Box

# -*- coding: utf-8 -*-

# Ventana para subir el ego de los desarrolladores de Turpial xD
#
# Author: Wil Alvarez (aka Satanas)
# Dic 21, 2009

import os
import gtk

class About:
    def __init__(self, parent=None):
        about = gtk.AboutDialog()
        about.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
        about.set_logo(parent.load_image('turpial_icon.png', True))
        about.set_name('Turpial')
        about.set_version(parent.version)
        about.set_copyright('Copyright (C) 2009 - 2010 Wil Alvarez')
        about.set_comments(_('Twitter client multi-interface written in Python'))
        about.set_transient_for(parent)
        about.set_position(gtk.WIN_POS_CENTER_ON_PARENT)

        try:
            path = os.path.realpath(os.path.join(os.path.dirname(__file__),
                '..', '..', '..', 'COPYING'))
            lic = file(path, 'r')
            license = lic.read()
            lic.close()
        except Exception, msg:
            license = 'This script is free software; you can redistribute it'
            'and\/or modify it under the\n\terms of the GNU General Public '
            'License as published by the Free Software\n\Foundation; either '
            'version 3 of the License, or (at your option) any later version.'
            '\n\n\You should have received a copy of the GNU General Public '
            'License along with\n\this script (see license); if not, write to '
            'the Free Software\n\Foundation, Inc., 59 Temple Place, Suite 330, '
            'Boston, MA  02111-1307  USA'
        about.set_license(license)
        authors = []
        try:
            path = os.path.realpath(os.path.join(os.path.dirname(__file__),
                '..', '..', '..', 'AUTHORS'))
            f = file(path, 'r')
            for line in f:
                authors.append(line.strip('\n'))
            f.close()
        except Exception, msg:
            pass

        about.set_authors(authors)

        about.connect("response", self.__response)
        about.connect("close", self.__close)
        about.connect("delete_event", self.__close)

        about.run()

    def __response(self, dialog, response, *args):
        if response < 0:
            dialog.destroy()
            dialog.emit_stop_by_name('response')

    def __close(self, widget, event=None):
        widget.destroy()
        return True

Consegui entender bem o que o código faz, mesmo porque é apenas um about box. Começa importando bibliotecas (linhas 8 e 9), antes de começar a definir a classe. Nesta, há um método construtor (__init__), no qual são definidos, primeiramente, o tipo e as propriedades da janela (linhas 13 a 21).

Entre as linhas 23 e 37, o código procura por um arquivo chamado COPYING, para dele extrair as informações de licença a serem exibidas na caixa de diálogo. Faz isso dentro de um bloco try...except, provendo uma saída sem erros para o caso de o arquivo não ser encontrado ou ocorrerem erros de leitura. Procedimento semelhante é feito entre as linhas 40 e 48, desta feita para ler o arquivo que contém a lista de autores.

Parece-me que a funcionalidade dos botões Créditos e Licença são providos pela classe AboutDialog do GTK+, tendo bastado ao autor apenas prover o conteúdo dos diálogos que abrem. A conexão é feita nas linhas 38 e 50, respectivamente.

Há um manipulador de respostas (__response), certamente para lidar com coisas do tipo “Sim/Não/Cancelar” ou “OK/Cancelar”, mas que, no contexto, serve apenas para fechar a janela, o que pode ser feito também pelo botão do decorador de janelas (__close).

Agora sinto-me um pouco menos analfabeto em Python. Acho que já aprendi as vogais. 😉

Anúncios

4 Respostas para “Aventuras em Python (parte 1)

  1. Francisco 24/05/2010 às 17\0521

    Python é demais! 🙂

    Apesar de não ser de TI, gosto de me aventurar usando ela. Certa vez precisei compactar uma série de imagens para thumbnails. Usando uma biblioteca e umas 10 linhas consegui resolver tudo de uma vez.

    É claro que daria p/ fazer isso em outras linguagens, mas Python já vem com tantas coisas embutidas que bastam algumas linhas para resolver um problema. Abs

  2. goncin 24/05/2010 às 20\0843

    Olá, Francisco.

    Parece que o Python está para a programação desktop em Linux assim como o PHP está para o desenvolvimento web. Mas, claro, o Python pode ser utilizado para web também, está aí o Django que não me deixa mentir.

    Agora… quanto à sua declaração “Apesar de não ser de TI…”, sinto dizer que você já se bandeou para o lado de cá. Já está devidamente evangelizado e convertido. :p

    Outro abraço,

  3. Magnun 08/06/2010 às 08\0827

    Olá Goncin, descobri seu blog através do Planeta Ubuntu Brasil e gostei muito dele. Enquanto passeava pelo seu blog encontrei esse post sobre Python. Sou programador Python (não profissionalmente) e posso te garantir que é extremamente prazeroso e simples. Já programei em outras linguagens e larguei todas para ficar com Python.

    Se precisar de ajuda em Python (e GTK) ou quiser criar algum projeto pode contar comigo! Eu tenho alguns projetos em andamento também, mas o código está um pouco desorganizado 🙂

    Até mais…

    • goncin 09/06/2010 às 09\0924

      Olá, Magnun! Obrigado pela visita e pelo comentaário.

      Como você pôde perceber, “Aventuras em Python” foi concebido como uma série de posts, mas, por falta de tempo, ainda não consegui aprender mais sobre a linguagem a ponto de fazer a parte 2… 😛

      Tenho esperanças de, assim que as coisas se normalizarem um pouco, voltar a estudar Python. E, aí sim, quem sabe eu encare algum projeto. Agradeço pela disposição em ajudar.

      Um abraço,

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: