<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>pygtk &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/pygtk/</link>
	<description>Feed of posts on WordPress.com tagged "pygtk"</description>
	<pubDate>Sat, 26 Jul 2008 14:58:00 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Threads com PyGTK]]></title>
<link>http://medeubranco.wordpress.com/?p=64</link>
<pubDate>Thu, 17 Jul 2008 03:39:04 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=64</guid>
<description><![CDATA[Já falei um pouco de thread em python; agora vamos falar de threads com pygtk.
Como uma introduçã]]></description>
<content:encoded><![CDATA[<p style="text-align:justify;">Já falei um pouco de thread em python; agora vamos falar de threads com pygtk.</p>
<p style="text-align:justify;">Como uma introdução, analise o código abaixo. Veja se lhe parece correto.</p>
<p>[sourcecode language='python']</p>
<p>#! /usr/bin/env python<br />
# -.- coding: utf-8 -.-<br />
import gtk<br />
import pygtk</p>
<p>continua=None<br />
def iniciar(botao, texto):<br />
    global continua<br />
    continua=True<br />
    x=0<br />
    while continua:<br />
        texto.set_text(str(x))<br />
        x+=1</p>
<p>def parar(botao):<br />
    global continua<br />
    continua=False</p>
<p># criando os componentes<br />
win=gtk.Window()<br />
box=gtk.VBox()<br />
texto=gtk.Entry()<br />
btinicia=gtk.Button("iniciar" )<br />
btpara=gtk.Button("interromper" )</p>
<p># ativando os eventos<br />
btinicia.connect("clicked", iniciar, texto)<br />
btpara.connect("clicked", parar)<br />
win.connect("destroy",gtk.main_quit)</p>
<p># encaixotando tudo<br />
box.pack_start(texto)<br />
box.pack_start(btinicia)<br />
box.pack_start(btpara)<br />
win.add(box)</p>
<p># exibindo tudo<br />
win.show_all()</p>
<p># iniciando o loop principal do GTK<br />
gtk.main()</p>
<p>[/sourcecode]</p>
<p style="text-align:justify;">O que deveria acontecer ao executar esse código? Uma janela com uma caixa de texto, um botão "iniciar" e um botão "interromper".</p>
<p style="text-align:justify;">Clicando no "iniciar", um loop inicia e começa a mudar o conteúdo da caixa de texto para "1", "2" e assim por diante até que se clique em "interromper".</p>
<p style="text-align:justify;">Se quiser executar o código, fique à vontade. Mas vou adiantar aqui que isso não vai dar certo. Ao clicar em "iniciar", o controle do programa passa para o loop sem fim, e você nem vê a caixa de texto sendo atualizada e nem consegue mais clicar no botão "interromper". Simplesmente seu programa pára de responder.</p>
<p style="text-align:justify;"><!--more-->Para que o programa funcione como esperado, é necessário criar uma thread onde será executada a função iniciar. A função então vai rodar em paralelo, e você assume de novo  o controle do programa.</p>
<p style="text-align:justify;"><span style="color:#ff0000;">************</span></p>
<p style="text-align:justify;">Atualização!</p>
<p style="text-align:justify;">Conforme o comentário do <a href="http://matias.archlinux-br.org/">thotypous</a>, é possível fazer esse código funcionar mesmo sem threads.</p>
<p style="text-align:justify;">Basta usar <code>while gtk.events_pending():gtk.main_iteration() </code> dentro do loop:</p>
<p style="text-align:justify;">
<p>[sourcecode language='python']</p>
<p>    while continua:<br />
        while gtk.events_pending():gtk.main_iteration()<br />
        texto.set_text(str(x))<br />
        x+=1<br />
[/sourcecode]</p>
<p style="text-align:justify;">Como o objetivo deste artigo é mostrar o uso de threads com pygtk, vamos tocar o barco.</p>
<p style="text-align:justify;"><span style="color:#ff0000;">************</span></p>
<p style="text-align:justify;">
<p style="text-align:justify;">Para utilizar threads em pygtk, além do que já aprendeu sobre threads  você vai ter que lembrar de duas coisinhas:</p>
<ul>
<li>iniciar threads do gtk com <a href="http://www.pygtk.org/docs/pygtk/gdk-functions.html#function-gdk--threads-init">gtk.gdk.threads_init</a></li>
<li>usar <a href="http://www.pygtk.org/docs/pygobject/gobject-functions.html#function-gobject--idle-add">gobject.idle_add</a> para permitir que códigos externos ao gtk.main_loop  possam modificar sua interface em pygtk.</li>
</ul>
<p><em>( referência: <a href="http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html">Using threads in PyGTK</a> )</em></p>
<p style="text-align:justify;">A função <code class="function">gobject.idle_add</code>( <em class="parameter"><code>callback, [argumentos para callback] </code></em>) adiciona uma função (especificada por <em class="parameter"><code>callback</code></em>) a ser chamada sempre que não houver eventos de prioridade mais alta para o main loop. Os argumentos para a função  <em class="parameter"><code>callback </code></em>são passados como argumentos adicionais de gobject.idle_add(). <em>(livre tradução da definição em <a href="http://www.pygtk.org/docs/pygobject/gobject-functions.html#function-gobject--idle-add">gobject.idle_add</a> )</em></p>
<p style="text-align:justify;">Vamos ver então como fazer o código apresentado lá em cima funcionar direito:</p>
<p>[sourcecode language='python']</p>
<p>from threading import Thread<br />
import time<br />
import gtk, gobject<br />
gtk.gdk.threads_init()<br />
a_thread=None</p>
<p>def iniciar(botao, texto):<br />
    global a_thread<br />
    #iniciando a thread<br />
    a_thread=Thread(target=nosso_loop, args=(texto,botao))<br />
    a_thread.morta=False<br />
    a_thread.start()</p>
<p>def nosso_loop(texto, botao):<br />
    # desabilitando o botao "iniciar"<br />
    # para que o usuario nao possa<br />
    # iniciar novas threads enquanto<br />
    # esta continuar<br />
    botao.set_sensitive(0)</p>
<p>    z=0<br />
    while not a_thread.morta:<br />
        z+=1<br />
        # chamando a funcao atualiza_texto<br />
        # com o idle_add<br />
        gobject.idle_add(atualiza_texto,texto, z)</p>
<p>        time.sleep(0.00001)<br />
    # o loop terminou<br />
    # o botao vai poder agora<br />
    # ser clicado de no:vo<br />
    botao.set_sensitive(1)</p>
<p>def atualiza_texto(texto, valor):<br />
    texto.set_text(str(valor))</p>
<p>def interromper(botao=None):<br />
    a_thread.morta=True</p>
<p>def sair(win):<br />
    interromper()<br />
    gtk.main_quit()</p>
<p>#criando os componentes<br />
win=gtk.Window()<br />
box=gtk.VBox()<br />
texto=gtk.Entry()<br />
botao=gtk.Button("iniciar" )<br />
btmata=gtk.Button("interromper" )</p>
<p>#ativando os eventos<br />
botao.connect("clicked", iniciar, texto)<br />
btmata.connect("clicked", interromper)<br />
win.connect("destroy",sair)</p>
<p>#encaixotando tudo<br />
box.pack_start(texto)<br />
box.pack_start(botao)<br />
box.pack_start(btmata)<br />
win.add(box)</p>
<p>#exibindo tudo<br />
win.show_all()</p>
<p>#iniciando o loop principal do GTK<br />
gtk.main()<br />
[/sourcecode]</p>
<p align="justify">Incluimos a thread neste código. A função "iniciar()" agora simplesmente inicia a thread. O loop infinito foi transferido para a função "nosso_loop()", que será executada pela thread.</p>
<p align="justify">A atualização da caixa de texto foi transferida para  a função "atualiza_texto()", que é executada com "gobject.idle_Add()".</p>
<p align="justify">Pode executar este código. Vai funcionar.</p>
<p align="justify">
]]></content:encoded>
</item>
<item>
<title><![CDATA[PyGtk text entry dialog]]></title>
<link>http://ardoris.wordpress.com/?p=16</link>
<pubDate>Sat, 05 Jul 2008 20:23:44 +0000</pubDate>
<dc:creator>jebavarde</dc:creator>
<guid>http://ardoris.wordpress.com/?p=16</guid>
<description><![CDATA[PyGtk doesn&#8217;t come with a pre-made prompt-for-a-string dialog, so I rolled my own.
Text entry ]]></description>
<content:encoded><![CDATA[<p>PyGtk doesn't come with a pre-made prompt-for-a-string dialog, so I rolled my own.</p>
[wp_caption id="attachment_17" align="alignnone" width="382" caption="Text entry dialog"]<a href="http://ardoris.files.wordpress.com/2008/07/dialog.png"><img src="http://ardoris.wordpress.com/files/2008/07/dialog.png" alt="Text entry dialog" width="382" height="173" class="size-full wp-image-17" /></a>[/wp_caption]
<p>The code follows:<br />
<!--more--><br />
[sourcecode language='python']<br />
#!/usr/bin/env python<br />
import gtk<br />
def responseToDialog(entry, dialog, response):<br />
	dialog.response(response)<br />
def getText():<br />
	#base this on a message dialog<br />
	dialog = gtk.MessageDialog(<br />
		None,<br />
		gtk.DIALOG_MODAL &#124; gtk.DIALOG_DESTROY_WITH_PARENT,<br />
		gtk.MESSAGE_QUESTION,<br />
		gtk.BUTTONS_OK,<br />
		None)<br />
	dialog.set_markup('Please enter your <b>name</b>:')<br />
	#create the text input field<br />
	entry = gtk.Entry()<br />
	#allow the user to press enter to do ok<br />
	entry.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)<br />
	#create a horizontal box to pack the entry and a label<br />
	hbox = gtk.HBox()<br />
	hbox.pack_start(gtk.Label("Name:"), False, 5, 5)<br />
	hbox.pack_end(entry)<br />
	#some secondary text<br />
	dialog.format_secondary_markup("This will be used for <i>identification</i> purposes")<br />
	#add it and show it<br />
	dialog.vbox.pack_end(hbox, True, True, 0)<br />
	dialog.show_all()<br />
	#go go go<br />
	dialog.run()<br />
	text = entry.get_text()<br />
	dialog.destroy()<br />
	return text<br />
if __name__ == '__main__':<br />
	print "The name was %s" % getText()<br />
	gtk.main()<br />
[/sourcecode]</p>
<p>In order to turn this into a password dialog, add in the part in bold:<br />
<code><br />
entry = gtk.Entry()<br />
<strong>entry.set_visibility(False)</strong><br />
#allow the user to press enter to do ok<br />
</code></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PyGameHouseAdmin sistema gerenciador de "casas de games"]]></title>
<link>http://codigobr.wordpress.com/?p=19</link>
<pubDate>Fri, 04 Jul 2008 02:21:09 +0000</pubDate>
<dc:creator>Carlos Marques</dc:creator>
<guid>http://codigobr.wordpress.com/?p=19</guid>
<description><![CDATA[Hoje adicionei mais um software na minha pagina de projetos pessoais, é um software pequeno escrito]]></description>
<content:encoded><![CDATA[<p>Hoje adicionei mais um software na minha pagina de projetos pessoais, é um software pequeno escrito em PyGTK, com banco de dados SQLite.</p>
<p>Para fins de administração de "games house", ainda está em faze inicial, mas já é funcional, até onde foi escrito.</p>
<p>O próximo passo é colocar alguma documentação, e melhorar um um pouco os recursos, acho que logo terei uma versão final.</p>
<p>aos interessados fiquem de olho na pagina do projeto no Google Code</p>
<p>http://code.google.com/p/pygamehouseadmin/</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Remote Clipboard]]></title>
<link>http://balajirrao.wordpress.com/?p=55</link>
<pubDate>Wed, 02 Jul 2008 20:26:50 +0000</pubDate>
<dc:creator>balajirrao</dc:creator>
<guid>http://balajirrao.wordpress.com/?p=55</guid>
<description><![CDATA[When I was using my GNOME desktop from inside a guest running on top of KVM, suddenly an idea struck]]></description>
<content:encoded><![CDATA[<p>When I was using my GNOME desktop from inside a guest running on top of <a href="http://kvm.qumranet.com/kvmwiki">KVM</a>, suddenly an idea struck me, about a couple of hours ago - "To allow copy and paste between the guest and the host". It would be a very valuable feature to have, I thought.</p>
<p>Deciding to hack a quick solution, I came up with the following in around two hours. It works only one way for the moment. The guest(virtual machine) is the server and the host is the client i.e, you will only be able to copy from the host and paste it into the guest. And it works only with text now.</p>
<p>In the guest, ( please change the IP address appropriately )</p>
<p>[sourcecode language='python']<br />
#!/usr/bin/python<br />
#Run this in the guest<br />
import socket,gtk</p>
<p>clip = gtk.Clipboard(display=gtk.gdk.display_get_default(), selection="CLIPBOARD" )</p>
<p>serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
serversocket.bind(("192.168.1.2", 7070))<br />
serversocket.listen(1)</p>
<p>while (True):<br />
	(clientsocket, address) = serversocket.accept()<br />
	clip.set_text(clientsocket.recv(100));<br />
	clip.store()<br />
	clientsocket.close();</p>
<p>serversocket.close()<br />
[/sourcecode]</p>
<p>And in the host,</p>
<p>[sourcecode language='python']<br />
#!/usr/bin/python<br />
import gtk,time,socket</p>
<p>clip = gtk.Clipboard(display=gtk.gdk.display_get_default(), selection="CLIPBOARD" )<br />
while (True):<br />
	prev = clip.wait_for_text()<br />
	while (prev == (clip.wait_for_text())):<br />
		time.sleep(1)</p>
<p>	prev = clip.wait_for_text()<br />
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
	s.connect(("192.168.1.2", 7070))<br />
	s.send(prev)<br />
	s.close()<br />
s.close()<br />
[/sourcecode]</p>
<p>With this program, I've copy-pasted across two machines in a network! Very powerful isn't it ? Its really surprising too see what around 35 lines of python can do. Though I had studied a bit of python a few years ago, this one small hack has made me fall into love with python again. Its an awesome language. Extremely powerful.</p>
<p>This program uses something called pygtk, which are python extensions for GTK. You can write GTK programs using python.</p>
<p>I wish to develop this further to the extent of copying files, images and other rich content across machine boundaries. Though it probably will be criticised for being bad from a security point of view, it will definitely be useful for users of KVM, XEN and other users of virtual machine monitors.</p>
<p>Happy hacking!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mais DrawingArea, Orientação a objetos e herança (e glade)]]></title>
<link>http://medeubranco.wordpress.com/?p=38</link>
<pubDate>Mon, 30 Jun 2008 03:14:50 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=38</guid>
<description><![CDATA[
Este artigo mistura um pouco de tudo o que foi visto nos artigos anteriores:
Criando uma simples ja]]></description>
<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-45" src="http://medeubranco.wordpress.com/files/2008/06/desenho.png" alt="" /></p>
<p>Este artigo mistura um pouco de tudo o que foi visto nos artigos anteriores:</p>
<p><a href="http://medeubranco.wordpress.com/2008/06/07/criando-uma-simples-janela-com-pygtk/">Criando uma simples janela em PyGTK</a><br />
<a href="http://medeubranco.wordpress.com/2008/06/10/criando-uma-simples-janela-em-pygtk-parte-ii/">Criando uma simples janela em PyGTK - parte II</a><br />
<a href="http://medeubranco.wordpress.com/2008/06/15/drawingarea-desenhando-na-tela-com-pygtk/">DrawingArea - Desenhando na tela com PyGTK</a><br />
<a href="http://medeubranco.wordpress.com/2008/06/22/orientacao-a-objetos-com-python-para-iniciantes/">Orientação a Objetos com python</a><br />
<a href="http://medeubranco.wordpress.com/2008/06/22/heranca-orientacao-a-objetos-com-python/">Orientação a Objetos - Herança</a></p>
<p>Como aqui vamos usar o Glade, recomendo também uma visita ao blog do OgMaciel:</p>
<p><a href="http://blog.ogmaciel.com/?p=413">Vídeo Aula: Programando com Python e Glade</a></p>
<p><a href="http://blog.ogmaciel.com/?p=415">Vídeo Aula: Trabalhando com o Glade</a></p>
<p>Não deixe de ver também <a href="http://www.cin.ufpe.br/~cinlug/wiki/index.php/Mantendo_A_Sanidade_Com_O_Glade">Mantendo A Sanidade Com O Glade</a>.</p>
<p>Neste artigo vamos criar um programa em que você pode desenhar um polígono desenhando com o mouse.</p>
<p>Para isso, vamos estender a classe gtk.DrawingArea através da herança. Nossa classe estendida vai ser um DrawingArea com recursos que nós vamos adicionar.</p>
<p>Paralelamente, vamos fazer uma janela com o glade, um código que vai exibir a janela inserindo nela a nossa classe filha de DrawingArea.</p>
<p>A nossa classe tela herdando de DrawingArea:</p>
<p>[sourcecode language='python']</p>
<p>import gtk</p>
<p># do modulo gtk, importamos DrawingArea e vamos chamar de 'DA'<br />
from gtk import DrawingArea as DA</p>
<p>class tela(DA):<br />
    def __init__(self):<br />
        # executanto o construtor da classe pai (DrawingArea)<br />
        DA.__init__(self)<br />
[/sourcecode]</p>
<p>Agora temos uma classe que faz tudo o que um DrawingArea faz. Podemos acrescentar recursos a ela.</p>
<p>Enquanto isso, vamos fazer a GUI no glade:<br />
- crie uma janela;</p>
<p>- adicione uma "Caixa Vertical" (<strong>Vbox</strong>) com três itens;</p>
<p>- adicione um Rótulo (<strong>Label</strong>) na primeira seção da Caixa Vertical;</p>
<p>- em<strong> <em>Empacotamento</em></strong>, mude para <strong>"não</strong>" as opções <strong><em>Expandir</em></strong> e <strong><em>Preencher</em></strong>;</p>
<p>- adicione um botão e em Geral mude o nome para 'botão1' (é, poderia ter ficado Button1 mesmo);</p>
<p>- em<strong> <em>Empacotamento</em></strong>, mude para <strong>"não</strong>" as opções <strong><em>Expandir</em></strong> e <strong><em>Preencher</em></strong>;</p>
<p>- no espaço do meio, adicione  uma 'Porta de Visualização'  (ViewPort) ;</p>
<p>- mude o nome da ViewPort para 'caixatela'</p>
<p>- explore as outras opções de configuração dos widgets</p>
<p style="text-align:center;">Sua janela deve ficar quase assim:<br />
<a href="http://medeubranco.wordpress.com/files/2008/06/gladebglade.png"><img class="aligncenter size-medium wp-image-44" src="http://medeubranco.wordpress.com/files/2008/06/gladebglade.png?w=300" alt="" width="448" height="305" /></a></p>
<p><a href="http://medeubranco.wordpress.com/files/2008/06/glade-02.png"><br />
</a></p>
<p>Voltemos à nossa classe.</p>
<p>O nosso widget será usado da seguinte forma:</p>
<p>Você pressiona o botão esquerdo do mouse sobre o widget e mantém pressionado. Arrasta então o ponteiro do mouse pela tela; uma linha será desenhada por onde passar o ponteiro. Ao soltar o botão do mouse, a linha se fechará em um polígono.</p>
<p>Ao Rolar a 'rodinha' do mouse, os últimos pontos do polígono serão removidos; continue rolando a rodinha que o polígono desaparecerá.</p>
<p>Temos então três eventos envolvidos na criação do desenho: botão pressionado, movimento do mouse e botão solto (<em>'button-press-event'</em>, <em>'button-release-event'</em> e<em> 'motion-notify-event'</em> ). Um quarto evento, o de rolagem da rodinha ('scroll-event' ), está envolvido na operação de remover pontos do polígono.</p>
<p>[sourcecode language='python']</p>
<p>class tela(DA):<br />
    def __init__(self):<br />
        DA.__init__(self)<br />
        self.definecores()</p>
<p>        # atributo que determina se o botão está pressionado<br />
        self.apertou=False</p>
<p>        # conectando o expose-event a uma função<br />
        # que vai pedir que a tela seja redesenhada<br />
        self.connect('expose-event',self.expose)</p>
<p>        # adicionando os eventos de mouse<br />
        self.add_events(gtk.gdk.BUTTON_PRESS_MASK &#124;<br />
            gtk.gdk.BUTTON_RELEASE_MASK &#124;<br />
            gtk.gdk.MOTION_NOTIFY &#124;<br />
            gtk.gdk.POINTER_MOTION_MASK<br />
            )</p>
<p>        # conectando cada evento à sua função correspondente</p>
<p>        # botão de mouse pressionado<br />
        self.connect('button-press-event',self.clica)<br />
        # soltando o botão<br />
        self.connect('button-release-event',self.solta)<br />
        # movimento de mouse<br />
        self.connect('motion-notify-event',self.arrasta)<br />
        # rolando a 'rodinha'<br />
        self.connect('scroll-event',self.rolou)</p>
<p>        # criando uma lista vazia<br />
        # que vai conter os pontos da linha a ser desenhada<br />
        # ou o polígono<br />
        # cada ponto será uma tupla<br />
        # com as coordenadas (x,y)<br />
        self.linha=[]</p>
<p>[/sourcecode]</p>
<p>Olhe o código acima, nas linhas 23, 25, 27 e 29. Quatro funções terão que ser definidas. Vejamos o que cada uma deve fazer:</p>
<p>-<strong> self.clica</strong></p>
<ul>
<li>mudar a variável <em>self.apertou</em> para <em>True</em></li>
<li>adicionar o primeiro ponto (as coordenadas do clique) à lista self.linha</li>
</ul>
<p>- <strong>self.arrasta</strong></p>
<ul>
<li>se self.apertou é True, adiciona mais um ponto À lista e desenha o último segmento.</li>
</ul>
<p>- <strong>self.solta</strong></p>
<ul>
<li>mudar a variável <em>self.apertou</em> para <em>False</em></li>
</ul>
<p><strong>- self.rolou</strong></p>
<ul>
<li>remover o último ponto da lista e mandar a tela ser redesenhada</li>
</ul>
<p>[sourcecode language='python']<br />
    def solta(self, tela, evento):<br />
        self.apertou=False<br />
        self.desenha()</p>
<p>    def clica(self, tela, evento):<br />
        if evento.button==3:<br />
            self.linha.pop()<br />
            return<br />
        self.linha.append((evento.x,evento.y))<br />
        self.apertou=True</p>
<p>    def rolou(self,tela,evento):<br />
        try:<br />
            self.linha.pop()<br />
            self.desenha()<br />
        except:<br />
            pass</p>
<p>    def arrasta(self,tela,evento):<br />
        if self.apertou:<br />
            self.linha.append((evento.x,evento.y))</p>
<p>[/sourcecode]</p>
<p style="text-align:center;">Movendo o mouse com o botão pressionado<a href="http://medeubranco.wordpress.com/files/2008/06/pintor1.png"><img class="aligncenter size-medium wp-image-42" src="http://medeubranco.wordpress.com/files/2008/06/pintor1.png?w=300" alt="" width="396" height="306" /></a></p>
<p style="text-align:center;">
<p style="text-align:center;">Após soltar o botão<a href="http://medeubranco.wordpress.com/files/2008/06/pintor2.png"><img class="aligncenter size-medium wp-image-43" src="http://medeubranco.wordpress.com/files/2008/06/pintor2.png?w=300" alt="" width="392" height="303" /></a></p>
<p style="text-align:center;">
<p style="text-align:left;">O código completo da classe:</p>
<p style="text-align:left;">
<p>[sourcecode language='python']</p>
<p>import gtk<br />
from gtk import DrawingArea as DA</p>
<p>class tela(DA):<br />
    def __init__(self):<br />
        DA.__init__(self)<br />
        self.definecores()</p>
<p>        self.apertou=False<br />
        self.connect('expose-event',self.expose)<br />
        self.add_events(gtk.gdk.BUTTON_PRESS_MASK &#124;<br />
            gtk.gdk.BUTTON_RELEASE_MASK &#124;<br />
            gtk.gdk.MOTION_NOTIFY &#124;<br />
            gtk.gdk.POINTER_MOTION_MASK<br />
            )<br />
        self.connect('button-press-event',self.clica)<br />
        self.connect('button-release-event',self.solta)<br />
        self.connect('motion-notify-event',self.arrasta)<br />
        self.connect('scroll-event',self.rolou)<br />
        self.linha=[]</p>
<p>    def definecores(self):<br />
        self.verde=gtk.gdk.Color(0,48255,0,0)<br />
        self.preto=gtk.gdk.Color(0,0,0,0)<br />
        self.branco=gtk.gdk.Color(65535,65535,65535,0)<br />
        self.vermelho=gtk.gdk.Color(65535,0,0,0)<br />
        self.amarelinho=gtk.gdk.Color(35535,65333,15000,0)<br />
        self.outra=gtk.gdk.Color(0,65535,65535,0)<br />
        self.azul=gtk.gdk.Color(0,0,65535,0)</p>
<p>    def desenhaultimo(self):<br />
        if len(self.linha)>1:<br />
            x1=int(self.linha[-2][0])<br />
            y1=int(self.linha[-2][1])<br />
            x2=int(self.linha[-1][0])<br />
            y2=int(self.linha[-1][1])</p>
<p>            self.gc.set_rgb_fg_color(self.vermelho)<br />
            self.window.draw_line(self.gc,x1,y1,x2,y2)</p>
<p>            self.gc.set_rgb_fg_color(self.preto)<br />
            self.window.draw_rectangle(self.gc,False,x1-1,y1-1,2,2,)<br />
            self.window.draw_rectangle(self.gc,False,x2-1,y2-1,2,2,)</p>
<p>    def solta(self, tela, evento):<br />
        self.apertou=False<br />
        self.desenha()</p>
<p>    def clica(self, tela, evento):<br />
        if evento.button==3:<br />
            self.linha.pop()<br />
            return<br />
        self.linha.append((evento.x,evento.y))<br />
        self.apertou=True</p>
<p>    def rolou(self,tela,evento):<br />
        try:<br />
            self.linha.pop()<br />
            self.desenha()<br />
        except:<br />
            pass</p>
<p>    def arrasta(self,tela,evento):<br />
        if self.apertou:<br />
            self.linha.append((evento.x,evento.y))<br />
            self.desenhaultimo()</p>
<p>    def apaga(self):<br />
        for pt in self.linha:<br />
            print pt<br />
        self.linha=[]<br />
        self.desenha()</p>
<p>    def desenha(self):<br />
        a,b,c,d = self.get_allocation()<br />
        self.gc.set_rgb_fg_color(self.branco)<br />
        self.window.draw_rectangle(self.gc,True,0,0,c-1,d-1)</p>
<p>        if len(self.linha)>0:<br />
            self.gc.set_rgb_fg_color(self.amarelinho)<br />
            self.window.draw_polygon(self.gc,True, self.linha)<br />
            self.gc.set_rgb_fg_color(self.preto)<br />
            self.window.draw_polygon(self.gc,False, self.linha)</p>
<p>        self.gc.set_rgb_fg_color(self.preto)<br />
        self.window.draw_rectangle(self.gc, False,2,2,c-4,d-4 )<br />
        for pt in self.linha:<br />
            self.window.draw_rectangle(self.gc, False,pt[0]-1, pt[1]-1,2,2)</p>
<p>    def expose(self,tela, evento):<br />
        self.gc=self.get_style().fg_gc[gtk.STATE_NORMAL]<br />
        self.gc.set_rgb_fg_color(self.branco)<br />
        self.desenha()</p>
<p>[/sourcecode]</p>
<p style="text-align:left;">Para entender as operações de desenho, veja o artigo anterior: <a href="http://medeubranco.wordpress.com/2008/06/15/drawingarea-desenhando-na-tela-com-pygtk/">DrawingArea - Desenhando na tela com PyGTK</a></p>
<p style="text-align:left;">Salve este código como desenha.py</p>
<p style="text-align:left;">Salve seu projeto no Glade como parapintar.glade</p>
<p style="text-align:left;">E execute o código abaixo, que vai reunir tudo:</p>
<p>[sourcecode language='python']</p>
<p>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
"""<br />
Código parcialmente reaproveitado<br />
do código exemplo do OgMaciel<br />
em http://blog.ogmaciel.com/?p=413<br />
"""</p>
<p>import desenha<br />
try:<br />
    import pygtk<br />
    pygtk.require( "2.0" )<br />
except:<br />
    pass<br />
try:<br />
    import gtk<br />
    import gtk.glade<br />
except:<br />
    sys.exit(1)</p>
<p>class Janelao(object):<br />
    """<br />
    Janela criada com o Glade<br />
    """</p>
<p>    def __init__(self):<br />
        self.xml = gtk.glade.XML( "parapintar.glade" )<br />
        self.xml.signal_autoconnect(self)</p>
<p>        self.mainWindow = self.xml.get_widget( 'window1' )<br />
        self.mainWindow.set_title( "Pintor" )</p>
<p>        # puxando a ViewPort criado no glade<br />
        self.caixa=self.xml.get_widget( 'caixatela' )<br />
        self.mainWindow.connect('destroy', gtk.main_quit)</p>
<p>        self.botao = self.xml.get_widget( 'botao1' )</p>
<p>        # criando uma instancia do nosso objeto<br />
        self.tela=desenha.tela()<br />
        #inserindo nosso objeto na viewport<br />
        self.caixa.add(self.tela)</p>
<p>        self.botao.connect("clicked",self.apagar_tela)<br />
        self.tela.show()<br />
        self.mainWindow.show_all()</p>
<p>    def apagar_tela(self,botao):<br />
        self.tela.apaga()</p>
<p>if __name__ == "__main__":<br />
    w = Janelao()<br />
    gtk.main()<br />
[/sourcecode]</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PyL2Catalogo - Arquivo se senhas]]></title>
<link>http://codigobr.wordpress.com/?p=14</link>
<pubDate>Thu, 26 Jun 2008 13:26:51 +0000</pubDate>
<dc:creator>Carlos Marques</dc:creator>
<guid>http://codigobr.wordpress.com/?p=14</guid>
<description><![CDATA[Quando comecei a aprender PyGTK eu pensei em criar um programa simples para salvar os dados de Login]]></description>
<content:encoded><![CDATA[<p>Quando comecei a aprender PyGTK eu pensei em criar um programa simples para salvar os dados de Login e Senha dos vários servidores de Lineage 2 que eu jogava, como eram vários servidores e varias contas de usuário por servidor era fácil de esquecer.</p>
<p>Então comecei um projeto chamado PyL2Catalogo, criei uma interface no Glade e comecei a escrever o código, isso ja faz algum tempo e o programa esta perdido dentro de um pendrive, mas agora vou disponibilizar eles para que quem quiser aprender a usar PyGTK com Glade possa aproveitar.<br />
Como não é possivel upar um arquivo compactado para o wordpress, vou coloar o arquivo no grupo PyGTK-Brasil e vou deixar só o link aqui para quem quiser pegar.</p>
<p><a title="PyL2Catalogo.zip" href="http://pygtk-brasil.googlegroups.com/web/PyL2Catalogo.zip">PyL2Catalogo.zip</a></p>
<p>E um screenshot para quem quiser conferir antes de baixar</p>
<p><a href="http://codigobr.wordpress.com/files/2008/06/pyl2catalogo.png"><img class="aligncenter size-full wp-image-15" src="http://codigobr.wordpress.com/files/2008/06/pyl2catalogo.png" alt="" width="499" height="269" /></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Gerar senha aleatória em Python (PyGTK)]]></title>
<link>http://codigobr.wordpress.com/?p=6</link>
<pubDate>Mon, 23 Jun 2008 20:17:47 +0000</pubDate>
<dc:creator>Carlos Marques</dc:creator>
<guid>http://codigobr.wordpress.com/?p=6</guid>
<description><![CDATA[Hoje eu resolvi escrever um script para gerar senhas aleatórias, e depois que o script ficou pronto]]></description>
<content:encoded><![CDATA[<p>Hoje eu resolvi escrever um script para gerar senhas aleatórias, e depois que o script ficou pronto eu decidi que ele precisava de uma interface grafica.</p>
<p>Então comecei a criar uma interface em GTK</p>
<p>e o resultado é o que vocês vão ver agora</p>
<p>[sourcecode language='python']</p>
<p>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*</p>
<p>"""<br />
# Script para gerar senhas aleatórias<br />
# Por: Carlos Henrique Marques da Cunha Filho<br />
# E-mail: rickadt@gmail.com<br />
# Site: http://codigobr.wordpress.com/<br />
# Versão 0.1<br />
"""</p>
<p>import pygtk<br />
pygtk.require("2.0" )<br />
import gtk<br />
from random import choice</p>
<p>##########<br />
##########<br />
class senhaForte:<br />
    ##########<br />
    ### Função construtora da classe<br />
    def __init__(self):<br />
        " Definindo as propriedades da janela "<br />
        self.janela = gtk.Window(gtk.WINDOW_TOPLEVEL)<br />
        self.janela.set_position(gtk.WIN_POS_CENTER)<br />
        self.janela.set_title('Senha Forte' )<br />
        self.janela.set_size_request(300, 300)<br />
        self.janela.set_resizable(False)</p>
<p>        " Adicionando os wigets a janela "<br />
        self.fixed = gtk.Fixed()<br />
        self.janela.add(self.fixed)</p>
<p>        self.fixed.put(gtk.Label('Tamanho da senha: '), 50, 40)<br />
        self.txtTamanho = gtk.Entry()<br />
        self.txtTamanho.set_size_request(200, 30)<br />
        self.fixed.put(self.txtTamanho, 50, 60)</p>
<p>        self.btGerar = gtk.Button('Gerar senha' )<br />
        self.btGerar.set_size_request(200, 50)<br />
        self.btGerar.connect('clicked', self.gerarSenha)<br />
        self.fixed.put(self.btGerar, 50, 120)</p>
<p>        self.fixed.put(gtk.Label('Senha: ' ), 50, 200)<br />
        self.txtSenha = gtk.Entry()<br />
        self.txtSenha.set_size_request(200, 30)<br />
        self.fixed.put(self.txtSenha, 50, 220)</p>
<p>        #conectando a janela aos destrutores para finalizar o programas<br />
        self.janela.connect('delete_event', self.deleteEvento)<br />
        self.janela.connect('destroy', self.sair)</p>
<p>        #Montra tudo na tala<br />
        self.janela.show_all()<br />
    ##########</p>
<p>    ##########<br />
    ### Função que gera a senha aleatoriamente<br />
    def gerarSenha(self, widget):<br />
        tamanho = self.txtTamanho.props.text<br />
        try:<br />
            tamanho = int(tamanho)<br />
        except:<br />
            texto = 'Digite um numero inteiro no campo "Tamanho da senha" '<br />
            msg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, texto)<br />
            msg.set_position(gtk.WIN_POS_CENTER)<br />
            msg.run()<br />
            msg.destroy()<br />
        else:<br />
            chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"<br />
            senha = ""<br />
            for char in xrange(tamanho):<br />
                senha += choice(chars)<br />
            self.txtSenha.props.text = senha<br />
    ##########</p>
<p>    ##########<br />
    def main(self):<br />
        gtk.main()<br />
    def deleteEvento(self, widget, event):<br />
        return False<br />
    def sair(self, widget):<br />
        gtk.main_quit()<br />
    ##########</p>
<p>if __name__ == "__main__":<br />
    senhaForte = senhaForte()<br />
    senhaForte.main()</p>
<p>[/sourcecode]</p>
<p>Para executar este script é muito simples.</p>
<p>no Linux basta salvar em um arquivo .py e executar no terminal com o comanto</p>
<p>$ python arquivo.py</p>
<p>No Windows salve o arquivo como .pyw e execute com um duplo click, mas é nescessário ter o Python o GTK e o PyGTK instalados na maquina</p>
<p>A pedido do Rodrigo Araujo coloquei uma screenshot</p>
<p><a href="http://codigobr.wordpress.com/files/2008/06/senhaforte.png"><img class="aligncenter size-full wp-image-9" src="http://codigobr.wordpress.com/files/2008/06/senhaforte.png" alt="" width="308" height="328" /></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[lexadrez - programa exemplo com pygtk]]></title>
<link>http://medeubranco.wordpress.com/?p=27</link>
<pubDate>Wed, 18 Jun 2008 01:26:21 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=27</guid>
<description><![CDATA[Para quem acompanhou os tutoriais de PyGTK deste blog e queria ver um programa mais completo usando ]]></description>
<content:encoded><![CDATA[<p align='justify'>Para quem acompanhou os tutoriais de PyGTK deste blog e queria ver um programa mais completo usando  drawingArea e outras graças do GTK, eu posso oferecer o programa que escrevi um tempo atrás para rever as partidas de xadrez que eu jogava no yahoo!.</p>
<p align='justify'>Enquanto escrevia, resolvi que o software poderia ser também uma ferramenta para estudar aberturas, e preparei ele para isso.</p>
<p align='justify'>Coloquei o programa no <a href="http://codigolivre.org.br">codigolivre</a> :<br />
<a href="http://lexadrez.codigolivre.org.br/">lexadrez.codigolivre.org.br</a></p>
<p>Como o codigolivre vira e mexe está inacessível, passo o link para baixar direto o código:<br />
<a href="http://saltador.uspnet.usp.br/pub/lexadrez/lexadrez/lexadrez-0.001/lexadrez-0.001.tar.gz">lexadrez-0.001.tar.gz</a></p>
<p>O programa exibindo a Ruy Lopes:</p>
<p><a href="http://medeubranco.files.wordpress.com/2008/06/lexadrez.png"><img src="http://medeubranco.wordpress.com/files/2008/06/lexadrez.png?w=300" alt="Exibindo a Ruy Lopes" width="300" height="248" class="alignnone size-medium wp-image-28" /></a></p>
<p align='justify'>O código foi todo orientado a objetos. As classes estão mais ou menos documentadas, experimente usar o pydoc pelo terminal, no diretório do programa.</p>
<p align='justify'>Acho que poderia ter sido melhor escrito em vários aspectos: o parser para leitura do jogo está muito <a href="http://desciclo.pedia.ws/wiki/POG">POG</a>, as classes são muito dependentes umas das outras, entre outras coisas. Não coloquei o recurso de gravar as aberturas diretamente no programa; se alguém quiser fazê-lo, não está difícil.</p>
<p>Recursos funcionando:</p>
<ul>
<li>exibe jogos e aberturas no formato do yahoo!</li>
<li>permite movimentar as peças de acordo com as regras do xadrez</li>
<li>edita e salva comentários nas partidas e aberturas</li>
</ul>
<p align='justify'>Se você tem mais experiência em OOP, gostaria saber quais "regras" da boa programação eu violei, e de que forma o código poderia ter sido melhor escrito. Juro que não fico chateado. Use e abuse dos comentários.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PyGTK - Janela simples (gtk.Window)]]></title>
<link>http://codigobr.wordpress.com/?p=4</link>
<pubDate>Tue, 17 Jun 2008 12:22:11 +0000</pubDate>
<dc:creator>Carlos Marques</dc:creator>
<guid>http://codigobr.wordpress.com/?p=4</guid>
<description><![CDATA[Olá a todos, este é o primeiro de uma série de exemplos de como usar Python+GTK.
Vamos criar agor]]></description>
<content:encoded><![CDATA[<p>Olá a todos, este é o primeiro de uma série de exemplos de como usar Python+GTK.</p>
<p>Vamos criar agora uma janela simples sem nada dentro</p>
<p>Bem pessoal no Python a identação do código deve estar correta, por exemplo um "TAB" não é igual a 4 espaços então se você simplesmente copiar este código e colar em um editor, talvez ele retorne um erro de identação.</p>
<p>[sourcecode language='python']<br />
#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-</p>
<p>import pygtk #importa o módulo pygtk<br />
pygtk.require('2.0' ) #requere versão 2.0 ou superior<br />
import gtk</p>
<p>class Janela:<br />
    def __init__(self):<br />
        self.janela = gtk.Window(gtk.WINDOW_TOPLEVEL) #Cria a janela<br />
        self.janela.set_position(gtk.WIN_POS_CENTER) #seta sua posição no centro da tela<br />
        self.janela.set_title('Janela em PyGTK' ) #seta seu título<br />
        self.janela.set_size_request(400, 300) #seta o tamanho da janela<br />
        self.janela.set_resizable(False) #isto bloqueia a janela para mudar seu tamanho</p>
<p>        #conectando a janela aos destrutores para finalizar o programas<br />
        self.janela.connect('delete_event', self.deleteEvento)<br />
        self.janela.connect('destroy', self.sair)</p>
<p>        #Montra tudo na tala<br />
        self.janela.show_all()</p>
<p>    def deleteEvento(self, widget, event, data=None):<br />
        return False</p>
<p>    def sair(self, widget, data=None):<br />
        gtk.main_quit()</p>
<p>    def main(self):<br />
        gtk.main()</p>
<p>if __name__ == "__main__":<br />
    Janela = Janela()<br />
    Janela.main()<br />
[/sourcecode]</p>
<p>O Resultado sera parecido com o da imagem abaixo(parecido porque vai aparecer com o seu tema do GTK)<br />
<a href="http://codigobr.wordpress.com/files/2008/06/janela_em_pygtk.png"><img class="aligncenter size-medium wp-image-7" src="http://codigobr.wordpress.com/files/2008/06/janela_em_pygtk.png?w=300" alt="" width="300" height="243" /></a></pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[DrawingArea - Desenhando na tela com PyGTK]]></title>
<link>http://medeubranco.wordpress.com/?p=24</link>
<pubDate>Sun, 15 Jun 2008 05:35:14 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=24</guid>
<description><![CDATA[Nos artigos anteriores sobre PyGTK, eu apresentei quatro widgets básicos:

 gtk.Window - uma janela]]></description>
<content:encoded><![CDATA[<p>Nos artigos anteriores sobre PyGTK, eu apresentei quatro widgets básicos:</p>
<ul>
<li> gtk.Window - uma janela</li>
<li> gtk.VBox - um container para acomodar os widgets</li>
<li> gtk.Button - botão</li>
<li> gtk.Label - uma etiqueta para texto</li>
</ul>
<p>Muitos outros widgets básicos não foram nem mencionados, como o gtk.Entry (caixa de texto), gtk.TreeView (lista em árvore), gtk.Toolbar (barra de ferramentas), entre outros.</p>
<p>Acontece que não vou mostrar nenhum deles aqui ainda.</p>
<p>Vamos falar de um componente que é menos usado nas aplicações em geral mas é muito útil. É o gtk.DrawingArea, Uma simples janela X onde podemos desenhar qualquer coisa, inclusive quadrados verdes com borda preta, de 50x50 pixels. E é exatamente isso que vamos fazer aqui.<br />
Vamos construir, passo a passo, uma janela que contem uma área de desenho (DrawingArea) e um botão. Vamos chamar a área de desenho de tela.<br />
A cada clique de mouse na tela, um quadrado verde é desenhado, tendo como centro o ponto clicado.</p>
<p>O botão vai limpar a tela.</p>
<p>Se você ainda não sabe como criar uma janela em PyGTK, leia primeiro esses dois pequenos artigos:</p>
<p><a href="http://medeubranco.wordpress.com/2008/06/07/criando-uma-simples-janela-com-pygtk/"> Criando uma simples janela com pygtk</a><br />
<a href="http://medeubranco.wordpress.com/2008/06/10/criando-uma-simples-janela-em-pygtk-parte-ii/"> Criando uma simples janela em pygtk - parte II</a></p>
<p>O grande astro da noite é a <strong>gtk.DrawingArea</strong>. Então vamos criar nossa tela:</p>
<pre>[sourcecode language='python']
tela=gtk.DrawingArea()
[/sourcecode]</pre>
<p>Como deveríamos saber, interfaces gráficas trabalham com eventos, como cliques em um botão, cliques e movimentos de mouse, teclas pressionadas, janelas arrastadas, minimizadas, escondidas por outras, etc.  O usuário simplesmente dispara os eventos, o programador cuida de criar respostas a eles. Para uma <strong>DrawingArea</strong> um evento importante é o <em><strong>expose-event</strong></em>, disparado quando a tela é reexibida. Se a tela estava oculta, quando ela volta a aparecer precisa ser redesenhada, então vamos conectar o <em><strong>expose-event</strong></em> à função que vai desenhar os nossos preciosos quadrados verdes:</p>
<pre>[sourcecode language='python']
tela.connect('expose-event',desenha)
[/sourcecode]</pre>
<p>Outro evento importante para o nosso programa é o <em><strong>button-press-event</strong></em>, disparado quando você clica na tela com o mouse; mas este evento não está configurado, então vamos adicioná-lo à nossa tela, e então fazer a conexão com a função que vai criar nossos imprescindíveis quadrados verdes:</p>
<pre>[sourcecode language='python']
tela.add_events( gtk.gdk.BUTTON_PRESS_MASK )
tela.connect('button-press-event',cria_quadrado)
[/sourcecode]</pre>
<p>Não nos esqueçamos do objetivo deste programa: criar quadrados verdes. Os quadrados serão armazenados em uma lista. Listas são um tipo de dados que o Python nos provê. Criaremos a lista de quadrados:</p>
<pre>[sourcecode language='python']
quadrados=[]
[/sourcecode]</pre>
<p>Agora a coisa começa a ficar mais interessante. Dê uma olhada na função <strong>criar_quadrado()</strong>, que será executada a cada clique na tela:</p>
<pre>[sourcecode language='python']
def cria_quadrado(tela,evento):
    global quadrados
    coor=evento.get_coords()
    x=coor[0]
    y=coor[1]
    novo_quadrado=[ x-25 , y-25 , 50 , 50 ]
    quadrados.append(novo_quadrado)
    desenha(tela,None)

[/sourcecode]</pre>
<p>A função recebe dois parâmetros: a tela onde ocorreu o evento, e o evento propriamente dito.</p>
<p>A segunda linha da função declara como global a lista de quadrados, ou seja, um objeto criado fora da função pode ser acessado de dentro dela sem ter sido passado como parâmetro.</p>
<p>A terceira linha pega as coordenadas do evento. O ponto exato onde ocorreu o clique. O método get_coords() retorna uma tupla com as coordenadas X e Y. Assim: (X,Y).</p>
<p>A quarta e quinta linhas criam duas variáveis para conter os valores da tupla.</p>
<p>A sexta linha finalmente cria o nosso quadrado (não desenha, só cria) e a sétima o adiciona à lista de quadrados. O quadrado, então, nada mais é que uma outra lista contendo as coordenadas de inicio, a largura e a altura.</p>
<p>Vamos analisar melhor o quadrado criado:<br />
<strong></strong></p>
<p><strong> x-25</strong> : é o primeiro item da lista. Indica a coordenada X do canto superior esquerdo do quadrado.<br />
<strong></strong></p>
<p><strong>y-25</strong>: é o segundo item da lista e indica a coordenada Y do canto superior esquerdo do quadrado.<br />
Os valores x e y vieram do evento de mouse. Subtraímos 25 (alguém reparou que 25 é metade de 50?) de cada para que o ponto clicado fosse o centro do quadrado.</p>
<p>Em uma DrawingArea, as coordenadas são orientadas de cima para baixo e da esquerda para a direita.</p>
<p><strong>50</strong>: terceiro e quarto itens da lista; respectivamente altura e largura do quadrado.<br />
A oitava linha da função 'cria_quadrado' chama a função 'desenha'. A tela é passada como parâmetro. None é o segundo parâmetro, e só está aí porque a função pede um segundo parâmetro (ela também é disparada quando ocorre o expose-event).</p>
<p>Já sabemos como criar os quadrados na memória. O próximo passo é desenhá-los na tela:</p>
<pre>[sourcecode language='python']

def desenha( tela , evento ):
    global quadrados
    gc=tela.get_style().fg_gc[gtk.STATE_NORMAL]

    verde=gtk.gdk.Color(0,48255,0,0)
    preto=gtk.gdk.Color(0,0,0,0)
    fundo=gtk.gdk.Color(65535,65535,65535,0)

    #pintando o fundo da nossa tela
    gc.set_rgb_fg_color(fundo)
    tela.window.draw_rectangle(gc,True,0,0,800,600 )

    for q in quadrados:
        gc.set_rgb_fg_color(verde)
        tela.window.draw_rectangle(gc,True,q[0],q[1],q[2],q[3])
        gc.set_rgb_fg_color(preto)
        tela.window.draw_rectangle(gc,False,q[0],q[1],q[2],q[3])

[/sourcecode]</pre>
<p>Dissecando a função:</p>
<p>Aqui vamos usar a lista de quadrados, que foi criada fora do contexto desta função e é modificada por outra função. Por isso o <strong>global quadrados</strong>.<br />
Precisamos também criar um <strong><em>graphics context</em></strong> (<strong>gc</strong>):</p>
<pre>[sourcecode language='python']
    gc=tela.get_style().fg_gc[gtk.STATE_NORMAL]
[/sourcecode]</pre>
<p>Um <em><strong>graphics context</strong></em> armazena informações como cor de fundo, de primeiro plano e espessura da linha de desenho.</p>
<p>Precisamos de algumas cores para fazer nossa arte:</p>
<pre>[sourcecode language='python']
    verde=gtk.gdk.Color(0,48255,0,0)
    preto=gtk.gdk.Color(0,0,0,0)
    fundo=gtk.gdk.Color(65535,65535,65535,0)
[/sourcecode]</pre>
<p>Vamos dar um fundo branco para a nossa tela:</p>
<pre>[sourcecode language='python']
    gc.set_rgb_fg_color(fundo)
    tela.window.draw_rectangle(gc,True,0,0,800,600 )
[/sourcecode]</pre>
<p>Os dois comandos acima serão usados novamente agora, pois vamos percorrer a lista de quadrados e desenhar cada um deles. Se a lista estiver vazia, nenhum quadrado será desenhado:</p>
<pre>[sourcecode language='python']
    for q in quadrados:
        # desenhando um quadrado preenchido de verde
        gc.set_rgb_fg_color(verde)
        tela.window.draw_rectangle(gc,True,q[0],q[1],q[2],q[3])
    #desenhando a borda preta do quadrado
        gc.set_rgb_fg_color(preto)
        tela.window.draw_rectangle(gc,False,q[0],q[1],q[2],q[3])

[/sourcecode]</pre>
<p>Em <strong>gc.set_rgb_fg_color( cor )</strong> definimos a cor a ser usada ao desenhar.</p>
<p>O método <em><strong>draw_rectangle</strong></em> precisa ser compreendido. Vejamos os parâmetros usados:</p>
<p><strong> gc </strong>: o <em>graphics context</em> criado lá em cima.</p>
<p><strong> False ou True</strong> : indica se o quadrado será preenchido.</p>
<p><strong> q[0] até q[3]</strong>: são os quatro valores do quadrado criado lá em cima.</p>
<p>Faltou o botão para apagar a tela. Ele está presente no código completo mais abaixo. Por enquanto basta dizer que apaga-se a tela simplesmente limpando a lista de quadrados e disparando novamente a função 'desenha()'.</p>
<p>Vamos ver como ficou o nosso programa:</p>
<pre>[sourcecode language='python']
#!/usr/bin/env python
import pygtk
import gtk

#declarando a lista de quadrados
quadrados=[]

def cria_quadrado(tela,evento):
    global quadrados

    #obtendo as coordenadas do clique de mouse
    coor=evento.get_coords()
    x=coor[0]
    y=coor[1]

    #criando um novo quadrado e incluindo ele na lista
    novo_quadrado=[x-25,y-25,50,50]
    quadrados.append(novo_quadrado)

    # disparando a funcao 'desenha()'
    # para incluir o nosso novo quadrado
    desenha(tela,None)

# a funcao desenha() deve ser chamada sempre que
# quisermos redesenhar a tela
# ou quando a tela precisar ser redesenhada
# por ter sido encoberta por outra janele, por
# exemplo
def desenha(tela,evento ):
    global quadrados
    #criando um "graphics context"
    gc=tela.get_style().fg_gc[gtk.STATE_NORMAL]

    #definindo as cores
    verde=gtk.gdk.Color(0,48255,0,0)
    preto=gtk.gdk.Color(0,0,0,0)
    fundo=gtk.gdk.Color(65535,65535,65535,0)

    #pintando o fundo da nossa tela
    gc.set_rgb_fg_color(fundo)
    tela.window.draw_rectangle(gc,True,0,0,800,600 )

    # desenhando cada um dos quadrados
    for q in quadrados:

        #desenhando o quadrado preenchido
        gc.set_rgb_fg_color(verde)
        tela.window.draw_rectangle(gc,True,q[0],q[1],q[2],q[3])

        #desenhando a borda do quadrado
        gc.set_rgb_fg_color(preto)
        tela.window.draw_rectangle(gc,False,q[0],q[1],q[2],q[3])

def limpar(botao):
    global quadrados
    global tela
    #limpando a lista de quadrados
    quadrados=[]

    #disparando novamente a funcao "desenha()"
    #para desenhar a tela branca sem nenhum quadrado
    desenha(tela, None)

win=gtk.Window()
win.set_title( "medeubranco.wordpress.com - Desenhando na tela com PyGTK" )
win.set_size_request(800,600)
win.connect('destroy',gtk.main_quit)

box=gtk.VBox()

#aqui a nossa tela sendo criada
tela=gtk.DrawingArea()

tela.connect('expose-event',desenha)
tela.add_events( gtk.gdk.BUTTON_PRESS_MASK )
tela.connect('button-press-event',cria_quadrado)

botao=gtk.Button( "limpar" )

botao.connect("clicked",limpar)

win.add(box)
box.set_border_width(10)

box.pack_start(tela)
box.pack_start(botao,False)
win.show_all()
gtk.main()

[/sourcecode]</pre>
<p>Olha o resultado:<br />
<a href="http://medeubranco.wordpress.com/files/2008/06/desenhando.png"><img class="alignnone size-medium wp-image-25" src="http://medeubranco.wordpress.com/files/2008/06/desenhando.png?w=300" alt="" width="300" height="233" /></a></p>
<p>Na tentativa de manter este artigo o menos complexo possível, muita coisa foi omitida aqui. Há outros métodos de desenho além do draw_rectangle, e há outras formas de lidar com uma DrawingArea.</p>
<p>Para se aprofundar, você pode começar por aqui:</p>
<p><a href="http://www.pygtk.org/pygtk2tutorial/sec-DrawingAreaWidgetAndDrawing.html">http://www.pygtk.org/pygtk2tutorial/sec-DrawingAreaWidgetAndDrawing.html</a><br />
Espero que este tutorial tenha sido útil a você e que você encontre formas criativas de usar uma DrawingArea.</p>
<p>Até o próximo artigo deste blog.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Criando uma simples janela com pygtk]]></title>
<link>http://medeubranco.wordpress.com/?p=10</link>
<pubDate>Sat, 07 Jun 2008 22:39:49 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=10</guid>
<description><![CDATA[É duro querer ou precisar fazer alguma coisa e não saber nem como começar; quando a gente não fa]]></description>
<content:encoded><![CDATA[<p>É duro querer ou precisar fazer alguma coisa e não saber nem como começar; quando a gente não faz nem idéia de como a coisa pode ser feita.</p>
<p>Neste artigo nós vamos fazer uma simples janela vazia com pygtk para ultrapassar essa barreira do "não tenho nem idéia de como é".</p>
<p>Uma janela em gtk é criada instanciando a classe gtk.Window():<br />
<strong><code>janela=gtk.Window()</code></strong></p>
<p>A janela tem que ser exibida com o método Show():<br />
<strong><code>janela.Show()</code></strong></p>
<p>Vamos ver então um código exemplo. Salve o código abaixo com um nome sugestivo, algo como janela_gtk.py, e execute com<strong> <code>python janela_gtk.py</code></strong> :</p>
<blockquote><p><code><span style="color:blue;">#!/usr/bin/env python</span></code></p>
<p><code><span style="color:red;">import</span> pygtk<br />
<span style="color:red;">import</span> gtk</code></p>
<p><code><strong>win</strong>=gtk.Window()<br />
<strong>win</strong>.set_title(<span style="color:green;">'Titulo da Janela'</span>)</code></p>
<p><code><strong>win</strong>.set_size_request(400,400)<br />
<strong>win</strong>.connect(<span style="color:green;">"destroy"</span>,gtk.main_quit)</code></p>
<p><code><strong>win</strong>.show()<br />
<strong>gtk</strong>.main() </code></p></blockquote>
<p><a href="http://medeubranco.wordpress.com/files/2008/06/janela_exemplo_001.png"><img src="http://medeubranco.wordpress.com/files/2008/06/captura_da_tela-titulo-da-janela1.png?w=288" alt="Janela exemplo" width="288" height="300" class="alignnone size-medium wp-image-13" /></a></p>
<p>As linhas<br />
<code><span style="color:red;">import</span> pygtk<br />
<span style="color:red;">import</span> gtk</code><br />
simplesmente importam os módulos para que seu programa python possa utilizar as classes gtk.</p>
<p>Nas linhas<br />
<code><strong>win</strong>=gtk.Window()<br />
<strong>win</strong>.set_title(<span style="color:green;">'Titulo da Janela'</span>)</code><br />
uma janela gtk é criada,  e um título é atribuído a ela.</p>
<p>Em <code><strong>win</strong>.set_size_request(400,400)</code> definimos o tamanho(altura, largura) da janela.</p>
<p>Agora vem uma coisa interessante. Na linha abaixo conectamos um determinado sinal a uma funçao:<br />
<code><strong>win</strong>.connect(<span style="color:green;">"destroy"</span>,gtk.main_quit)</code><br />
Sinais são coisas que você vai muito usar ao trabalhar com pygtk. Aqui o sinal "destroy" é  conectado ao método main_quit do gtk. Grosso modo, significa que, quando você fechar a janela, o método será chamado e o loop (veja abaixo) que mantém o programa em funcionamento será encerrado.</p>
<p>A linha abaixo é um mistério:<br />
<code><strong>win</strong>.show()</code><br />
Dou um pirulito a quem descobrir para que serve.</p>
<p>Finalmente,<br />
<code><strong>gtk</strong>.main() </code><br />
chama o loop principal, que vai fazer o gtk ficar esperando por eventos (os sinais) que fazem a mágica de um programa com interface gráfica.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Python, MySQL e adeus, Access]]></title>
<link>http://medeubranco.wordpress.com/?p=6</link>
<pubDate>Tue, 03 Jun 2008 05:51:30 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=6</guid>
<description><![CDATA[Este post é continuação desse outro.
&#8212;
É, o Cléberson ficou mesmo interessado nas ferrame]]></description>
<content:encoded><![CDATA[<p>Este post é continuação <a href="http://medeubranco.wordpress.com/2008/06/03/dos-sistemas-em-access-para-o-linux/">desse outro</a>.</p>
<p>---</p>
<p>É, o Cléberson ficou mesmo interessado nas ferramentas que o Linux oferece.</p>
<p>Pois bem, Cléberson, primeiro vamos falar para que serve cada uma delas.</p>
<p>Os sistemas que o Cléberson desenvolveu e que tanta glória lhe trouxeram são basicamente compostos de um ou mais formulários de entrada de dados, outros de consulta e visualização desses dados e o banco de dados propriamente dito.</p>
<p>O Cléberson estava acostumado a desenvolver e gerenciar tudo isso de dentro de uma mesma ferramenta, o MS-Acces.</p>
<p>Agora, Cléberson, é hora de dividir. Cada coisa no seu devido lugar, cada ferramenta para o sua devida finalidade. No final a gente integra tudo.</p>
<p>Então teremos:</p>
<ul>
<li>Um sistema de bancos de dados</li>
<li>Uma linguagem de programação que possa se comunicar com o banco de dados</li>
<li>Uma maneira de fazer "Janelas" com essa linguagem de programação</li>
<li>Uma maneira mais fácil de fazer Janelas</li>
</ul>
<p>Lá vai:</p>
<p>1 - Banco de Dados MySQL</p>
<p>Para armazenamento de dados, as tabelas e consultas, vamos usar o <a title="MySQL" href="http://pt.wikipedia.org/wiki/MySQL">MySQL</a>. O MySQL é um <a href="http://pt.wikipedia.org/wiki/SGBD">SGDB</a>, Sistema de Gerenciamento de Banco de Dados, que é livre e gratuito. Grandes instituições usam o MySQL e estão satisfeitas, mas o Cléberson também pode usar o MySQL nos seu sistemas, e também ficar satisfeito. Sabia, Cléberson, que o MySQL roda também no <a href="http://desciclo.pedia.ws/wiki/Windows">Windows</a>?</p>
<p>Não se esqueça, Cléberson, de instalar o MySQL-Query-Browser junto com o servidor MySQL. Vai ficar muito fácil criar tabelas e fazer suas consultas com o Query-Browser.</p>
<p>Ah, Cléberson, me esqueci de avisar que você vai precisar aprender uma linguagem nova, a <a href="http://pt.wikipedia.org/wiki/SQL">SQL</a>. SQL é uma linguagem padronizada para consulta e manipulação de dados. SQL não é difícil, Cléberson, vale a pena conhecer. O Próprio Access a utiliza quando você cria uma consulta. Dá uma olhadinha no "modo SQL" das suas consultas no Access. Viu? Aquilo é SQL, mas SQL não precisa ser confusa daquele jeito. É que o Access nao gosta que você saia do modo estrutura, então ele gera um SQL bem confuso pra você se assustar.</p>
<p>2 - Linguagem de Programação Python</p>
<p>Eu sei, Cléberson, que você quer criar logo os formulários de entrada de dados. Mas a gente não está mais dentro do Access. Seus formulários precisam fazer alguma coisa, reagir aos cliques do usuário, gravar alguma coisa no banco de dados e exibir esses dados para o usuário.</p>
<p>Para isso, vamos ter que aprender a programar. Não, Cléberson, isso não é ruim. Essa é a parte mais divertida, e o Access sempre tentou esconder isso de você.</p>
<p>Python é uma <a href="http://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o">linguagem de programação</a> interpretada <a href="http://pt.wikipedia.org/wiki/Oop">orientada a objetos</a>.<br />
É de fácil aprendizado e muito versátil. Python também existe para Windows.</p>
<p>Onde o cléberson pode aprender Python:</p>
<ul>
<li><a href="http://www.pythonbrasil.com.br/moin.cgi/">http://www.pythonbrasil.com.br/moin.cgi/</a></li>
<li><a href="http://pensarpython.incubadora.fapesp.br/portal/livro/capitulo_01.rst/">http://pensarpython.incubadora.fapesp.br/portal/livro/capitulo_01.rst/</a></li>
</ul>
<p>3 - PyGTK, Python e Janelas GTK</p>
<p>PyGTK é um módulo para python que permite criar interfaces gráficas bonitas e funcionais. A biblioteca base é a GTK, a mesma dos programas do Gnome (aquelas janelas bonitas do Ubuntu).</p>
<p>Um próximo artigo aqui vai dar um exemplo legal de como criar uma janela em PyGTK.</p>
<p>Até lá, google nele.</p>
<p>4 - Desenhando janelas  facilmente com Glade</p>
<p>O Glade é uma ferramenta para criação de janelas GTK do modo mais fácil: com o mouse.</p>
<p>Nem vou falar muito aqui sobre o Glade, porque um cara legal resolveu fazer um vídeo super maneiro sobre essa ferramenta. Veja o vídeo e entenda o que é o glade em <a href="http://blog.ogmaciel.com/?p=415">http://blog.ogmaciel.com/?p=415</a></p>
<p>Creio que o Cléberson, agora, já tem uma idéia de como se podem fazer programas legais no linux.</p>
<p>Nos próximos artigos nós vamos fazer alguns exercícios juntos. Até lá.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mi Primera Aplicación en Python]]></title>
<link>http://runtimerror.wordpress.com/?p=14</link>
<pubDate>Sun, 01 Jun 2008 19:04:48 +0000</pubDate>
<dc:creator>cybrid</dc:creator>
<guid>http://runtimerror.wordpress.com/?p=14</guid>
<description><![CDATA[Los que hayáis visto la última página que he añadido &#8220;Frases Célebres&#8221;, os habréis]]></description>
<content:encoded><![CDATA[<p>Los que hayáis visto la última página que he añadido "Frases Célebres", os habréis percatado de que llevo bastante tiempo jugando a rol, así que como práctica para aprender python y gtk, se me ha ocurrido hacer un programa con GUI, para guardar y mantener una pequeña base de datos de hechizos en la que poder buscar rápidamente.</p>
<p>Por otro lado, he dejado abandonado el tema de aprender python durante un par de meses, debido principalmente a que no tenía un proyecto interesante, que sí, que ya se que en los manuales siempre vienen ejemplos para aprender, pero son un coñazo y no valen para nada útil y sinceramente, programar por programar nunca me ha gustado; si no tengo un objetivo ni me planteo empezar y eso es precisamente lo que me ha pasado hasta ahora.</p>
<p>A medida que vaya programando la aplicación, iré publicando entradas para aquel/los que queráis seguirlo. Pretendo que sea como una especie de tutorial/curso, pero nunca he sido muy ducho en ese tipo de cosas, así que no se muy bien lo que saldrá ;) .</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[[GNOME-App] SnakeBite MP3 Converter]]></title>
<link>http://innolandpuntoit.wordpress.com/?p=1142</link>
<pubDate>Wed, 28 May 2008 07:03:24 +0000</pubDate>
<dc:creator>innovatel</dc:creator>
<guid>http://innolandpuntoit.wordpress.com/?p=1142</guid>
<description><![CDATA[Scoperto ora e lo segnalo:
SnakeBite is an audio conversion application that can convert your entire]]></description>
<content:encoded><![CDATA[<p>Scoperto ora e lo segnalo:</p>
<blockquote><p><span style="font-family:Arial;font-size:x-small;">SnakeBite is an audio conversion application that can convert your entire music library to MP3 in a single step. SnakeBite is designed for those who use libre audio formats like Vorbis and FLAC, but sometimes still need their music in the MP3 format.</p>
<p>Simply choose the source folder (containing your music) and the destination folder (where the music converted to MP3 will go), and SnakeBite does the rest. After it has finished, the destination folder will contain the exact same folders and files as the source folder, except all the files will have a ".mp3" extension and will be encoded in the MP3 format. Your original music library is never altered in any way.</p>
<p>SnakeBite will skip files that already exist in the destination folder, making easy to convert some of your library, stop partway through, and then resume later, or to convert just music added since the last time you used SnakeBite.</p>
<p>MP3's found in the source folder are hard-linked into the destination folder, saving you disk space and CPU cycles. Non-audio files found in the source folder are ignored.</p>
<p>Requirements<br />
This application requires GTK+ version 2.10.x. Other dependencies include:<br />
Python 2.5 GStreamer PyGST PyGTK pyawesome 0.1.1 (companion library) </span></p></blockquote>
<p><strong>Link:</strong><br />
<a href="http://www.gnomefiles.org/app.php?soft_id=2342#0.1.1" target="_blank">SnakeBite MP3 Converter</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Três vezes GTK]]></title>
<link>http://corecode.wordpress.com/?p=15</link>
<pubDate>Thu, 22 May 2008 21:17:49 +0000</pubDate>
<dc:creator>leonidaskirotawa</dc:creator>
<guid>http://corecode.wordpress.com/?p=15</guid>
<description><![CDATA[Há muito tempo atrás quando mal conhecia o que eram GUI&#8217;s, comecei a estudar algo chamado Tk]]></description>
<content:encoded><![CDATA[<p style="text-align:justify;">Há muito tempo atrás quando mal conhecia o que eram GUI's, comecei a estudar algo chamado Tk, mas precisamente Tcl/Tk.  Comecei a estudar esta linguagem quando vi que o aMSN era todo feito nela.  Minha ambição era criar um aMSN ou melhora-lo (hehe),  mas infelizmente faculdade rouba  nosso tempo, tempo no qual poderia-mos está aprendendo sozinho, mas temos que tirar a nota X pra poder passar, etc.  Mas o que raios esse papo tem haver com GTk?  Acho que nada, foi só pra introduzir o artigo (hehe), mas espere! Tem sim haver, estamos falando de GUIS, e assim como Tk  GTK é uma Biblioteca para criar aplicações gráficas.  Ao contrário do que aconteceu com meus estudos em Tcl/Tk, com relação a GTK eu fui adiante e hoje estudo três linguagens diferentes que fazem uso desta mesma biblioteca, dai vem o título deste artigo e também o assunto do mesmo.</p>
<p style="text-align:justify;">Neste artigo pretendo apresentar a todos a biblioteca GTK usada no gnome das distribuições linux.  Também pretendo mostrar três linguagens que fazem uso desta biblioteca, e deixar que você escolha a mais poderosa, a mais fácil ou a que você sabe, para  que você crie suas aplicações gráficas utilizando GTK.</p>
<p style="text-align:justify;">Antes de falar dessas três linguagens vamos dá uma olhada no histórico da biblioteca GTK.</p>
<p style="text-align:justify;">GTK quer dizer Gnome tool kit, e é usado inteiramente no gnome.  Um dos aplicativos gráficos mais famosos do mundo open source, o gimp, possui sua parte gráfica toda feita em GTK.  Além de ser fácil de aprender, esta biblioteca é muiltiplataforma, logo você vai poder criar aplicações unix ou win32.  Mas como criar tais aplicações e quais as três linguagens que você disse que fazem uso da GTK?  São elas PHP-GTK2, C e Python, isso claro sem citar tantas outras que também fazem uso da GTK.</p>
<p style="text-align:justify;">Agora é a hora da verdade, vou mostrar três exemplos de codigos diferentes nestas três linguages e vocês escolhem em qual delas deseja começar a programar usando GTK.</p>
<p><strong>Em C</strong></p>
<p>[sourcecode language='C']<br />
#include <gtk/gtk.h></p>
<p>static void destroy( GtkWidget *widget,<br />
                     gpointer   data );</p>
<p>int main( int   argc,<br />
          char *argv[] )<br />
{<br />
    GtkWidget *window ,*label;</p>
<p>    gtk_init (&argc, &argv);<br />
    //Cria a janela e a ponhe no topo<br />
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);<br />
    //Da um tamanho a janela<br />
    gtk_window_set_default_size(GTK_WINDOW (window),300,200);<br />
    //Da um titulo a janela<br />
    gtk_window_set_title(GTK_WINDOW (window),"Ola mundo");</p>
<p>    //Cria o label com a frase Ola mundo :P!<br />
    label = gtk_label_new("Ola Mundo :P!");<br />
    //Adiciona o label a janela<br />
    gtk_container_add(GTK_CONTAINER (window), label);<br />
    //Adiciona a funcao destroy para fechar a janela<br />
    g_signal_connect (G_OBJECT (window), "destroy",<br />
		      G_CALLBACK (destroy), NULL);</p>
<p>    //Diz pra mostrar todos os widgets da janela<br />
    gtk_widget_show_all (window);<br />
    //loop do gtk<br />
    gtk_main ();</p>
<p>    return 0;<br />
}<br />
//Funcao pra quando clicar no x da janela ela fechar<br />
static void destroy( GtkWidget *widget,<br />
                     gpointer   data )<br />
{<br />
    gtk_main_quit ();<br />
}<br />
[/sourcecode]</p>
<p>Achou em C complicado? Então que tal em PHP-Gtk2.</p>
<p><strong>PHP-Gtk2</strong></p>
<p>[sourcecode language='PHP']<br />
<?php</p>
<p>$wnd = new GtkWindow();<br />
$wnd->set_title('Olá mundo');<br />
$wnd->set_size_request(300,200);<br />
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));</p>
<p>$label_ola= new GtkLabel("Olá Mundo :P!'");<br />
$wnd->add($label_ola);</p>
<p>$wnd->show_all();<br />
Gtk::main();<br />
?><br />
[/sourcecode]</p>
<p style="text-align:justify;">Se ainda assim você achou difícil ou não gostou de PHP-Gtk2, então tenta ai no python.</p>
<p><strong>Python</strong></p>
<p>[sourcecode language='Python']<br />
#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-</p>
<p>import pygtk<br />
pygtk.require( '2.0' )<br />
import gtk</p>
<p>def main():<br />
	window = gtk.Window(gtk.WINDOW_TOPLEVEL)<br />
	window.set_title( "Ola Mundo" )<br />
	window.set_size_request(300,200)<br />
	window.connect('destroy',gtk.main_quit)</p>
<p>	label = gtk.Label(' Ola Mundo :P!' )<br />
	window.add(label)</p>
<p>	window.show_all()</p>
<p>	gtk.main()</p>
<p>if __name__ == '__main__':<br />
	main()<br />
[/sourcecode]</p>
<p style="text-align:justify;">E ai está os três códigos fazem a mesma coisa, mostram uma janela com um label dizendo "ola mundo". Agora se você não conhece nenhuma dessas linguagens ou não gosta delas há outras opções para você, eis a lista de linguagens que fazem uso da Gtk:</p>
<p><strong></strong></p>
<pre><strong>C++  	gtkmm
C# 	Gtk#
Java 	java-gnome
Python 	PyGTK
Perl 	gtk2-perl
R 	RGtk2
Guile 	guile-gnome
Ruby 	Ruby-GNOME2
PHP 	PHP-GTK
Ada 	GtkAda
OCaml 	LablGTK
Haskell Gtk2Hs
Lua 	lua-gtk
S-Lang 	SLgtk 	      </strong></pre>
<p style="text-align:justify;">
<p style="text-align:justify;">Viu quantas possibilidades você tem. Até aquela linguagem verborratica e chata que começa com J usa o Gtk.  E além disso você pode usar o Glade que é uma ferramenta onde você pode construir sua interface gráfica sem digitar código, apenas fazendo uso do projeto que o Glade gera e utilizando um parser.  Mas essa historia fica para uma próxima oportunidade.  A quem desejar aprender mais sobre Gtk, dêem uma olhada nas referências ou se liguem aqui no Core Code que em breve vou criar um tutorial de C gtk, pygtk e claro php-gtk2 com o uso do glade e sem o uso do glade.</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><strong>Referências</strong></p>
<p style="text-align:justify;"><a title="Pagina do Gtk" href="http://www.gtk.org/">http://www.gtk.org/</a></p>
<p style="text-align:justify;"><a title="Gtk com C" href="http://library.gnome.org/devel/gtk-tutorial/stable/c24.html">http://library.gnome.org/devel/gtk-tutorial/stable/c24.html</a></p>
<p style="text-align:justify;"><a title="Pagina do php-gtk" href="http://www.php-gtk.com.br"><span class="a">www.php-gtk.com.br</span></a></p>
<p style="text-align:justify;"><a title="Pagina do php-gtk internacional" href="http://gtk.php.net"><span class="a">gtk.php.net</span></a></p>
<p style="text-align:justify;"><a title="Pagina com vários tutorias de php-gtk" href="http://www.kksou.com/"><span class="a">www.kksou.com/</span></a></p>
<p style="text-align:justify;"><a title="Pagina do pygtk" href="http://www.pygtk.org/"><span class="a">www.<strong>pygtk</strong>.org/</span></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[pygtk + pygame]]></title>
<link>http://corecode.wordpress.com/?p=3</link>
<pubDate>Sat, 17 May 2008 17:12:46 +0000</pubDate>
<dc:creator>leonidaskirotawa</dc:creator>
<guid>http://corecode.wordpress.com/?p=3</guid>
<description><![CDATA[
Há algum tempo venho estudando pygtk e pygame, e recentemente tive a idéia de migrar um jogo, fei]]></description>
<content:encoded><![CDATA[<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify;">Há algum tempo venho estudando pygtk e pygame, e recentemente tive a idéia de migrar<span> </span>um jogo, feito por um colega, de C++ para pygame.<span> </span>Como o jogo original possui uma interface gráfica bonitinha, então pensei “tenho que fazer o mesmo com o python, mas como?” Pois até então nunca tinha trabalhado com pygtk e pygame juntos.<span> </span>Resolvi vasculhar na net algo sobre e encontrei uma solução ótima e simples (alias como tudo em python).<span> </span>A solução é criar um gtk.DrawingArea e dentro dele mapear uma superfície SDL, no nosso caso a tela do pygame (pygame.display()).<span> </span>Uma vez que você fez isso é só manipular o seu código pygame no seu display e pronto.<span> </span>Agora eu vou deixar de enrolar e mostrar e explicar o tal código.</p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><strong>CODE</strong></p>
<p class="MsoNormal" style="text-align:justify;"><span style="color:#008000;"># Proof of concept for PyGTK+Pygame<br />
# Seo Sanghyeon</span></p>
<address><span style="color:#0000ff;">import </span>os, pygame, gtk, pygtk</address>
<address><span style="color:#0000ff;"> import</span> random</address>
<address> </address>
<address><span style="color:#0000ff;">def </span><span style="color:#ff00ff;">pygame_hack</span><span style="color:#000080;">(</span>widget<span style="color:#000080;">):</span></address>
<p style="padding-left:30px;"><span style="color:#0000ff;">def </span><span style="color:#ff00ff;">callback<span style="color:#000080;">(</span></span>widget, *args<span style="color:#000080;">):</span></p>
<p style="padding-left:60px;">handle <span style="color:#000080;">=</span> widget.window.xid<br />
size <span style="color:#000080;">= </span>widget.size_request<span style="color:#000080;">()</span><br />
os.environ<span style="color:#000080;">[</span><span style="color:#999999;">'SDL_WINDOWID'</span><span style="color:#000080;">]</span> = str<span style="color:#000080;">(</span>handle<span style="color:#000080;">)</span><br />
pygame.display.init<span style="color:#000080;">()</span><br />
pygame.display.set_mode<span style="color:#000080;">(</span>size<span style="color:#000080;">)</span></p>
<p style="padding-left:30px;">widget.connect<span style="color:#000080;">('</span><span style="color:#999999;">map-event'</span>, callback<span style="color:#000080;">)</span></p>
<p><span style="color:#0000ff;">def</span> <span style="color:#ff00ff;">fill_random</span><span style="color:#000080;">(</span>widget<span style="color:#000080;">):</span></p>
<p style="padding-left:30px;">screen <span style="color:#000080;">=</span> pygame.display.get_surface<span style="color:#000080;">()</span><br />
r <span style="color:#000080;">=</span> random.randrange<span style="color:#000080;">(</span><span style="color:#ff0000;">255</span><span style="color:#000080;">)</span><br />
g <span style="color:#000080;">=</span> random.randrange<span style="color:#000080;">(</span><span style="color:#ff0000;">255</span><span style="color:#000080;">)</span><br />
b <span style="color:#000080;">= </span>random.randrange<span style="color:#000080;">(</span><span style="color:#ff0000;">255</span><span style="color:#000080;">)</span><br />
screen.fill<span style="color:#000080;">((</span>r, g, b<span style="color:#000080;">))</span><br />
pygame.display.flip<span style="color:#000080;">()</span></p>
<p><span style="color:#0000ff;">def</span> <span style="color:#ff00ff;">main</span><span style="color:#000080;">():</span></p>
<p style="padding-left:30px;">win = gtk.Window<span style="color:#000080;">()</span><br />
win.connect<span style="color:#000080;">('</span><span style="color:#999999;">destroy'</span>,gtk.main_quit<span style="color:#000080;">)</span><br />
box <span style="color:#000080;">=</span> gtk.VBox<span style="color:#000080;">()</span><br />
win.add<span style="color:#000080;">(</span>box<span style="color:#000080;">)</span><br />
custom <span style="color:#000080;">=</span> gtk.DrawingArea<span style="color:#000080;">()</span><br />
custom.set_size_request<span style="color:#000080;">(</span><span style="color:#ff0000;">300</span>,<span style="color:#ff0000;">200</span>)<br />
pygame_hack<span style="color:#000080;">(</span>custom<span style="color:#000080;">)</span></p>
<p style="padding-left:30px;">box.pack_start<span style="color:#000080;">(</span>custom<span style="color:#000080;">)</span><br />
button <span style="color:#000080;">= </span>gtk.Button<span style="color:#000080;">(<span style="color:#999999;">'</span></span><span style="color:#999999;">Random fill</span>'<span style="color:#000080;">)</span></p>
<p style="padding-left:30px;">button.connect<span style="color:#000080;">(</span>'<span style="color:#999999;">clicked</span>',fill_random<span style="color:#000080;">)</span></p>
<p style="padding-left:30px;">box.pack_start<span style="color:#000080;">(</span>button<span style="color:#000080;">)</span></p>
<p style="padding-left:30px;">win.show_all<span style="color:#000080;">()</span><br />
gtk.main<span style="color:#000080;">()</span></p>
<p><span style="color:#0000ff;">if</span> __name__ <span style="color:#000080;">== </span>'<span style="color:#999999;">__main__</span>'<span style="color:#000080;">:</span></p>
<p style="padding-left:30px;">main<span style="color:#000080;">()</span></p>
<p style="padding-left:30px;">
<p style="text-align:justify;">De todo o código a parte mais importante é a função pygame_hack.  É nessa parte do código que pegamos o ID da nossa DrawingArea e copiamos para ser o ID da nossa SDLWINDOW, e é isso que faz com que o display do pygame rode dentro dela.</p>
<p style="text-align:justify;">Neste código abaixo  pegamos o XID, ou código do X da nossa janela.</p>
<p>handle <span style="color:#000080;">=</span> widget.window.xid</p>
<p>Neste outro copiamos o XID da nossa DrawingArea pra dentdo da nossa SDLWINDOW.</p>
<p>os.environ<span style="color:#000080;">[</span><span style="color:#999999;">'SDL_WINDOWID'</span><span style="color:#000080;">]</span> = str<span style="color:#000080;">(</span>handle<span style="color:#000080;">)</span></p>
<p style="text-align:justify;">Essa pequena applicação mostra uma janela pygtk com um botão que quando acionado preenche o display do pygame dentro do DrawingArea com uma cor que foi selecionada randomicamente. Ver imagem abaixo.</p>
<p><a href="http://corecode.files.wordpress.com/2008/05/aplicacao1.png"><img class="alignnone size-medium wp-image-6" src="http://corecode.wordpress.com/files/2008/05/aplicacao1.png?w=300" alt="" width="300" height="237" /></a></p>
<p style="text-align:justify;">Viu tudo muito simples.  Só tem um problema não roda no windows pois ele não consegue pegar o XID, ainda estou procurando um jeito de fazer isso no  ruindows, mas no linux roda normal, então tá otimo.  O legal desse exemplo é que ele mostra e dá ideias, além de você poder por um display do pygame, você pode por um display do opengl e fazer uma aplicação bem interessante.  Afinal com python nem o céu é o limite =].</p>
<p style="text-align:justify;">Como o intuito deste artigo é apenas explicar como por o pygame dentro da janela do gtk não vou explicar todo o código linha a linha, mas se alguém tiver alguma duvida sobre comenta ai que eu respondo.</p>
<p><a href="http://corecode.wordpress.com/files/2008/05/blog1.png"><br />
</a></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><!--more--></p>
<p class="MsoNormal">
<p class="MsoNormal">
]]></content:encoded>
</item>
<item>
<title><![CDATA[KDE in troubled water]]></title>
<link>http://fredvanzwieten.wordpress.com/?p=11</link>
<pubDate>Wed, 14 May 2008 04:51:13 +0000</pubDate>
<dc:creator>Fred</dc:creator>
<guid>http://fredvanzwieten.wordpress.com/?p=11</guid>
<description><![CDATA[Although I am convinced Qt is a far better GUI toolkit then GTK+, I must admit that Gnome (based on ]]></description>
<content:encoded><![CDATA[<p>Although I am convinced Qt is a far better GUI toolkit then GTK+, I must admit that Gnome (based on GTK+) is (at the moment) in far better shape than current KDE (based on Qt). I've read a lot of so-called "vs" articles and posts (Qt vs GTK+, KDE vs Gnome, LGPL vs GPL, etc). From all those readings I come to these "facts":</p>
<ol>
<li>Qt requires less LoC (Lines-of-Code) than GTK+. The numbers stated range from 30% to 200%. Also, Qt based code is more readable than GTK+ based code. So, Qt is more productive.</li>
<li>Qt has much better documentation, both online as in books. Most GTK+ related educational stuff is outdated. The online reference is there, but not as powerfull as the Qt reference.</li>
<li>Both have python bindings, but the same is true for the documentation: The PyQt documentation is much better, both online as in books, as with PyGTK.</li>
<li>Qt is natively cross platform and performs well on Linux, Windows and OSX, using their native look and feel. GTK+ is cross platform, but it is said it doesn't perform on Windows very well.</li>
<li>Trolltech, the company that developed Qt is acquired by Nokia. This is very troubling. Nobody really knows what this will do to the toolkit. GTK+ is owned by nobody, which is very positive. The Free Qt edition is protected through the Free Qt Foundation, but if Nokia so desires, it will just let it fork and give the community there own version of it. Who will then maintain it? KDE devs? That only means KDE development slowing down even more.</li>
<li>All "big" linux vendors (Redhat, Novell, Ubuntu) choose Gnome as their default GUI, and it shows. There is far more polish in the product. Just try Ubuntu 8.04 and then try Kubuntu 8.04. Kubuntu has one maintainer, Ubuntu many.</li>
<li>KDE right now is in the transition from KDE3 to KDE4, a massive undertaking. As a result of that, development in KDE3 has ceased mostly, but KDE4 isn't ready yet either. It's mostly a mess.</li>
<li>KDE developers are reluctant to replace KHTML with WebKit, while I see this as very important. Browsing the web with KHTML is pretty painfull. Using WebKit will ensure browsing is on par with Safari. Web Developers don't give a damn about KHTML. They do about Safari.</li>
<li>The look and feel of non natvie apps like Firefox and openoffice is very ugly in KDE, but look very integrated in Gnome.</li>
<li>The general ugly-ness of KDE. Clearly, KDE developers don't care about aesthetics or are not able to make things look good. As a result, a default KDE install doesn't look good. It can be made to look better with modifications, but it is the first impressions that count's. And it is not a good first implession. There is a role for the distro maintainers here too.</li>
<li>People rant about the smoothness of Gnome, how well everything is integrated, how polished everything looks. The time it takes within the KDE project to get out something as simple as HTML enabled signatures in KMail is unbelieveable. If I change my font settings or mouse pointers of whatever in Gnome, it changes immediately. In KDE I have to logout/login. Why? When I plugin a iPod in Gnome, it's connected and ready to use in the sound app of Gnome. In KDE (Amarok) is needs to get configured, and then "connected". Why?</li>
<li>Word is that OpenOffice under-the-hood is a big mess. It's bloated and takes a long time to start (getting better though). My great hope is that Koffice 2.0 will be great. It has a much cleaner codebase.</li>
</ol>
<p>I sure hope the KDE project will get on it's feet again. KDE4 looks promising, but it's current state is not good.  KDE3 is on a standstill. KDE4 with Koffice2 are my big hope. If it doesn play out well, it will be the death of the KDE project. Right now Gnome is in much better shape.</p>
<p>I _want_ to develop using Python and Qt4. I Like the toolkit and I like the cross platform capability. I already invested in a Qt4 and a PyQt4 book. But, as this post shows, I am in doubt. Should I invest my time in learning (Py)Qt or (Py)GTK?</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[New Open Source Project!]]></title>
<link>http://yapr.wordpress.com/?p=34</link>
<pubDate>Wed, 26 Mar 2008 01:42:40 +0000</pubDate>
<dc:creator>Charles Connell</dc:creator>
<guid>http://yapr.wordpress.com/?p=34</guid>
<description><![CDATA[I&#8217;m really excited about Tuxedo, which a friend of mine launched yesterday. It&#8217;s written]]></description>
<content:encoded><![CDATA[<p>I'm really excited about <a href="http://code.google.com/p/tuxedo" target="_blank">Tuxedo</a>, which a friend of mine launched yesterday. It's written in PyGTK, which is <em>amazing</em> compared to Qt. I'm still a novice with regards to Python, so I've probably missed some opportunities to use some of it's really cool keywords and data manipulations. But it's a relief all the same because Python lets you just write what you want to write, and not worry about making the compiler happy. Also, Gtk has been cool to work with. Since I'm a Qt expert, it's interesting to see how things can be done differently (and in some cases better) across the imaginary pond.</p>
<p>Bonus benefit from learning Gtk: I'm no longer tied to a toolkit controlled by Nokia, who I really don't trust.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Menus de Torta com Python e Cairo]]></title>
<link>http://setanta.wordpress.com/?p=291</link>
<pubDate>Sat, 15 Mar 2008 15:31:04 +0000</pubDate>
<dc:creator>Marcelo Lira</dc:creator>
<guid>http://setanta.wordpress.com/?p=291</guid>
<description><![CDATA[Um tempinho atrás experimentei fazer uma interface do tipo pie menu, aqueles menus circulares, usan]]></description>
<content:encoded><![CDATA[<p>Um tempinho atrás experimentei fazer uma interface do tipo <a href="http://en.wikipedia.org/wiki/Pie_menu" title="Pie menu">pie menu</a>, aqueles menus circulares, usando Python e Cairo. A idéia era usar num tipo de arena de combate usando marcadores para representar os lutadores, com ações escolhidas em menus de contexto circulares.</p>
<p>Melhor um screencast que palavras:</p>
<p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/qqIyvDi0k_4'></param><param name='wmode' value='transparent'></param><embed src='http://www.youtube.com/v/qqIyvDi0k_4&rel=0' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed></object></span></p>
<p>Veja o código <a href="http://code.google.com/p/setanta-labs/source/browse/trunk/pycairo/" title="some pycairo stuff">aqui</a>. Os arquivos são <code>arena.py</code> (execute este), <code>p_token.py</code> e <code>piemenu.py</code>.<br />
Ou use o subversion:</p>
<p><code>svn checkout http://setanta-labs.googlecode.com/svn/trunk/pycairo piemenu</code></p>
<p>Funciona assim: a classe <b>Arena</b> é um widget que pode conter objetos da classe <b>Token</b> (os marcadores representando personagens), estes por sua vez contém um objeto da classe PieMenu, que é composto por vários itens.</p>
<p>Em código:</p>
<p><code>arena = Arena()</code></p>
<p><code>piemenu = PieMenu()<br />
piemenu.add_item('icon1.png', do_callback, 2)  # (icon, callback function, callback params...)<br />
piemenu.add_item('icon2.png', do_callback)</code></p>
<p><code>token = Token((200, 100), 'token-icon.png', piemenu) # (position, icon, menu)</code></p>
<p><code>arena.add_token(token)</code></p>
<p>Então você adiciona a Arena num container qualquer e está pronto.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Deluge 0.5.8.5 @ Windows]]></title>
<link>http://tuxday.wordpress.com/?p=19</link>
<pubDate>Tue, 04 Mar 2008 17:02:18 +0000</pubDate>
<dc:creator>Rajca</dc:creator>
<guid>http://tuxday.wordpress.com/?p=19</guid>
<description><![CDATA[    Nine Inch Nails wydali ostatnimi czasy kolejny album, wydali go w sposób niecodzienny bo własn]]></description>
<content:encoded><![CDATA[<p>    Nine Inch Nails wydali ostatnimi czasy kolejny album, wydali go w sposób niecodzienny bo własnymi siłami. Co ciekawsze sami, oficjalnie i jak to mówią- "bez ściemy" umieścili go w sieci BitTorrent. Skoro o torrentach już mowa...</p>
<div style="text-align:center;"><img src="http://images33.fotosik.pl/166/4c6446aa1fdc8029.png" alt="Deluge Logo" height="48" width="48" /></div>
<p>Na co dzień używam uTorrenta. Ale postanowiłem przypomnieć sobie co nieco o kliencie, którego przez pewien czas używałem za czasów pingwina. Mianowicie o Deluge. Kropelka powstała na bazie nie wody, a PyGTK. Po raz kolejny może nasuwać się pytanie, czy Pythono-pochodne nie zajmują za dużo zasobów. Nic z tych rzeczy, przynajmniej u siebie nie stwierdziłem, żadnych nadużyć ze strony ugrupowania spod znaku P. Wnikliwa lustracja również nie wykazała matactwa i sprzeniewierzania się, jak również kolaborowania  i działań na moją niekorzyść. Czegóż więcej chcieć? Deluge, przedstaw się:<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/9a8ae921c9954797.html" target="_blank"></a></p>
<div style="text-align:center;"><a href="http://www.fotosik.pl/pokaz_obrazek/9a8ae921c9954797.html" target="_blank"><img src="http://images23.fotosik.pl/169/9a8ae921c9954797m.png" alt="darmowy hosting obrazków" border="0" height="164" width="150" /></a></div>
<p>Kropelka jak przystało na porządny program zna wiele języków i bezsprzecznie można użyć określenia: poliglota.<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/d2e797540dd9ccd6.html" target="_blank"></a></p>
<div style="text-align:center;"><a href="http://www.fotosik.pl/pokaz_obrazek/d2e797540dd9ccd6.html" target="_blank"><img src="http://images32.fotosik.pl/166/d2e797540dd9ccd6m.png" alt="darmowy hosting obrazków" border="0" height="93" width="150" /></a></div>
<p>Deluge z konfiguracją nie pozostaje w tyle za innymi przedstawicielami swego segmentu. Tak więc podajemy podstawowe dane, a kreator zrobi po swojemu, oczywiście pozostawiając możliwość ręcznej zmiany wartości:<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/dceb5df494a175fe.html" target="_blank"></a></p>
<div style="text-align:center;"><a href="http://www.fotosik.pl/pokaz_obrazek/dceb5df494a175fe.html" target="_blank"><img src="http://images30.fotosik.pl/170/dceb5df494a175fem.png" alt="darmowy hosting obrazków" border="0" height="121" width="150" /></a></div>
<p>Później jakże łaskawie zostajemy poproszeni o pomoc, nie wymagajacą naszego udziału, a mianowicie wysłanie danych o systemie i wersji programu i właściwych mu składników:<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/f4b92aa219c7df4b.html" target="_blank"></a></p>
<div style="text-align:center;"><a href="http://www.fotosik.pl/pokaz_obrazek/f4b92aa219c7df4b.html" target="_blank"><img src="http://images32.fotosik.pl/166/f4b92aa219c7df4bm.png" alt="darmowy hosting obrazków" border="0" height="121" width="150" /></a></div>
<p>Teraz przed rozpoczęciem użytkowania pozostaje dopasować pozostałe opcje wedle upodobania. Ważne jest, aby pozwolić programowi na pełen przydział miejsca, co zaowocuje możliwością wyboru plików przed rozpoczęciem pobierania:<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/dfbd60e0a866849b.html" target="_blank"></a></p>
<div style="text-align:center;"><a href="http://www.fotosik.pl/pokaz_obrazek/dfbd60e0a866849b.html" target="_blank"><img src="http://images28.fotosik.pl/170/dfbd60e0a866849bm.png" alt="darmowy hosting obrazków" border="0" height="165" width="136" /></a></div>
<p>Dalej możemy chcieć sprawdzić dodatkowe opcje dostępne poprzez wtyczki:</p>
<blockquote><p><code><b>Move Torrent</b>:</code><br />
<code></code></p></blockquote>
<p><code> Wtyczka pozwala na przeniesienie torrenta do innego katalogu bez konieczności usuwania i ponownego dodawania go do programu. Aby przenieść torrenta gdzie indziej klikamy na żądane pobieranie, wybieramy opcję Move Torrent i wybieramy nowy folder.<br />
</code></p>
<blockquote><p><code><b>Network Activity Graph</b>:</code><br />
<code></code></p></blockquote>
<p><code> Graficznie przedstawia ruch sieciowy dla torrenta.<br />
</code></p>
<blockquote><p><code><b>Torrent Creator</b>:</code><br />
<code></code></p></blockquote>
<p><code> Jak sama nazwa wskazuje, pozwala na tworzenie nowych torrentów.<br />
</code></p>
<blockquote><p><code><b>Torrent Files</b>:</code><br />
<code></code></p></blockquote>
<p><code> Dodaje kolejną opcję, pozwalającą miedzy innymi na ustalenie priorytetu pobierania plików.<br />
</code></p>
<blockquote><p><code><b>Torrent Peers</b>:</code><br />
<code></code></p></blockquote>
<p><code> Wyświetla listę peerów.</code><br />
Inne wtyczki, których nie używam:</p>
<ul>
<li><b>Blocklist Importer</b>- importuje listę blokowania numerów IP. Chroni przed oszustwami itd.</li>
<li><b>Desired Ratio</b>- Ustawienie pożądanego ratio dla pliku.</li>
<li><b>Event Logging</b>- Dodaje kartę, w której wyświetla logi wybranych wydarzeń, akcji.</li>
<li><b>FlexRSS</b>- Używanie kanałów RSS dla torrentów.</li>
<li><b>Scheduler</b>- Pozwala na planowanie pobrań.</li>
<li><b>Speed Limiter</b>- Ustawienie pożądanych limitów prędkości dla każdego torrenta z osobna.</li>
<li><b>Torrent Notification</b>- Ikonka w zasobniku będzie migać po zakończeniu pobierania. Może również wyświetlić okienko informujące o tym.</li>
<li><b>Torrent Search</b>- Wyszukiwarka torrentów.</li>
<li><b>Web Seed</b>- Dodawanie seedów.</li>
<li><b>Web User Interface</b>- Podobnie jak w przypadku uTorrenta istnieje możliwość kontrolowania pobrań poprzez sieciowe UI.</li>
</ul>
<p>Tak jak w przypadku każdego innego programu można edytować liste trackerów:<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/54d46d3b1d6cfc8c.html" target="_blank"></p>
<div style="text-align:center;"><img src="http://images30.fotosik.pl/170/54d46d3b1d6cfc8cm.png" border="0" height="97" width="150" /></div>
<p></a><br />
Bardzo podobnie do uTorrenta, z tą różnicą, że tutaj jest to osobne okienko.<br />
Sam zaś program, jego okno główne, lista pobierania, zwał jak zwał, wygląda tak:<br />
<a href="http://www.fotosik.pl/pokaz_obrazek/1937755688eb45d2.html" target="_blank"></p>
<div style="text-align:center;"><img src="http://images31.fotosik.pl/166/1937755688eb45d2m.png" border="0" height="119" width="150" /></div>
<p></a><br />
Jak widać, nieprzeładowane, proste. Chwilami może nawet puste środowisko. Ale jest ergonomiczne. Wprawdzie na screenie prędkość pobierania nie powala, ale to nie znaczy, że są problemy z prędkością. Ściąga tak samo jak każdy inny szanujący się program.</p>
<p>Najważniejsze, skąd pobrać: <a href="http://download.deluge-torrent.org/windows/0.5.8.5/deluge-0.5.8.5.exe" title="Deluge 0.5.8.5 dla Windows">Deluge 0.5.8.5 dla Windows</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Slide de palestra sobre PyGTK]]></title>
<link>http://cachina.wordpress.com/?p=86</link>
<pubDate>Tue, 26 Feb 2008 12:47:13 +0000</pubDate>
<dc:creator>Mayron Cachina</dc:creator>
<guid>http://cachina.wordpress.com/?p=86</guid>
<description><![CDATA[Pesquisando sobre o assunto para fazer um cliente de um servidor socket para faculdade achei interes]]></description>
<content:encoded><![CDATA[<p>Pesquisando sobre o assunto para fazer um cliente de um servidor socket para faculdade achei interessante essa palestra...</p>
<p>foi retirada do site: <a href="http://junix.4demand.com/?p=20" title="Junix Blog" target="_blank">http://junix.4demand.com/?p=20</a><br />
ai vai a explicação do autor:<br />
<!--more-->"<b>Ontem, mesmo que debilitado, ministrei o curso de PyGTK na 4ª Semana de Software Livre, realizado na UNIRIO no Campus Urca, no Rio de Janeiro.</b></p>
<p>Apesar da febre e da gripe fortíssima, acredito que foi bastante proveitoso o minicurso de PyGTK com duração de 4 horas, embora ter sido ajudado pelos congressistas que assistiam a palestra, por já serem programadores e conhecerem Python.</p>
<p>A palestra parece que agradou e fiz mais amigos <img src="http://linuxinabox.no-ip.org/wp-includes/images/smilies/icon_smile.gif" alt=")" /></p>
<p>Vou aproveitar o assunto 4ª Semana de SL para parabenizar o trabalho de toda equipe UNIRIO, PRODERJ, e todo povo que contribuiu para o sucesso desse evento que é importantíssimo para difusão da cultura Software Livre.</p>
<p>E aproveitem porque ainda tem muita coisa boa até sexta-feira, confira as palestras no site clicando: <a href="http://www.forumsoftwarelivre.org.br/">aqui</a>"</p>
<div style="text-align:center;"><a href="http://junix.4demand.com/arquivos_junix/pygtk_4semana.pdf" title="Download" target="_blank"><img src="http://junix.4demand.com/imagens_junix/minicurso_tb.png" alt="Download" height="76" width="101" /></a><br />
<b>Download</b></div>
]]></content:encoded>
</item>
<item>
<title><![CDATA[O Construtor de interfaces Glade]]></title>
<link>http://philss.wordpress.com/?p=7</link>
<pubDate>Tue, 26 Feb 2008 03:51:06 +0000</pubDate>
<dc:creator>Philip Sampaio</dc:creator>
<guid>http://philss.wordpress.com/?p=7</guid>
<description><![CDATA[Muitos de vocês, leitores, devem estar acostumados ao modo de desenvolvimento do Windows (VB/Delphi]]></description>
<content:encoded><![CDATA[<p>Muitos de vocês, leitores, devem estar acostumados ao modo de desenvolvimento do Windows (VB/Delphi), oque me faz pensar que vocês odiariam ter que desenvolver uma interface gráfica somente em códigos.  Pois bem, existem muitos programas que utilizam este método para construir interfaces: somente em código fonte.</p>
<p>Isso pode ser muito bom, devido ao controle sobre o código-fonte, já que foi tudo construído por você mesmo, programador.</p>
<p>Mas, como nem todo mundo tem paciência e disposição suficiente para construir interfaces gráficas via código, a maior parte das interfaces que serão criadas nos tutorias, serão feitas com o Glade.</p>
<h3>Mas o que é o Glade?</h3>
<p>O Glade é um programa para desenvolvimento de interfaces gráficas para <a href="http://www.gtk.org/" title="The Gimp Toolkit" target="_blank">GTK+</a>(The Gimp Toolkit).</p>
<p>Com ele, é possível criar interfaces independentes de códigos, para que possa haver uma separação de códigos e interface. Isso beneficia muito o programador(ou programadores envolvidos no mesmo projeto), já que é muito mais fácil corrigir erros modificando só uma área do programa- interface ou código-fonte. Além disso, não acostuma o programador a mexer nas duas coisas ao mesmo tempo- estética e funcionalidade(design e código).</p>
<p>Acho que um programador não é obrigado a saber desenhar interfaces de usuários, já que o trabalho dele é programar, e não desenhar(desenhar é só um modo de falar, o programador é obrigado a saber várias coisas sobre acessibilidade, cores e etc).<br />
Com o Glade(ou outro GUI deste tipo), o trabalho pode ser muito bem dividido, aumentando a produtividade!</p>
<h3>Imagens do software</h3>
<p><a href="http://philss.wordpress.com/files/2008/02/glade001.jpg" title="Tela principal do Glade"><img src="http://philss.wordpress.com/files/2008/02/glade001.jpg" alt="Tela principal do Glade" /></a></p>
<p>Está é a interface do Glade 3.<br />
Do lado esquerdo temos a palheta de widgets(é como se chamam os objetos da interface), a direita temos a <i>treeview dos widgets já criados, e abaixo disso temos as propriedades dos widgets.</i></p>
<p><a href="http://philss.wordpress.com/files/2008/02/glade003.jpg" title="Glade em ação."><img src="http://philss.wordpress.com/files/2008/02/glade003.jpg" alt="Glade em ação." /></a></p>
<p>Um exemplo funcional.</p>
<p>Explicarei mais afundo algumas coisas sobre o Glade, mas basicamente construirei interfaces nele e modificarei em pyGTK.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Manejo del Puerto Paralelo con Python.]]></title>
<link>http://munguis.wordpress.com/?p=33</link>
<pubDate>Sat, 16 Feb 2008 06:08:58 +0000</pubDate>
<dc:creator>munguis</dc:creator>
<guid>http://munguis.wordpress.com/?p=33</guid>
<description><![CDATA[A pesar de ser un estudiante promedio de la Ingeniería en Sistemas, la verdad como que no me he des]]></description>
<content:encoded><![CDATA[<p align="justify"><b>A</b> pesar de ser un estudiante promedio de la Ingeniería en Sistemas, la verdad como que no me he destacado por ser un "chingón" dentro de algún campo del amplio rango de posibilidades que ofrece la carrera. Me la he pasado haciendo ahi proyectillos equisones, para pasar alguna materia, nada extraordinario, tal vez sea por hueva, tal vez por conformismo o tal vez, la peor de todas, por que al final descubriré que los sistemas no son para mí jajaja. Aprendí <a href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java" target="_blank">Java</a>, pero no soy un chingón en Java, aprendí <a href="http://es.wikipedia.org/wiki/SQL" target="_blank">SQL</a>, pero aún se me atoran algunas consultas, aprendí <a href="http://es.wikipedia.org/wiki/Lenguaje_ensamblador" target="_blank">ensamblador</a>, pero ya ni me acuerdo de los registros jaja, aprendí <a href="http://es.wikipedia.org/wiki/Php" target="_blank">PHP</a>, pero aún como que soy beginner, y así le puedo seguir...</p>
<p align="justify">Sin embargo en estos últimos días me agarró una corriente de inspiración y determinación y me puse a chingarle a <a href="http://es.wikipedia.org/wiki/Python" target="_blank">Python</a>, el pretexto: un proyecto de la materia de Interfaces que consistía en controlar un circuitillo de 8 <a href="http://es.wikipedia.org/wiki/Diodo_LED" target="_blank">LEDs</a> mediante el <a href="http://es.wikipedia.org/wiki/Puerto_paralelo" target="_blank">puerto paralelo</a>. El proyecto fue totalmente exitoso, por lo cual he decidido compartirles mi experiencia, por si algún día les dejan esta tarea en su prepa/conalep/tecno/cnci jajaja.</p>
<p><b>Una Pequeña Introducción.</b></p>
<p>Como nunca falta el profe mamón que pregunta -¿y por qué esto?-, ahi te va:</p>
<p align="justify">El puerto paralelo (el estándar en la computadora es un DB-25) es una interfaz con 25 pines, 8 son para datos (por lo cual se puede decir que envía 8 bits al mismo tiempo), 5 de estado, 4 de control y 8 de tierra eléctrica. Para esta tarea sólo nos interesan los 8 pines de datos (que van del 2 al 9) y los 8 de tierra para cerrar el circuito (que van del 18 al 25).</p>
<p align="center"><img src="http://www.fileden.com/files/2006/8/26/188528/imagenes/puerto.gif" /></p>
<p align="justify">También es útil saber que el puerto paralelo (generalmente las computadoras sólo vienen con uno) se carga en la dirección de memoria 0x378, por lo cual cuando se hace una operación con esa dirección de memoria significa que el puerto paralelo está involucrado. Y ya, basta de rollo.</p>
<p><b>Mis Ingredientes.</b></p>
<p align="justify">Especifico "mis" por que quiero dar a entender que este proyecto se puede realizar en una infinidad de maneras, desde la elaboración del circuito hasta el programa encargado de manipular el puerto. Pero les garantizo que si lo hacen a mi manera tendrán éxito, si no dejen comentario jaja.</p>
<p><i>Hardware.</i><br />
- 8 LEDs.<br />
- 8 resistencias de 120 ohms.<br />
- 9 cables delgados de cobre (1 de ellos que sea mas largo que los demás).<br />
- 1 conector macho DB-25.<br />
- Cautin y soldadura para fijar los cables al conector.<br />
- 1 placa <a href="http://es.wikipedia.org/wiki/Protoboard" target="_blank">protoboard</a>.<br />
- 1 PC con puerto paralelo (ja!).<br />
<i> Software.</i><br />
- <a href="http://es.wikipedia.org/wiki/Ubuntu_%28distribuci%C3%B3n_Linux%29" target="_blank">Ubuntu Gutsy Gibbon</a> (el cual ya trae integrado el compilador de Python, las librerias del escritorio <a href="http://es.wikipedia.org/wiki/Gtk" target="_blank">GTK+</a> y las librerías <a href="http://es.wikipedia.org/wiki/PyGTK" target="_blank">PyGTK</a> para la aplicación de Python con entorno gráfico.</p>
<p><b>Elaboración.</b></p>
<p align="justify">Soldar cuidadosamente los 8 cables a cada pin del 2 al 9 (es de total importancia que ninguna "rebaba" haga contacto con algún pin de al lado), y después hacer un fino hilo de soldadura que empiece en el pin 18 y que termine en el 25. Finalmente soldar el cable mas largo al pin 25.</p>
<p align="justify">Después tienes que construir un circuito sobre la protoboard de tal forma que quede así:</p>
<p align="center"><a href="http://www.fileden.com/files/2006/8/26/188528/imagenes/circuito.jpg"><img src="http://www.fileden.com/files/2006/8/26/188528/imagenes/circuito.jpg" height="375" width="500" /></a></p>
<p align="justify">Ya vamos a la mitad, venga. Ahora falta la parte lógica, para esto necesitaremos una librería (la cual es la encargada de interactuar con el puerto paralelo) que me encontré <a href="http://devpower.blogsite.org/index.php/blog/show/Python-Parport-Library.html" target="_blank">aquí</a>, descárgala y descomprímela en la carpeta donde vas a tener tu programita principal. Después copia y pega este código (<a href="http://www.fileden.com/files/2006/8/26/188528/paralelo.py.txt" target="_blank"><i>paralelo.py</i></a>) en tu editor de texto favorito (seguramente <a href="http://es.wikipedia.org/wiki/Gedit" target="_blank">gedit</a> es tu opción), lo guardas como "paralelo.py" y liiiiiiiiiiisto!!, ejecútalo.</p>
<p align="justify">¿Cómo ejecutarlo? Esta bien, anteayer yo tampoco sabía jaja. En tu terminal te vas al directorio donde tienes el programita (<i>cd directorio</i>), y ya ahí le das <i>sudo python paralelo.py</i> (tienes que poner <i>sudo</i> ya que el puerto paralelo solo puede ser controlado con permisos de raiz), y liiiiiiisto!!, debes tener una salida así:</p>
<p align="center"><img src="http://www.fileden.com/files/2006/8/26/188528/imagenes/paralelopython.jpg" /></p>
<p align="justify">El programita, a decir verdad, es bastante simple, pero me siento satisfecho ya que fue producto de 1 día de aprendizaje de Python, sin embargo como es "open source", ustedes pueden hacerle todas las mejoras que se les ocurra, como por ejemplo, agregarle unos "<i>checkboxes</i>" que representen cada pin que deba encenderse, me hubiera gustado hacerlo pero ya tenía el tiempo encima jaja.</p>
<p align="justify">En fin, espero les sea útil en algún momento de sus vidas, y pues si se les atora algo, no duden en preguntar. Espero escribir este tipo de posts con más frecuencia jaja.</p>
]]></content:encoded>
</item>

</channel>
</rss>
