<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Me Deu Branco!</title>
	<atom:link href="http://medeubranco.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://medeubranco.wordpress.com</link>
	<description>Linux, software livre, programação e... me deu branco</description>
	<lastBuildDate>Fri, 06 Jan 2012 17:55:16 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='medeubranco.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Me Deu Branco!</title>
		<link>http://medeubranco.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://medeubranco.wordpress.com/osd.xml" title="Me Deu Branco!" />
	<atom:link rel='hub' href='http://medeubranco.wordpress.com/?pushpress=hub'/>
		<item>
		<title>teste</title>
		<link>http://medeubranco.wordpress.com/2010/02/11/teste/</link>
		<comments>http://medeubranco.wordpress.com/2010/02/11/teste/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 23:07:44 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[teste]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=82</guid>
		<description><![CDATA[teste<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=82&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://medeubranco.files.wordpress.com/2010/02/leit_m1.jpg"><img class="alignnone size-full wp-image-87" title="leit_m" src="http://medeubranco.files.wordpress.com/2010/02/leit_m1.jpg?w=450" alt=""   /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=82&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2010/02/11/teste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>

		<media:content url="http://medeubranco.files.wordpress.com/2010/02/leit_m1.jpg" medium="image">
			<media:title type="html">leit_m</media:title>
		</media:content>
	</item>
		<item>
		<title>Threads com PyGTK</title>
		<link>http://medeubranco.wordpress.com/2008/07/17/threads-com-pygtk/</link>
		<comments>http://medeubranco.wordpress.com/2008/07/17/threads-com-pygtk/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 03:39:04 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[gtk]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[pygtk]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[thread]]></category>

		<guid isPermaLink="false">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ção, analise o código abaixo. Veja se lhe parece correto. O que deveria acontecer ao executar esse código? Uma janela com uma caixa de texto, um botão &#8220;iniciar&#8221; e um botão &#8220;interromper&#8221;. Clicando no &#8220;iniciar&#8221;, um loop inicia [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=64&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></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><pre class="brush: python;">

#! /usr/bin/env python
# -.- coding: utf-8 -.-
import gtk
import pygtk

continua=None
def iniciar(botao, texto):
    global continua
    continua=True
    x=0
    while continua:
        texto.set_text(str(x))
        x+=1

def parar(botao):
    global continua
    continua=False

# criando os componentes
win=gtk.Window()
box=gtk.VBox()
texto=gtk.Entry()
btinicia=gtk.Button(&quot;iniciar&quot; )
btpara=gtk.Button(&quot;interromper&quot; )

# ativando os eventos
btinicia.connect(&quot;clicked&quot;, iniciar, texto)
btpara.connect(&quot;clicked&quot;, parar)
win.connect(&quot;destroy&quot;,gtk.main_quit)

# encaixotando tudo
box.pack_start(texto)
box.pack_start(btinicia)
box.pack_start(btpara)
win.add(box)

# exibindo tudo
win.show_all()

# iniciando o loop principal do GTK
gtk.main()

</pre></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 &#8220;iniciar&#8221; e um botão &#8220;interromper&#8221;.</p>
<p style="text-align:justify;">Clicando no &#8220;iniciar&#8221;, um loop inicia e começa a mudar o conteúdo da caixa de texto para &#8220;1&#8243;, &#8220;2&#8243; e assim por diante até que se clique em &#8220;interromper&#8221;.</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 &#8220;iniciar&#8221;, 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 &#8220;interromper&#8221;. Simplesmente seu programa pára de responder.</p>
<p style="text-align:justify;"><span id="more-64"></span>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><pre class="brush: python;">

    while continua:
        while gtk.events_pending():gtk.main_iteration()
        texto.set_text(str(x))
        x+=1
</pre></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><pre class="brush: python;">

from threading import Thread
import time
import gtk, gobject
gtk.gdk.threads_init()
a_thread=None

def iniciar(botao, texto):
    global a_thread
    #iniciando a thread
    a_thread=Thread(target=nosso_loop, args=(texto,botao))
    a_thread.morta=False
    a_thread.start()

def nosso_loop(texto, botao):
    # desabilitando o botao &quot;iniciar&quot;
    # para que o usuario nao possa
    # iniciar novas threads enquanto
    # esta continuar
    botao.set_sensitive(0)

    z=0
    while not a_thread.morta:
        z+=1
        # chamando a funcao atualiza_texto
        # com o idle_add
        gobject.idle_add(atualiza_texto,texto, z)

        time.sleep(0.00001)
    # o loop terminou
    # o botao vai poder agora
    # ser clicado de no:vo
    botao.set_sensitive(1)

def atualiza_texto(texto, valor):
    texto.set_text(str(valor))

def interromper(botao=None):
    a_thread.morta=True

def sair(win):
    interromper()
    gtk.main_quit()

#criando os componentes
win=gtk.Window()
box=gtk.VBox()
texto=gtk.Entry()
botao=gtk.Button(&quot;iniciar&quot; )
btmata=gtk.Button(&quot;interromper&quot; )

#ativando os eventos
botao.connect(&quot;clicked&quot;, iniciar, texto)
btmata.connect(&quot;clicked&quot;, interromper)
win.connect(&quot;destroy&quot;,sair)

#encaixotando tudo
box.pack_start(texto)
box.pack_start(botao)
box.pack_start(btmata)
win.add(box)

#exibindo tudo
win.show_all()

#iniciando o loop principal do GTK
gtk.main()
</pre></p>
<p align="justify">Incluimos a thread neste código. A função &#8220;iniciar()&#8221; agora simplesmente inicia a thread. O loop infinito foi transferido para a função &#8220;nosso_loop()&#8221;, que será executada pela thread.</p>
<p align="justify">A atualização da caixa de texto foi transferida para  a função &#8220;atualiza_texto()&#8221;, que é executada com &#8220;gobject.idle_Add()&#8221;.</p>
<p align="justify">Pode executar este código. Vai funcionar.</p>
<p align="justify">
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/64/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/64/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=64&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/07/17/threads-com-pygtk/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>
	</item>
		<item>
		<title>python &#8211; loop com xrange()</title>
		<link>http://medeubranco.wordpress.com/2008/07/16/python-loop-com-xrange/</link>
		<comments>http://medeubranco.wordpress.com/2008/07/16/python-loop-com-xrange/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 03:57:57 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[loop]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=58</guid>
		<description><![CDATA[No artigo anterior, eu apresentei um código em que fazia um loop while incrementando uma variável. Sobre esse loop, fiz o seguinte comentário: &#8220;Quanto ao loop no método run(), cabe um comentário aqui: na minha infinita ignorância, sempre usei “for x in range(n)” para fazer um loop com n iterações. Não me ocorria que range(n) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=58&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">No <a href="http://medeubranco.wordpress.com/2008/07/12/exemplo-de-thread-reaproveitando-nossa-arvore-binaria/">artigo anterior</a>, eu apresentei um código em que fazia um loop while incrementando uma variável. Sobre esse loop, fiz o seguinte comentário:</p>
<p style="text-align:justify;padding-left:30px;"><em>&#8220;Quanto ao loop no método <strong>run()</strong>, cabe um comentário aqui: na minha infinita ignorância, sempre usei <strong>“for x in range(<em>n</em>)”</strong> para fazer um loop com <strong><em>n</em></strong> iterações. Não me ocorria que <strong>range(<em>n</em>)</strong> retorna uma lista com <strong><em>n</em></strong> elementos. Como nós queremos aqui fazer muitas e muitas iterações, a lista gerada num loop <strong>“for x in range(<em>n</em>)”</strong> iria ocupar muita memória e não teria utilidade nenhuma no nosso código.&#8221;</em></p>
<p style="text-align:justify;">Acontece que, mesmo ali, minha &#8220;infinita ignorância&#8221; ainda falou mais alto. Acontece que acabei de tropeçar na função xrange(), de utilização idêntica à da função range(). A diferença é que, em vez de retornar uma lista como range(), retorna um objeto que gera os números do intervalo sob demanda. Conforme a documentação, é ligeiramente mais rápida e mais eficiente com a memória.</p>
<p style="text-align:justify;">Resultado do comando <strong>pydoc xrange</strong> no meu terminal:</p>
<pre>Help on class xrange in module __builtin__:

class xrange(object)
|  xrange([start,] stop[, step]) -&gt; xrange object
|
|  Like range(), but instead of returning a list, returns an object that
|  generates the numbers in the range on demand.  For looping, this is
|  slightly faster than range() and more memory efficient.
|
|  Methods defined here:
|
|  __getattribute__(...)
|      x.__getattribute__('name') &lt;==&gt; x.name
|
|  __getitem__(...)
|      x.__getitem__(y) &lt;==&gt; x[y]
|
|  __iter__(...)
|      x.__iter__() &lt;==&gt; iter(x)
|
|  __len__(...)
|      x.__len__() &lt;==&gt; len(x)
|
|  __repr__(...)
|      x.__repr__() &lt;==&gt; repr(x)
|
|  __reversed__(...)
|      Returns a reverse iterator.
|
|  ----------------------------------------------------------------------
|  Data and other attributes defined here:
|
|  __new__ = &lt;built-in method __new__ of type object at 0x815e620&gt;
|      T.__new__(S, ...) -&gt; a new object with type S, a subtype of T</pre>
<p style="text-align:justify;">Utilizando:</p>
<p><pre class="brush: python;">
for num in xrange(3):
    print num
</pre></p>
<p style="text-align:justify;">Agora posso dizer que o tamanho da minha &#8220;infinita ignorância&#8221; é igual a infinito -1 .</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/58/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/58/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/58/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=58&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/07/16/python-loop-com-xrange/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>
	</item>
		<item>
		<title>Exemplo de thread reaproveitando nossa árvore binária</title>
		<link>http://medeubranco.wordpress.com/2008/07/12/exemplo-de-thread-reaproveitando-nossa-arvore-binaria/</link>
		<comments>http://medeubranco.wordpress.com/2008/07/12/exemplo-de-thread-reaproveitando-nossa-arvore-binaria/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 01:22:51 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[arvore binaria]]></category>
		<category><![CDATA[thread]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=56</guid>
		<description><![CDATA[No artigo sobre threads eu não coloquei nenhum exemplo &#8220;prático&#8221; de utilização de threads, então vou colocar aqui, misturando conteúdo dos artigos anteriores. No artigo sobre árvores binárias, nossa classe era uma árvore binária que guardava palavras de um arquivo de texto, com um contador para a quantidade de ocorrências de cada palavra. O programa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=56&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">No artigo sobre threads eu não coloquei nenhum exemplo &#8220;prático&#8221; de utilização de threads, então vou colocar aqui, misturando conteúdo dos artigos anteriores.</p>
<p style="text-align:justify;">No artigo sobre árvores binárias, nossa classe era uma árvore binária que guardava palavras de um arquivo de texto, com um contador para a quantidade de ocorrências de cada palavra. O programa de teste para essa classe jogava o conteúdo de um arquivo na árvore, e depois de a ter carregado, mostrava todas as palavras em ordem alfabética. Vamos usar esta classe no nosso exemplo de thread.</p>
<p style="text-align:justify;">Como eu queria montar uma árvore tão grande quanto possível, em vez de arrumar arquivos grandes para deles extrair palavras, resolvi fazer um gerador de palavras aleatórias. Vamos usar ele também.</p>
<p style="text-align:justify;">A idéia: fazer um loop com um número muito grande de iterações. A cada iteração, uma palavra aleatória é criada e é adicionada à árvore. A classe da arvore tem um método para busca de palavras, arvbin.busca(), e ele será usado pelo nosso programa exemplo numa interface interativa. O usuário digita uma palavra e o programa diz se existe a palavra na árvore e a quantidade de ocorrências desta palavra.</p>
<p>O esquema do programa:</p>
<ul>
<li>passo 1 &#8211; gerar muitas palavras aleatórias, adicionando-as à árvore;</li>
<li> passo 2 &#8211; apresentar um prompt para pesquisa de palavras na árvore.</li>
</ul>
<p style="text-align:justify;">Um problema se apresenta aqui: quantas palavras nós vamos gerar, e quanto tempo vai levar até que todas as palavras tenham sido geradas e a árvore esteja completa? Como o código é seqüencial, iniciamos o passo 1 e só após a sua conclusão é que entraremos no passo 2. A não ser que pudéssemos executar os dois ao mesmo tempo. É aí que entra a thread.</p>
<p style="text-align:justify;"><span id="more-56"></span>Vamos construir nosso programa, então. Repassando, dois componentes nossos são usados aqui: a árvore e o gerador de palavras. Criaremos um terceiro, que é uma classe filha de threading.Thread.</p>
<p style="text-align:justify;">O gerador de palavras não é nada sofisticado &#8211; assim como os outros componentes aqui. Simplesmente ele gera seqüências de letras que alternam entre vogais e consoantes &#8211; uma vogal, uma consoante, uma vogal, etc. Se a consoante for um &#8216;q&#8217;, adiciona-se a ela um &#8216;u&#8217; e adicionamos mais uma vogal.</p>
<p><strong>gerapalavra.py</strong>:</p>
<p><pre class="brush: python;">
#! /usr/bin/env python
import random
rand=random.random

consoantes='bcdfghjlmnpqrstvxz'
vogais='aeiou'

def pegaletra(tipo):
    if tipo==0:
        return consoantes[int(rand()*len(consoantes))]
    if tipo==1:
        return vogais[int(rand()*len(vogais))]

def gerapalavra():
    tamanho =int(rand()*4+3)
    atual=int(rand()*2)
    palavra=''
    for letr in range(tamanho+1):
        letra=pegaletra(atual)
        if letra=='q':
            letra='qu'
        palavra=palavra + letra
        if atual==0:
            atual=1
        else:
            atual=0
    return palavra
</pre></p>
<p style="text-align:justify;">Usamos neste código a função random() do módulo random. Essa função gera um número aleatório entre 0 e 1.</p>
<p style="text-align:justify;">A classe arvbin, que vimos num artigo anterior, foi ligeiramente modificada aqui, por capricho meu. Como estava já serviria o nosso propósito.</p>
<p><strong>arvore.py</strong></p>
<p><pre class="brush: python;">
#! /usr/bin/env python
# -.- encoding: utf-8 -.-

class arvbin:
    contanode=0
    def __init__(self, Valor):
        self.Menor=None
        self.Maior=None
        self.conta=1
        self.valor=Valor
        arvbin.contanode+=1

    def add(self,valor):
        if valor&gt;self.valor:
            self.addmaior(valor)
        elif valor&lt;self.valor:
            self.addmenor(valor)
        else:
            self.conta=self.conta+1

    def addmenor(self,valor):
        if self.Menor:
            self.Menor.add(valor)
        else:
            self.Menor=arvbin(valor)

    def addmaior(self,valor):
        if self.Maior:
            self.Maior.add(valor)
        else:
            self.Maior=arvbin(valor)

    def busca(self,valor):
        if valor&gt;self.valor:
            if self.Maior:
                return self.Maior.busca(valor)
            else :
                return None
        elif valor&lt;self.valor:
            if self.Menor:
                return self.Menor.busca(valor)
            else :
                return None
        else:
            return self

    def ordena(self, perna=1 ):
        listamenor=[]
        listamaior=[]
        if self.Menor:
            listamenor=self.Menor.ordena(perna+1 )
        if self.Maior:
            listamaior=self.Maior.ordena(perna+1 )
        return listamenor + [ (self.valor, self.conta, perna) ] + listamaior
</pre></p>
<p>O método <strong>arvbin.ordena()</strong> não será usado pelo nosso programa.</p>
<p>Vamos finalmente à thread :</p>
<p><pre class="brush: python;">
#! /usr/bin/env python
# -.- encoding: utf-8 -.-

import threading
import arvore
import gerapalavra
class minhathread(threading.Thread):
    def __init__(self, arv):
        threading.Thread.__init__(self)
        self.arv=arv
        self.quantos=1

    def set_quantos(self, quantos):
        self.quantos=quantos

    def run(self):
        n=0
        while n&lt;self.quantos:
            self.arv.add(gerapalavra.gerapalavra())
            n+=1
        print 'terminei'

if __name__ == '__main__':
    arv=arvore.arvbin(gerapalavra.gerapalavra())

    thr=minhathread(arv)
    thr.set_quantos(6500000)
    thr.start()
    while 1:
        nome=raw_input( 'digite uma palavra: ' )
        result = arv.busca(nome)
        if result:
            print result.valor  + '  ,  ' +  str(result.conta)  + ' ocorrências'
            print str(arv.contanode) +  ' nós na arvore'
        else:
            print 'nao achou em ' + str(arv.contanode)
</pre></p>
<p style="text-align:justify;">Nossa classe, <strong>class minhathread</strong>, herda de <strong>threading.Thread</strong>. Sobrescrevemos os métodos <strong>__init__</strong> (o construtor da classe) e <strong>run</strong>, que é onde as coisas acontecem; incluímos dois atributos que são <strong>arv</strong> (um apontador para a raiz da nossa arvore binaria) e <strong>quantos</strong>; e adicionamos um método <strong>set_quantos</strong>. O atributo <strong>quantos</strong> determina quantas palavras aleatórias serão geradas; o método <strong>set_quantos</strong> modifica ou atribui um valor a <strong>quantos</strong>.</p>
<p style="text-align:justify;">Quanto ao loop no método <strong>run()</strong>, cabe um comentário aqui: na minha infinita ignorância, sempre usei <strong>&#8220;for x in range(<em>n</em>)&#8221;</strong> para fazer um loop com <strong><em>n</em></strong> iterações. Não me ocorria que <strong>range(<em>n</em>)</strong> retorna uma lista com <strong><em>n</em></strong> elementos. Como nós queremos aqui fazer muitas e muitas iterações, a lista gerada num loop <strong>&#8220;for x in range(<em>n</em>)&#8221;</strong> iria ocupar muita memória e não teria utilidade nenhuma no nosso código.</p>
<p style="text-align:justify;">Por fim, após <code>if __name__ == '__main__': </code>:</p>
<ul>
<li> linha 24: criamos nossa árvore;</li>
<li> linhas 26,27 e 28 : iniciamos a thread, informamos que queremos 6500000 palavras e  damos o &#8216;start&#8217; na thread;</li>
<li>a partir da linha 29: um loop infinito entra para que possamos fazer pesquisa de palavras na árvore.</li>
</ul>
<p style="text-align:justify;">Se você for testar o programa, use na pesquisa palavras com quatro ou mais letras e que alternem vogais e consoantes. O gerador de palavras aleatórias gera palavras como as abaixo:</p>
<ul>
<li>ezecavi<br />
imepu<br />
ofum<br />
bumequot<br />
udasaru<br />
avune<br />
mevepaf<br />
azicaqu<br />
camo<br />
mesito<br />
cuvolo<br />
equimef<br />
abafah<br />
razan<br />
umerec<br />
cegexe<br />
ejadoquu</li>
</ul>
<p style="text-align:justify;">Executando o programa com as 6500000 previstas, em pouco tempo começam a aparecer palavras existentes no nosso dicionário, como bola, faca, pedal,</p>
<p>Como ficou a execução do código aqui:</p>
<pre>digite uma palavra: poder
nao achou em 227178
digite uma palavra: falar
nao achou em 238439
digite uma palavra: fazer
nao achou em 246752
digite uma palavra: ficar
ficar  ,  1 ocorrências
254725 nós na arvore
digite uma palavra: bola
bola  ,  4 ocorrências
266515 nós na arvore
digite uma palavra: tapete
nao achou em 309667
digite uma palavra:</pre>
<p style="text-align:justify;">Você deve ter reparado que não há nenhum modo de encerrar a execução do programa. Você pode esperar pelo fim da execução, implementar um modo de interromper a comando  ou matar o processo usando os meios para isso do seu sistema operacional.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/56/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/56/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/56/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=56&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/07/12/exemplo-de-thread-reaproveitando-nossa-arvore-binaria/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>
	</item>
		<item>
		<title>Threads em python</title>
		<link>http://medeubranco.wordpress.com/2008/07/10/threads-em-python/</link>
		<comments>http://medeubranco.wordpress.com/2008/07/10/threads-em-python/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 02:01:53 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[thread]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=53</guid>
		<description><![CDATA[Neste artigo vamos falar de Threads em Python. Antes de começar, preciso avisar que estou escrevendo enquanto pesquiso sobre o tema. Não atribua a este artigo autoridade maior do que ele merece. O objetivo dele é compartilhar o aprendizado do autor. Isto significa que o que é mostrado aqui está correto, mas não te dispensa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=53&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Neste artigo vamos falar de Threads em Python. Antes de começar, preciso avisar que estou escrevendo enquanto pesquiso sobre o tema. Não atribua a este artigo autoridade maior do que ele merece. O objetivo dele é compartilhar o aprendizado do autor. Isto significa que o que é mostrado aqui está correto, mas não te dispensa de pesquisar em outras fontes.</p>
<p align="justify">Feitas as ressalvas, voltemos ao tema.</p>
<p align="justify">Explicando de forma grosseira, thread é uma forma de você não deixar seu programa &#8216;travar&#8217; enquanto executa uma tarefa demorada. Usando thread, voce pode colocar essa tarefa para correr em paralelo, enquanto seu código segue; como uma bifurcação, mas dentro do mesmo processo, compartilhando o mesmo espaço de programa, como as variáveis e tudo o mais.</p>
<p align="justify">Há duas formas de você adicionar funcionalidades de threads ao seu código: com o módulo <strong>thread</strong> ou com a classe <strong>threading.Thread</strong>.</p>
<p align="justify">Com o módulo thread, você chama o método <strong>thread.start_new_thread(func, args)</strong>, onde <strong>func</strong> é a função que você escreveu e que vai ser executada pela thread, e <strong>args</strong> é um tupla com os argumentos para a sua função.</p>
<p align="justify">O módulo <strong>threading</strong> é uma &#8216;extensão&#8217; do módulo <strong>thread</strong>. Ele implementa a classe Thread e, entre outros, seu método start(). O método start() vai (não diretamente) chamar o método <strong>run()</strong> com <strong>start_new_thread()</strong>. Há também mais de uma forma de usar <strong>threading.Thread</strong>:</p>
<ul>
<li>criando uma instância de <strong>threading.Thread()</strong> ou</li>
</ul>
<ul>
<li> criando uma classe que herda de <strong>threading.Thread</strong> e sobrescrevendo o método <strong>run()</strong>.</li>
</ul>
<p>Na primeira forma:</p>
<p><pre class="brush: python;">
from threading import Thread
def minha_funcao(algumacoisa):
    print algumacoisa

th=Thread( target=minha_funcao, args = ( 'qualquercoisa', ) )
th.start()
</pre></p>
<p align="justify">O construtor de Thread recebe, além de <strong>self</strong>, 6 argumentos (<a href="http://docs.python.org/lib/thread-objects.html">referência aqui</a>), e entre eles:</p>
<ul>
<li><em>group</em>: Deve ser sempre <strong>None</strong>, é reservado para uso em uma futura classe <strong>ThreadGroup</strong>;</li>
</ul>
<ul>
<li><em>target</em>: o método ou função que vai ser chamado em <strong>run()</strong>;</li>
</ul>
<ul>
<li> <em>args</em>: uma tupla com os argumentos que serão passados para a função em <em>target</em>.</li>
</ul>
<p align="justify">Veja trecho do código de threading.py, localizado no meu sistema em <strong>/usr/lib/python2.5</strong> .</p>
<p align="justify"><em>Para ver onde fica o arquivo no seu sistema, veja o valor de  threading.__file__</em></p>
<p><pre class="brush: python;">
class Thread(_Verbose):

    __initialized = False
    # Need to store a reference to sys.exc_info for printing
    # out exceptions when a thread tries to use a global var. during interp.
    # shutdown and thus raises an exception about trying to perform some
    # operation on/with a NoneType
    __exc_info = _sys.exc_info

    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None):
        assert group is None, &quot;group argument must be None for now&quot;
        _Verbose.__init__(self, verbose)
        if kwargs is None:
            kwargs = {}
        self.__target = target
        self.__name = str(name or _newname())
        self.__args = args
        self.__kwargs = kwargs
        self.__daemonic = self._set_daemon()
        self.__started = False
        self.__stopped = False
        self.__block = Condition(Lock())
        self.__initialized = True
        # sys.stderr is not stored in the class like
        # sys.exc_info since it can be changed between instances
        self.__stderr = _sys.stderr

</pre></p>
<p align="justify">Na segunda forma (herdando de <strong>threading.Thread</strong>),<strong> </strong><span style="text-decoration:underline;">somente</span> os métodos <strong>__init__()</strong> e <strong>run()</strong> podem ser sobrescritos.</p>
<p><pre class="brush: python;">
# -.- coding: utf-8 -.-
from threading import Thread

class minhaThread(Thread):
    # sobrescrevendo o método __init__()
    def __init__(self, meu_argumento):
        # o metodo __init__ da superclasse
        # deve ser chamado para proceder
        # com a inicialização
        Thread.__init__(self)
        self.atributo=meu_argumento

    # sobrescrevendo o metodo run()
    def run(self):
        #insira seu codigo aqui
        print 'patata'

</pre></p>
<p align="justify">Para executar a thread, você cria uma instância de <strong>minhaThread()</strong> e chama o método <strong>minhaThread.start()</strong>.</p>
<p><pre class="brush: python;">
thr = minhaThread( 'algum argumento' )
thr.start()
</pre></p>
<p>Não estenderemos por agora o artigo, e não haverá aqui nenhum exemplo &#8220;funcional&#8221; de utilização de threads.</p>
<p>Por enquanto, ficam as referências de pesquisa:</p>
<p><a href="http://linuxgazette.net/107/pai.html">Understanding Threading in Python</a></p>
<p><a href="http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html">Using threads in PyGTK</a></p>
<p><a href="http://docs.python.org/lib/thread-objects.html">Python Library Reference &#8211; 15.3.6 Thread Objects</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/53/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/53/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=53&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/07/10/threads-em-python/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>
	</item>
		<item>
		<title>Enquanto isso&#8230;</title>
		<link>http://medeubranco.wordpress.com/2008/07/06/enquanto-isso/</link>
		<comments>http://medeubranco.wordpress.com/2008/07/06/enquanto-isso/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 03:59:58 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[me deu branco]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=48</guid>
		<description><![CDATA[Estamos no ano 2008 DC. Toda a Internet foi ocupada pelos romanos&#8230; Toda? Não! Uma aldeia habitada por irredutíveis nerds resiste ainda e sempre ao invasor. E a vida não é fácil às guarnições de legionários romanos dos campos entrincheirados de Babaorum, Aquarium, Laudanum e Petibonum&#8230; E a vida segue na nossa pequena e pacata [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=48&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Estamos no ano 2008 DC. Toda a Internet foi ocupada pelos romanos&#8230; Toda? Não! Uma aldeia habitada por irredutíveis nerds resiste ainda e sempre ao invasor. E a vida não é fácil às guarnições de legionários romanos dos campos entrincheirados de Babaorum, Aquarium, Laudanum e Petibonum&#8230;</p>
<p><a href="http://medeubranco.files.wordpress.com/2008/07/mapa1.png"><img class="alignnone size-medium wp-image-51" src="http://medeubranco.files.wordpress.com/2008/07/mapa1.png?w=264&#038;h=300" alt="" width="264" height="300" /></a></p>
<p>E a vida segue na nossa pequena e pacata aldeia</p>
<p><a href="http://medeubranco.files.wordpress.com/2008/07/briga1.jpg"><img class="alignnone size-medium wp-image-52" src="http://medeubranco.files.wordpress.com/2008/07/briga1.jpg?w=300&#038;h=177" alt="" width="300" height="177" /></a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/48/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/48/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=48&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/07/06/enquanto-isso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>

		<media:content url="http://medeubranco.files.wordpress.com/2008/07/mapa1.png?w=264" medium="image" />

		<media:content url="http://medeubranco.files.wordpress.com/2008/07/briga1.jpg?w=300" medium="image" />
	</item>
		<item>
		<title>Brincando de arvore binária com Python</title>
		<link>http://medeubranco.wordpress.com/2008/07/05/brincando-de-arvore-binaria-com-python/</link>
		<comments>http://medeubranco.wordpress.com/2008/07/05/brincando-de-arvore-binaria-com-python/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 03:18:03 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[arvore binaria]]></category>
		<category><![CDATA[binary tree]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=47</guid>
		<description><![CDATA[De repente me deu vontade de fazer uma árvore binária em python. Não sei por que, nem para quê, mas deu vontade. Usei um exemplo que creio ter visto no livro &#8220;C A linguagem de Programação&#8221; de Brian Kernighan e Dennis Ritchie : contagem de palavras em um texto. O livro fala de árvores binárias [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=47&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">De repente me deu vontade de fazer uma <a href="http://pt.wikipedia.org/wiki/%C3%81rvore_de_busca_bin%C3%A1ria">árvore binária</a> em python. Não sei por que, nem para quê, mas deu vontade.</p>
<p align="justify">Usei um exemplo que creio ter visto no livro <strong><em>&#8220;C A linguagem de Programação&#8221;</em></strong> de <a href="http://pt.wikipedia.org/wiki/Brian_Kernighan">Brian Kernighan</a> e <a href="http://pt.wikipedia.org/wiki/Dennis_Ritchie">Dennis Ritchie</a> : contagem de palavras em um texto.</p>
<p align="justify">O livro fala de árvores binárias como alternativa, neste problema de contagens de palavras, à <a href="http://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria">pesquisa binária</a>. Numa pesquisa binária, pressupomos que a lista de valores está previamente ordenada. Isso não deve ocorrer com as palavras de um texto qualquer. Não sabemos nem mesmo a quantidade de palavras que podem estar contidas nesse texto, de modo que pode não ser muito eficiente rodar previamente um <a href="http://pt.wikipedia.org/wiki/Algoritmos_de_ordena%C3%A7%C3%A3o">algoritmo de ordenação</a>. A salvação então é a tal árvore binária.</p>
<p align="justify">No meu código abaixo, criei uma classe (arvbin)  para representar os nós da árvore. Os atributos da classe são: a palavra, o contador de ocorrências da palavra, um apontador para a palavra menor e outro para a maior:</p>
<p><pre class="brush: python;">
class arvbin:
    def __init__(self, Valor):
        self.Menor=None  #apontador para a palavra menor
        self.Maior=None  #apontador para a palavra maior
        self.conta=1     #conttador de ocorrências
        self.valor=Valor #a palavra
</pre></p>
<p align="justify">
<p align="justify">
<p align="justify">
<p align="justify">
<p align="justify"><span id="more-47"></span></p>
<p align="justify">O método <strong>add</strong> percorre a árvore até achar um lugar apropriado para a palavra a ser adicionada. Em cada nó, ele compara a nova palavra à palavra do nó. Se forem iguais, simplesmente incrementa o contador e retorna; se for maior, verifica se ja existe um nó maior no apontador sef.Maior; não tendo, adiciona um novo nó ao apontador &#8220;self.Maior&#8221;, com a palavra nova. Se já existe o nó maior, repete a operação, agora já no nó maior. Se a nova palavra for menor, dá-se a mesma operação, só que a partir do apontador self.Menor.</p>
<p align="justify">O método<strong> busca</strong> percorre a árvore buscando um nó que contenha determinada palavra.</p>
<p align="justify">O método<strong> ordena</strong> percorre recursivamente a árvore e retorna uma lista ordenada com as palavras.</p>
<p><pre class="brush: python;">

#! /usr/bin/env python
# -.- encoding: utf-8 -.-

class arvbin:
    def __init__(self, Valor):
        self.Menor=None
        self.Maior=None
        self.conta=1
        self.valor=Valor

    def add(self,valor):
        if valor&gt;self.valor:
            self.addmaior(valor)
        elif valor&lt;self.valor:
            self.addmenor(valor)
        else:
            self.conta=self.conta+1

    def addmenor(self,valor):
        if self.Menor:
            self.Menor.add(valor)
        else:
            self.Menor=arvbin(valor)

    def addmaior(self,valor):
        if self.Maior:
            self.Maior.add(valor)
        else:
            self.Maior=arvbin(valor)

    def busca(self,valor):
        if valor&gt;self.valor:
            if self.Maior:
                return self.Maior.busca(valor)
            else :
                return None
        elif valor&lt;self.valor:
            if self.Menor:
                return self.Menor.busca(valor)
            else :
                return None
        else:
            return self

    def ordena(self):
        listamenor=[]
        listamaior=[]
        if self.Menor:
            listamenor=self.Menor.ordena()
        if self.Maior:
            listamaior=self.Maior.ordena()
        return listamenor + [ (self.valor, self.conta) ] + listamaior 

</pre></p>
<p align="justify">Para testar meu código, adicionei o trecho abaixo. Este código supõe que já existe um arquivo <em>&#8220;/tmp/texto&#8221;</em> contendo as palavras da nossa brincadeira. Dá para criar um arquivo assim simplesmente copiando um grande texto na web.</p>
<p><pre class="brush: python;">
if __name__ == '__main__':
    texto=open('/tmp/texto','r' )
    a=texto.read()

    remover=[ '.',',',';',':','?','!','(',')','\'','&quot;' ]
    for remova in remover:
        a=a.replace(remova,'' )

    a=a.replace('\n',' ' )

    a=a.split()
    raiz=arvbin(a[-1] )
    a.pop()
    for palavra in a:
        raiz.add(palavra.upper())
    for palavra in raiz.ordena():
        print palavra[1], palavra[0]

    achei = raiz.busca('não' )
    if achei:
        print achei.valor, achei.conta

</pre></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/47/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/47/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=47&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/07/05/brincando-de-arvore-binaria-com-python/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>
	</item>
		<item>
		<title>Mais DrawingArea, Orientação a objetos e herança (e glade)</title>
		<link>http://medeubranco.wordpress.com/2008/06/30/mais-drawingarea-orientacao-a-objetos-e-heranca-e-glade/</link>
		<comments>http://medeubranco.wordpress.com/2008/06/30/mais-drawingarea-orientacao-a-objetos-e-heranca-e-glade/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 03:14:50 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[pygtk]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[drawingArea]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[objetos]]></category>

		<guid isPermaLink="false">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 janela em PyGTK Criando uma simples janela em PyGTK &#8211; parte II DrawingArea &#8211; Desenhando na tela com PyGTK Orientação a Objetos com python Orientação a Objetos &#8211; Herança Como aqui vamos usar o Glade, recomendo também uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=38&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-45" src="http://medeubranco.files.wordpress.com/2008/06/desenho.png?w=450" 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 &#8211; parte II</a><br />
<a href="http://medeubranco.wordpress.com/2008/06/15/drawingarea-desenhando-na-tela-com-pygtk/">DrawingArea &#8211; 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 &#8211; 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><pre class="brush: python;">

import gtk

# do modulo gtk, importamos DrawingArea e vamos chamar de 'DA'
from gtk import DrawingArea as DA

class tela(DA):
    def __init__(self):
        # executanto o construtor da classe pai (DrawingArea)
        DA.__init__(self)
</pre></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 &#8220;Caixa Vertical&#8221; (<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>&#8220;não</strong>&#8221; 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 &#8216;botão1&#8242; (é, poderia ter ficado Button1 mesmo);</p>
<p>- em<strong> <em>Empacotamento</em></strong>, mude para <strong>&#8220;não</strong>&#8221; as opções <strong><em>Expandir</em></strong> e <strong><em>Preencher</em></strong>;</p>
<p>- no espaço do meio, adicione  uma &#8216;Porta de Visualização&#8217;  (ViewPort) ;</p>
<p>- mude o nome da ViewPort para &#8216;caixatela&#8217;</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.files.wordpress.com/2008/06/gladebglade.png"><img class="aligncenter size-medium wp-image-44" src="http://medeubranco.files.wordpress.com/2008/06/gladebglade.png?w=448&#038;h=305" alt="" width="448" height="305" /></a></p>
<p><a href="http://medeubranco.files.wordpress.com/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 &#8216;rodinha&#8217; 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>&#8216;button-press-event&#8217;</em>, <em>&#8216;button-release-event&#8217;</em> e<em> &#8216;motion-notify-event&#8217;</em> ). Um quarto evento, o de rolagem da rodinha (&#8216;scroll-event&#8217; ), está envolvido na operação de remover pontos do polígono.</p>
<p><pre class="brush: python;">

class tela(DA):
    def __init__(self):
        DA.__init__(self)
        self.definecores()

        # atributo que determina se o botão está pressionado
        self.apertou=False

        # conectando o expose-event a uma função
        # que vai pedir que a tela seja redesenhada
        self.connect('expose-event',self.expose)

        # adicionando os eventos de mouse
        self.add_events(gtk.gdk.BUTTON_PRESS_MASK |
            gtk.gdk.BUTTON_RELEASE_MASK |
            gtk.gdk.MOTION_NOTIFY |
            gtk.gdk.POINTER_MOTION_MASK
            )

        # conectando cada evento à sua função correspondente

        # botão de mouse pressionado
        self.connect('button-press-event',self.clica)
        # soltando o botão
        self.connect('button-release-event',self.solta)
        # movimento de mouse
        self.connect('motion-notify-event',self.arrasta)
        # rolando a 'rodinha'
        self.connect('scroll-event',self.rolou)

        # criando uma lista vazia
        # que vai conter os pontos da linha a ser desenhada
        # ou o polígono
        # cada ponto será uma tupla
        # com as coordenadas (x,y)
        self.linha=[]

</pre></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><pre class="brush: python;">
    def solta(self, tela, evento):
        self.apertou=False
        self.desenha()

    def clica(self, tela, evento):
        if evento.button==3:
            self.linha.pop()
            return
        self.linha.append((evento.x,evento.y))
        self.apertou=True

    def rolou(self,tela,evento):
        try:
            self.linha.pop()
            self.desenha()
        except:
            pass

    def arrasta(self,tela,evento):
        if self.apertou:
            self.linha.append((evento.x,evento.y))

</pre></p>
<p style="text-align:center;">Movendo o mouse com o botão pressionado<a href="http://medeubranco.files.wordpress.com/2008/06/pintor1.png"><img class="aligncenter size-medium wp-image-42" src="http://medeubranco.files.wordpress.com/2008/06/pintor1.png?w=396&#038;h=306" 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.files.wordpress.com/2008/06/pintor2.png"><img class="aligncenter size-medium wp-image-43" src="http://medeubranco.files.wordpress.com/2008/06/pintor2.png?w=392&#038;h=303" 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><pre class="brush: python;">

import gtk
from gtk import DrawingArea as DA

class tela(DA):
    def __init__(self):
        DA.__init__(self)
        self.definecores()

        self.apertou=False
        self.connect('expose-event',self.expose)
        self.add_events(gtk.gdk.BUTTON_PRESS_MASK |
            gtk.gdk.BUTTON_RELEASE_MASK |
            gtk.gdk.MOTION_NOTIFY |
            gtk.gdk.POINTER_MOTION_MASK
            )
        self.connect('button-press-event',self.clica)
        self.connect('button-release-event',self.solta)
        self.connect('motion-notify-event',self.arrasta)
        self.connect('scroll-event',self.rolou)
        self.linha=[]

    def definecores(self):
        self.verde=gtk.gdk.Color(0,48255,0,0)
        self.preto=gtk.gdk.Color(0,0,0,0)
        self.branco=gtk.gdk.Color(65535,65535,65535,0)
        self.vermelho=gtk.gdk.Color(65535,0,0,0)
        self.amarelinho=gtk.gdk.Color(35535,65333,15000,0)
        self.outra=gtk.gdk.Color(0,65535,65535,0)
        self.azul=gtk.gdk.Color(0,0,65535,0)

    def desenhaultimo(self):
        if len(self.linha)&gt;1:
            x1=int(self.linha[-2][0])
            y1=int(self.linha[-2][1])
            x2=int(self.linha[-1][0])
            y2=int(self.linha[-1][1])

            self.gc.set_rgb_fg_color(self.vermelho)
            self.window.draw_line(self.gc,x1,y1,x2,y2)

            self.gc.set_rgb_fg_color(self.preto)
            self.window.draw_rectangle(self.gc,False,x1-1,y1-1,2,2,)
            self.window.draw_rectangle(self.gc,False,x2-1,y2-1,2,2,)

    def solta(self, tela, evento):
        self.apertou=False
        self.desenha()

    def clica(self, tela, evento):
        if evento.button==3:
            self.linha.pop()
            return
        self.linha.append((evento.x,evento.y))
        self.apertou=True

    def rolou(self,tela,evento):
        try:
            self.linha.pop()
            self.desenha()
        except:
            pass

    def arrasta(self,tela,evento):
        if self.apertou:
            self.linha.append((evento.x,evento.y))
            self.desenhaultimo()

    def apaga(self):
        for pt in self.linha:
            print pt
        self.linha=[]
        self.desenha()

    def desenha(self):
        a,b,c,d = self.get_allocation()
        self.gc.set_rgb_fg_color(self.branco)
        self.window.draw_rectangle(self.gc,True,0,0,c-1,d-1)

        if len(self.linha)&gt;0:
            self.gc.set_rgb_fg_color(self.amarelinho)
            self.window.draw_polygon(self.gc,True, self.linha)
            self.gc.set_rgb_fg_color(self.preto)
            self.window.draw_polygon(self.gc,False, self.linha)

        self.gc.set_rgb_fg_color(self.preto)
        self.window.draw_rectangle(self.gc, False,2,2,c-4,d-4 )
        for pt in self.linha:
            self.window.draw_rectangle(self.gc, False,pt[0]-1, pt[1]-1,2,2)

    def expose(self,tela, evento):
        self.gc=self.get_style().fg_gc[gtk.STATE_NORMAL]
        self.gc.set_rgb_fg_color(self.branco)
        self.desenha()

</pre></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 &#8211; 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><pre class="brush: python;">

#!/usr/bin/env python
# -*- coding: utf-8 -*-
&quot;&quot;&quot;
Código parcialmente reaproveitado
do código exemplo do OgMaciel
em http://blog.ogmaciel.com/?p=413
&quot;&quot;&quot;

import desenha
try:
    import pygtk
    pygtk.require( &quot;2.0&quot; )
except:
    pass
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)

class Janelao(object):
    &quot;&quot;&quot;
    Janela criada com o Glade
    &quot;&quot;&quot;

    def __init__(self):
        self.xml = gtk.glade.XML( &quot;parapintar.glade&quot; )
        self.xml.signal_autoconnect(self)

        self.mainWindow = self.xml.get_widget( 'window1' )
        self.mainWindow.set_title( &quot;Pintor&quot; )

        # puxando a ViewPort criado no glade
        self.caixa=self.xml.get_widget( 'caixatela' )
        self.mainWindow.connect('destroy', gtk.main_quit)

        self.botao = self.xml.get_widget( 'botao1' )

        # criando uma instancia do nosso objeto
        self.tela=desenha.tela()
        #inserindo nosso objeto na viewport
        self.caixa.add(self.tela)

        self.botao.connect(&quot;clicked&quot;,self.apagar_tela)
        self.tela.show()
        self.mainWindow.show_all()

    def apagar_tela(self,botao):
        self.tela.apaga()

if __name__ == &quot;__main__&quot;:
    w = Janelao()
    gtk.main()
</pre></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/38/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/38/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=38&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/06/30/mais-drawingarea-orientacao-a-objetos-e-heranca-e-glade/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>

		<media:content url="http://medeubranco.files.wordpress.com/2008/06/desenho.png" medium="image" />

		<media:content url="http://medeubranco.files.wordpress.com/2008/06/gladebglade.png?w=300" medium="image" />

		<media:content url="http://medeubranco.files.wordpress.com/2008/06/pintor1.png?w=300" medium="image" />

		<media:content url="http://medeubranco.files.wordpress.com/2008/06/pintor2.png?w=300" medium="image" />
	</item>
		<item>
		<title>Definindo a codificação em um código python</title>
		<link>http://medeubranco.wordpress.com/2008/06/25/definindo-a-codificacao-em-um-codigo-python/</link>
		<comments>http://medeubranco.wordpress.com/2008/06/25/definindo-a-codificacao-em-um-codigo-python/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 02:01:52 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA['\x82']]></category>
		<category><![CDATA['\xa0']]></category>
		<category><![CDATA['\xa9']]></category>
		<category><![CDATA['\xcc']]></category>
		<category><![CDATA['\xcf']]></category>
		<category><![CDATA['\xdf']]></category>
		<category><![CDATA['\xe9'
~]]></category>
		<category><![CDATA['\xfa']]></category>
		<category><![CDATA[codigo fonte]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[utf-8]]></category>
		<category><![CDATA[\xc2']]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=36</guid>
		<description><![CDATA[Imagino que você chegou até este artigo porque, ao executar seu código em python, obteve o seguinte erro: SyntaxError: Non-ASCII character '\xc3' in file &#60;arquivo&#62; on line &#60;numero de linha&#62;, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details Sei que você está com um tanto de pressa para resolver seu problema; se é esse o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=36&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Imagino que você chegou até este artigo porque, ao executar seu código em python, obteve o seguinte erro:<br />
<code><br />
<span style="color:#ff0000;"> SyntaxError: Non-ASCII character '\xc3' in file &lt;arquivo&gt; on line &lt;numero de linha&gt;, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details</span></code></p>
<p>Sei que você está com um tanto de pressa para resolver seu problema;  se é esse o caso, insira no seu código, na <strong>primeira ou segunda linha</strong>, o código abaixo:</p>
<p><pre class="brush: python;">
# -*- coding: utf-8 -*-
</pre></p>
<p>Pronto, seu problema já deve estar resolvido.</p>
<p>Se tiver um pouquinho mais de tempo, vamos juntos tentar entender o que foi que aconteceu.</p>
<p>Primeiro vamos analisar a mensagem de erro. Meu inglês trôpego me permitiu chegar à seguinte tradução da mensagem de erro:</p>
<p><span style="color:#ff0000;"><code><em>Erro de sintaxe: no arquivo &lt;nome de arquivo.py&gt;, na linha &lt;numero da linha&gt;, tem um caractere não ASCII ('\xc3'), mas não foi declarada nenhuma codificação de caracteres no seu arquivo fonte. </em></code></span></p>
<p><span style="color:#ff0000;"><code><em>Dê uma olhadinha em <a href="http://www.python.org/peps/pep-0263.html">http://www.python.org/peps/pep-0263.html</a> para mais detalhes.<em></em></em></code></span></p>
<p align="justify">Bem, para nós que não somos bilíngües, qualquer tradução capenga vai bem, até mesmo a minha. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p align="justify">Entendi que você colocou um caractere inexistente na tabela ASCII, usada pelo interpretador python ao analisar o código fonte, e esqueceu-se de avisar ao interpretador para usar outra tabela.</p>
<p align="justify">O link sugerido na mensagem de erro nos leva à pagina do  <em>Python Enhancement Proposals (PEPs) 0263</em> &#8211; pep-0263 (Propostas de Melhoria para o Python, na minha tradução).</p>
<p>Olhando nesta página, obtive as seguintes informações:</p>
<ul>
<li>a pep-0263 propõe introduzir uma sintaxe para declarar a codificação usada no arquivo fonte.</li>
<li> na versão 2.1 do python, o único jeito de escrever &#8216;literais&#8217; Unicode era ranheta demais.</li>
<li>neste &#8216;pep&#8217; é proposto usar um comentário especial no topo da linha par indicar o &#8216;encoding&#8217; usado.</li>
<li> o interpretador python irá usar <a href="http://pt.wikipedia.org/wiki/ASCII">ASCII</a> como codificação se nenhuma outra for informada</li>
</ul>
<p>O documento indica pelo menos três formas de se indicar a codificação:<br />
<strong><code># coding=&lt;encoding name&gt;</code></strong></p>
<p>ou, (usando formatos reconhecidos pelos editores mais populares):<br />
<strong></strong></p>
<p><strong><code>#!/usr/bin/python<br />
# -*- coding: &lt;encoding name&gt; -*-</code></strong></p>
<p>ou</p>
<p><strong><code>#!/usr/bin/python<br />
# vim: set fileencoding=&lt;encoding name&gt; :</code></strong></p>
<p>Testei as três formas e funcionou &#8211; uso o editor gvim. Testei também substituir<strong> utf-8</strong> por <strong>iso8859-1</strong>, e o interpretador não reclamou.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/36/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/36/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=36&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/06/25/definindo-a-codificacao-em-um-codigo-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>
	</item>
		<item>
		<title>O que é Linux?</title>
		<link>http://medeubranco.wordpress.com/2008/06/23/o-que-e-linux/</link>
		<comments>http://medeubranco.wordpress.com/2008/06/23/o-que-e-linux/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 05:16:00 +0000</pubDate>
		<dc:creator>medeubranco</dc:creator>
				<category><![CDATA[O que é?]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[informática básica]]></category>
		<category><![CDATA[iniciante]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://medeubranco.wordpress.com/?p=34</guid>
		<description><![CDATA[Linux é um Sistema Operacional livre e de código fonte aberto. Foi criado por Linus Torvalds em 1991 e desde então vem recebendo colaboração de programadores em todo o mundo, muitos deles mantidos por grandes empresas como IBM, Google, Intel, etc. O Linux é hoje usado por empresas como uma robusta e confiável solução em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=34&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Linux é um Sistema Operacional livre e de código fonte aberto.</p>
<p align="justify">Foi criado por Linus Torvalds em 1991 e desde então vem recebendo colaboração de programadores em todo o mundo, muitos deles mantidos por grandes empresas como IBM, Google, Intel, etc.</p>
<p align="justify">O Linux é hoje usado por empresas como uma robusta e confiável solução em informática. Você usa Linux mesmo sem saber quando navega na Internet, pois muitas páginas estão hospedadas em máquinas que funcionam com um Linux.</p>
<p align="justify">Linux também é utilizado como sistema Desktop (computador doméstico ou de escritório) por muitos profissionais e usuários entusiastas.</p>
<p align="justify"><a href="http://medeubranco.files.wordpress.com/2008/06/screengnome.png"><img class="alignnone size-medium wp-image-35" src="http://medeubranco.files.wordpress.com/2008/06/screengnome.png?w=300&#038;h=168" alt="" width="300" height="168" /></a></p>
<p align="justify">O que o Linux não é:</p>
<p align="justify">Imitação do Windows. Não é.</p>
<p align="justify">Windows do Paraguai. Não é.</p>
<p align="justify">Sistema de segunda linha para computadores baratos. Não é.</p>
<p align="justify">
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/medeubranco.wordpress.com/34/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/medeubranco.wordpress.com/34/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/medeubranco.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/medeubranco.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/medeubranco.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/medeubranco.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/medeubranco.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/medeubranco.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/medeubranco.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/medeubranco.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=medeubranco.wordpress.com&amp;blog=3870477&amp;post=34&amp;subd=medeubranco&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://medeubranco.wordpress.com/2008/06/23/o-que-e-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">medeubranco</media:title>
		</media:content>

		<media:content url="http://medeubranco.files.wordpress.com/2008/06/screengnome.png?w=300" medium="image" />
	</item>
	</channel>
</rss>
