Primeiras impressões 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 intenção de aprender um pouco da programação de interface gráficas. Uma opção é 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 "idéia" 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 rápido foi a questão dos templates para criar um novo projeto em PyObjC. A versão que utilizo do XCode (3.2.1) não instala automaticamente, siga os passos aqui.

Resolvi fazer um programa bem simples para converter um número na base decimal para base hexadecimal. Isso em Python é feito com meia linha de código, mas o objetivo aqui é aprender como os componentes gráficos são acessados no código. Aprendi duas coisas importantes: outlets e actions.

No Interface Builder assim como no Qt Designer não fazemos código e sim a tela. Em alguns tutoriais você pode encontrar referência a interface gráfica como um arquivo com a extensão .nib contudo as versões mais novas possuem a extensão .xib (procurando diferenças, li que o .xib gera um XML ao passo que o .nib não) 

O código 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 criação da interface gráfica 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 conexões são 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. Atenção na ordem:

  • Outlets das caixas de texto:  clique no cubo e arraste para o componente, para cada selecione o outlet apropriado.
  • Action do botão: clique no botão 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 opção Write Update Class Files o problema foi resolvido (se você já escreveu alguma no código na classe Int2HexAppDelegate.py opte pelo Merge senão 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 código é bem simples para mostrar o conceito e também porque eu por enquanto não saberia fazer nada muito mais complexo que isso :p

O acesso as caixas de texto é feita pelas variáveis (outlet) edit_hexa e edit_int e a ação converte_ (lembre-se que o converte: do ObjectiveC vira converte_ no Python)

Fiz um screencast desse exemplo, disponível 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 começar.