Primeiras impresses de uso do XCode com PyObjC

March 29, 2010

[Warning: This post is a backup recovery from my previous Wordpress blog. All content was automatically converted accessing a MySQL database using a Python script (details). Mostly are in Portuguese but if you are interest I can translate to English. If you found any problem dont’t hesitate to contact me in comments.]

Estou utilizando o Mac OS X a pouco tempo com a inteno de aprender um pouco da programao de interface grficas. Uma opo utilizar o Qt que multi-plataforma, mas resolvi fazer um teste com o que a Apple tem a oferecer. Minha escolha inicial para pegar a "idia" foi partir de alguma coisa que eu j sei, para isso escolhi o binding PyObjC para criar aplicativos utilizando Python.

O primeiro problema que eu resolvi relativamente rpido foi a questo dos templates para criar um novo projeto em PyObjC. A verso que utilizo do XCode (3.2.1) no instala automaticamente, siga os passos aqui.

Resolvi fazer um programa bem simples para converter um nmero na base decimal para base hexadecimal. Isso em Python feito com meia linha de cdigo, mas o objetivo aqui aprender como os componentes grficos so acessados no cdigo. Aprendi duas coisas importantes: outlets e actions.

No Interface Builder assim como no Qt Designer no fazemos cdigo e sim a tela. Em alguns tutoriais voc pode encontrar referncia a interface grfica como um arquivo com a extenso .nib contudo as verses mais novas possuem a extenso .xib (procurando diferenas, li que o .xib gera um XML ao passo que o .nib no)

O cdigo que ir tratar dos componentes na janela o arquivo AppDelegate (ex.: NomeDoProjetoAppDelegate.py). Na janela Library ( Tools -> Library ) selecionamos a aba Classes e procuramos pela classe AppDelegate.

[caption id="attachment_814" align="aligncenter" width="248" caption="Acesso as duas edits"][/caption]

Observe que esse processo de criao da interface grfica no IB independente da linguagem escolhida.

[caption id="attachment_815" align="aligncenter" width="249" caption="A action equivalente ao SLOT() no Qt"][/caption]

A parte das conexes so feitas segurando o control e clicando no cubo azul (na janela MainMenu.xib) da classe AppDelagete e arrastando at o componente que voc deseja utilizar. Ateno na ordem:

  • Outlets das caixas de texto: clique no cubo e arraste para o componente, para cada selecione o outlet apropriado.
  • Action do boto: clique no boto e arraste para o cubo, selecione a action apropriada

A parte que e gastei um tempo foi para acessar os outlets, mas depois de ver a opo Write Update Class Files o problema foi resolvido (se voc j escreveu alguma no cdigo na classe Int2HexAppDelegate.py opte pelo Merge seno pelo Replace)

from Foundation import *
from AppKit import *
import objc
class Int2HexAppDelegate (NSObject):
    edit_hexa = objc.IBOutlet()
    edit_int = objc.IBOutlet()

    @objc.IBAction
    def converte_(self, sender):
	    valor_int = self.edit_int.intValue()
	    valor_hexa = hex(valor_int)
	    self.edit_hexa.setStringValue_(str(valor_hexa))

Esse cdigo bem simples para mostrar o conceito e tambm porque eu por enquanto no saberia fazer nada muito mais complexo que isso :p

O acesso as caixas de texto feita pelas variveis (outlet) edit_hexa e edit_int e a ao converte_ (lembre-se que o converte: do ObjectiveC vira converte_ no Python)

Fiz um screencast desse exemplo, disponvel no Youtube (como estava testando um trial do programa desculpem pela marca d'agua no video, selecione a qualidade de 720p, depois descobri que o QuickTime faz screencast mas j tinha feito :-( )

Espero que ajude quem pretende comear.