Alguns dias atrás comecei a mexer na muito falada (e que será adotada pelo Firefox) biblioteca de desenho vetorial Cairo, com o propósito de fazer um widget em PyGTK representando um heptágono cujos vértices pudessem ser movidos. Eventualmente passei um tempo aprendendo o básico até estancar num problema irritante, que pra variar tinha uma solução simples.
Para criar meu widget, chamado ValueWheel, precisei extender GtkDrawingArea e criar meus próprios métodos para interceptar alguns eventos, como “expose-event”, que acontece toda vez que uma janela, ou parte dela, precisa ser redesenhada. Quando clicava numa das bolinhas nos vértices e a arrastava, meu método que cuidava do “motion-notify-event” reposicionava a tal bolinha e redesenhava tudo. O grande problema é que esses redesenhos estavam muito lentos, com direito a piscada e tudo.
Bastante tempo depois, procurando no Google Code Search, descobri que o jeito certo de fazer a coisa não era ordenar o redesenho diretamente, e sim forçar a emissão do evento expose. Coloquei essas quatro linhas no método de movimento:
alloc = self.get_allocation()
rect = gtk.gdk.Rectangle(0, 0, alloc.width, alloc.height)
self.window.invalidate_rect(rect, True)
self.window.process_updates(True)
Era necessário apenas “invalidar” a área que foi redesenhada e avisar que um update era necessário, que magicamente o widget se redesenhou e sem piscar.
Aos interessados em Cairo eu recomendo:
E o código sobre o qual este post fala é esse: ValueWheel.py

Sábado, 17 Fevereiro 2007 at 6:13 pm
Olá Marcelo! Vou baixar o código em casa pra dar uma olhada. Uma perguntinha: É muito difícil trabalhar com Cairo? Tenho alguma experiência com PyGTK, mas só os widgets comuns.
Sábado, 17 Fevereiro 2007 at 7:06 pm
Olá Walter,
Cairo não é difícil, mas tem algumas nuances, como paths por exemplo, que vão formando um caminho por tudo que é desenhado, e você tem ter o cuidado de fechar um caminho se quiser preenchê-lo com alguma cor. Mas tudo faz sentido e a api é bem clara, além de a aparência geral ser muito boa, especialmente quando o desenho é redimensionado, então compensa o aprendizado.
Dá uma olhada nos exemplos pra ver algumas coisas possíveis:
http://cairographics.org/samples/
Está em C, mas a diferença pra Python é algo como:
* CAIRO_OPERATOR_ADD para cairo.OPERATOR_ADD
* cairo_set_source_rgb(context, 0,1,0); para context.set_source_rgb(0,1,0)
E re-recomendo os tutoriais “Cairo Tutorial for Python Programmers” e “Cairo Tutorial for PyGTK Programmers”.
Domingo, 18 Fevereiro 2007 at 4:21 pm
[...] Lira @ 4:21 pm Os valores manipulados na classe ValueWheel (que criei com Cairo e mencionei num post anterior) influenciam diretamente alguns valores derivados que deverão ser atualizados em tempo real. [...]
Sábado, 8 Dezembro 2007 at 1:53 am
[...] Como se viu acima PyGTK foi usado para interface; para os dados de raças, magias e habilidades, foi usado o banco de dados SQLite, que já vem embutido em Python, e é uma das coisas mais porretas que já se viu na Fenda do Biquíni; o widget de definição de atributos foi feito usando Cairo (que faz parte do GTK+), mas isso eu já expliquei num post anterior. [...]
Sábado, 14 Junho 2008 at 12:01 am
[...] as I was already a PyCairo enthusiast (that began by the time I read Aventuras no cairo by Marcelo Lira and, as pointed out by him, this other one), I decide to use it to draw my [...]