<?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>.::Escovando Bits::. &#187; pyqt</title>
	<atom:link href="http://escovandobits.wordpress.com/tag/pyqt/feed/" rel="self" type="application/rss+xml" />
	<link>http://escovandobits.wordpress.com</link>
	<description>Programação, Linux, tecnologia da informação, dicas, artigos</description>
	<lastBuildDate>Sun, 05 Jul 2009 15:42:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='escovandobits.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ac8d2c79730f1bc1a6ebab006a3670da?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>.::Escovando Bits::. &#187; pyqt</title>
		<link>http://escovandobits.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://escovandobits.wordpress.com/osd.xml" title=".::Escovando Bits::." />
		<item>
		<title>Timer no PyQT</title>
		<link>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/</link>
		<comments>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 16:48:42 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=305</guid>
		<description><![CDATA[Quem programa em Python provavelmente já precisou fazer alguma coisa com threads. Contudo quando estamos trabalhando com PyQT há alguns incovenientes em utilizar as threads da API do Python, principalmente quando temos interfaces gráficas. Recentemente tive problemas para fazer uma função que executasse determinada ação após um tempo pré-definido em segundos. Pois quando enquanto a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=305&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Quem programa em Python provavelmente já precisou fazer alguma coisa com <a title="Python Threading" href="http://docs.python.org/library/threading.html" target="_blank">threads</a>. Contudo quando estamos trabalhando com PyQT há alguns incovenientes em utilizar as threads da API do Python, principalmente quando temos interfaces gráficas. Recentemente tive problemas para fazer uma função que executasse determinada ação após um tempo pré-definido em segundos. Pois quando enquanto a thread não terminasse sua execução a janela gráfica não aparecia.  Encontrei duas maneiras para solucionar,  a primeira utilizando <a href="http://doc.trolltech.com/4.4/qthread.html" target="_blank">QThread</a> e uma muito mais simples usando <a href="http://doc.trolltech.com/4.4/qtimer.html" target="_blank">QTimer</a>,  fica o registro das duas maneiras:</p>
<p style="text-align:justify;"><span id="more-305"></span></p>
<pre><span style="color:#ff80e0;">from</span><span style="color:#141312;"> PyQt4 </span><span style="color:#ff80e0;">import</span><span style="color:#141312;"> *</span>
<span style="color:#ff80e0;">from</span><span style="color:#141312;"> PyQt4.QtCore </span><span style="color:#ff80e0;">import</span><span style="color:#141312;"> *</span>

<span style="color:#141312;"><strong>class</strong> MyTimer(QThread):</span>
<span style="color:#141312;">	<strong>def</strong> </span><span style="color:#000e52;"><strong>__init__</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,parent = </span><span style="color:#006e28;">None</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		QThread.</span><span style="color:#000e52;"><strong>__init__</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,parent)</span>

<span style="color:#141312;">	<strong>def</strong> run(</span><span style="color:#006e28;">self</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		<strong>while</strong> </span><span style="color:#b08000;">1</span><span style="color:#141312;">:</span>
<span style="color:#141312;">		</span><span style="color:#888786;"><em># a cada 'self.tempo' segundos o sinal é emitido e
                  nós tratamos na outra classe. Exemplo</em></span>:
<span style="color:#141312;">			</span><span style="color:#006e28;">self</span><span style="color:#141312;">.<strong>emit</strong>(</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"sinal_atualiza()"</span><span style="color:#141312;">))</span>
<span style="color:#141312;">			</span><span style="color:#006e28;">self</span><span style="color:#141312;">.sleep(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.tempo)</span>

<span style="color:#141312;">	<strong>def</strong> Timer(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,t=</span><span style="color:#b08000;">5</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		</span><span style="color:#006e28;">self</span><span style="color:#141312;">.tempo = t</span>
<span style="color:#141312;">		</span><span style="color:#006e28;">self</span><span style="color:#141312;">.start()

</span></pre>
<p style="text-align:justify;"><span style="color:#141312;">Depois, na sua classe basta que gerencia a interface gráfica, basta instanciar o objeto e tratar os sinais definidos em MyTimer(), você pode definir quantos sinais forem necessários:</span></p>
<pre><span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer = MyTimer()</span>
<span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer.Timer(3)</span> <span style="color:#888786;"><em><em># 3 segundos

</em></em></span><span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                       QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"sinal_stualiza()"</span><span style="color:#141312;">),
                       </span><span style="color:#006e28;">self</span><span style="color:#141312;">.atualiza)</span>
<span style="color:#141312;">	  </span><span style="color:#888786;"><em># caso seja necessario executar algo após o termino da
          # therad (não é o caso </em></span><span style="color:#888786;"><em>do exemplo acima que o while
          # "trava" na função run()</em></span>
<span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                       QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"finished()"</span><span style="color:#141312;">),
                       </span><span style="color:#006e28;">self</span><span style="color:#141312;">.finaliza)</span></pre>
<p>Contudo existe uma maneira <strong>muito</strong> mais fácil de fazer um timer utilizando PyQT, usando a <a href="http://doc.trolltech.com/4.4/qtimer.html" target="_blank">QTimer</a></p>
<pre><span style="color:#141312;">	</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer = QtCore.QTimer()

</span><span style="color:#141312;">	</span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                     QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"timeout()"</span><span style="color:#141312;">),
                     </span><span style="color:#006e28;">self</span><span style="color:#141312;">.atualiza)</span>

       <span style="color:#141312;"> </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer.start(</span><span style="color:#b08000;">3000</span><span style="color:#141312;">)</span> <span style="color:#888786;"><em># tempo em milisegundos</em></span></pre>
Posted in programação, pyqt Tagged: pyqt, python, qt, threads <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/305/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=305&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Dicas de PyQt4</title>
		<link>http://escovandobits.wordpress.com/2008/02/08/dicas-de-pyqt4/</link>
		<comments>http://escovandobits.wordpress.com/2008/02/08/dicas-de-pyqt4/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 04:36:08 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=37</guid>
		<description><![CDATA[Esse post irá apresentar alguns processos de desenvolvimento utilizando PyQt através da construção de um aplicativo simples e sua evolução.  Algumas dicas como utilizar o designer para fazer as telas e layouts e integrá-lo no seu código-fonte, o casamento com expressões regulares, sinais,  widgets gráficos (lineEdits, labels, comboBox, etc), arquivos, processos, strings&#8230;
 

Todo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=37&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Esse <i>post </i>irá apresentar alguns processos de desenvolvimento utilizando PyQt através da construção de um aplicativo simples e sua evolução.  Algumas dicas como utilizar o <i>designer</i> para fazer as telas e layouts e integrá-lo no seu código-fonte, o casamento com expressões regulares, sinais,  widgets gráficos (<i>lineEdits</i>, <i>labels</i>, <i>comboBox</i>, etc), arquivos, processos, strings&#8230;</p>
<p align="center"><img src="http://www.python.org/images/python-logo.gif" height="71" width="211" /> <a href="http://escovandobits.files.wordpress.com/2008/02/qt.gif" title="qt.gif"><img src="http://escovandobits.files.wordpress.com/2008/02/qt.gif" alt="qt.gif" /></a></p>
<p><span id="more-37"></span></p>
<p align="justify">Todo programa começa com uma idéia, certo? A idéia que eu tive para esse exemplo foi a utilização das variáveis globais no Linux e em especial a distribuição Gentoo, que utilizo no meu <i>desktop</i>. Procurando na <a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&amp;chap=5" target="_blank">documentação</a> encontrei a informação necessária, da qual eu traduzi a definição:</p>
<p><b>O que é uma variável de ambiente? </b></p>
<p align="justify"><i>Um variável de ambiente contém informações usadas por uma ou mais aplicações. Muitos usuários (e especialmente aqueles novos no Linux) tem dificuldade em na sua configuração e utilização. Contudo, aprender a usar os conceitos básicos das variáveis de ambiente pode facilitar a vida em muitos casos, principalmente na mudança de configurações de programas.</i></p>
<p><i><b>Primeira idéia:</b></i></p>
<p><i><b>Fazer um programa para ver  as variáveis de ambiente citadas</b> </i></p>
<p align="justify">O tutorial cita as seguintes variáveis globais: <b>PATH</b>, <b>ROOTPATH</b>, <b>LDPATH</b>, <b>MANPATH</b>, <b>INFODIR</b>, <b>PAGER</b>, <b>KDEDIRS</b>, <b>CONFIG_PROTECT</b>, <b>CONFIG_PROTECT_MASK, </b><b>EDITOR</b>.  A idéia foi fazer um programa gráfico para facilitar ao usuário iniciante entender o que significa as variáveis no seu sistema. Então o programa, inicialmente deverá:</p>
<blockquote><p>1. Mostrar as variáveis globais mais utilizadas</p></blockquote>
<p align="center"><img src="http://farm3.static.flickr.com/2117/2248295698_9ecf939efd_o_d.png" height="389" width="482" /></p>
<blockquote><p>2. Apresentar o significado de cada variável quando o usuário passasse o cursor do mouse em cima da palavra.</p></blockquote>
<div style="text-align:center;"><img src="http://farm3.static.flickr.com/2337/2249186363_768a77fabf_o_d.png" height="47" width="500" /></div>
<p align="justify">&nbsp;</p>
<p align="justify">Para facilitar a vida, todos as telas serão feitas no <i>Qt Designer</i>, pois é mais fácil criá-las e arrumar o <i>layout</i>. A receita é bem simples, vamos imaginar que seu arquivo (<i>widget</i>, <i>dialog</i>, etc) no <i>designer</i> chame <b>form.ui</b>. Utilizaremos o utilitário <b>pyuic4</b> para convertê-lo em código Python.</p>
<blockquote><p>#&gt; pyuic4 form.ui -o ui_form.py</p></blockquote>
<p>O começo do arquivo ficará semelhante a este:</p>
<pre class="brush: python;">

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'form.ui'
#
# Created: Sun Feb 8 15:35:23 2008
#      by: PyQt4 UI code generator 4.3.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_Tela(object):
def setupUi(self, Tela):
Tela.setObjectName(&quot;Tela&quot;)
</pre>
<p align="justify">Depois, no código-fonte, iremos importar (ou herdar) a classe <b>Ui_Tela </b>onde Tela é um nome qualquer que eu escolhi. Nos outros exemplos chamarei o <i>widget</i> de form, logo a classe será Ui_Form.</p>
<pre class="brush: python;">

import sys, re, os, string
from PyQt4 import QtCore, QtGui
from ui_form import Ui_Tela

class QEnvApp(QtGui.QDialog,Ui_Tela):
def __init__(self):
QtGui.QDialog.__init__(self)
self.setupUi(self)

# O CÓDIGO-FONTE AQUI

if __name__ == '__main__':

app = QtGui.QApplication(sys.argv)
dialog = QEnvApp()
dialog.show()
sys.exit(app.exec_())
</pre>
<p align="justify">Podemos pensar a primeira maneira de fazer isso com comandos já conhecidos do bash como: echo $NOME_DA_VARIÁVEL</p>
<pre class="brush: python;">

def getEnv(self):

self.pathEdit.setText((os.popen(&quot;echo $PATH&quot;)).readline())
self.rootpathEdit.setText((os.popen(&quot;echo $ROOTPATH&quot;)).readline())
self.ldpathEdit.setText((os.popen(&quot;echo $LD_PATH&quot;)).readline())
</pre>
<p>Ou então, fazer de uma maneira mais portável:</p>
<pre class="brush: python;">

def getEnv(self):

self.pathEdit.setText(os.environ['PATH'])
self.rootpathEdit.setText(os.environ['ROOTPATH'])
self.ldpathEdit.setText(os.environ['LD_PATH'])
</pre>
<p><b>Segunda Idéia</b></p>
<p><b>Mostrar TODAS as variáveis do sistema</b></p>
<p align="justify">Da primeira idéia surgiram dois incovenientes, primeiro que o texto contido nas variáveis excedia o tamanho da área reservada, e segundo que não mostrava TODAS as variáveis de ambiente setadas. Como são muitas variáveis, achei melhor organizá-las em uma <a href="http://doc.trolltech.com/4.3.0/qcombobox.html">comboBox</a> e utilizar uma <a href="http://doc.trolltech.com/4.3.0/qtextedit.html">caixa de texto</a>.</p>
<p align="center"><img src="http://farm3.static.flickr.com/2015/2249500914_eb6485a1f9_o_d.png" height="117" width="482" /></p>
<p align="justify">Dois detalhes são interessantes, a primeira é referente a maneira de filtrar o nome das variáveis, abaixo a função que pega a saída do comando <i><a href="http://www.ss64.com/bash/export.html">export</a></i><i> </i>e através do filtro de uma expressão regular obtém os nomes das variáveis:</p>
<pre class="brush: python;">

def getEnvNames(self):
p = os.popen(&quot;export&quot;)
while 1:
line = QtCore.QString(p.readline())
if not line: break
sline = line.split(QtCore.QRegExp(&quot;[^A-Z_]+&quot;))
self.comboBox.insertItem(0,sline[1])
</pre>
<p align="justify">Também podemos escrever o código acima de uma maneira mais elegante, tornado-o mais portável, suponha que você rode seu <i>script </i>no Windows:</p>
<pre class="brush: python;">

def getEnvNames(self):
for param in os.environ.keys():
self.comboBox.insertItem(0,param)
</pre>
<p align="justify">O outro detalhe,  para evitar erros como &#8220;<i>TypeError: popen() argument 1 must be string, not QString&#8221; </i>é necessário fazer uma conversão do tipo <a href="http://doc.trolltech.com/4.3.0/qstring.html" target="_blank">QString</a> para o tipo <a href="http://docs.python.org/lib/string-methods.html" target="_blank">string</a>. Escolhi converter utilizando o <i>codec</i> <i>unicode_escape </i>pois transforma a string em um formato compatível com o código-fonte, entretanto há uma <a href="http://docs.python.org/lib/standard-encodings.html" target="_blank">lista</a> de <i>codecs</i> disponíveis.</p>
<pre class="brush: python;">

def showEnv(self, _index):

var =  unicode(self.comboBox.currentText(), 'unicode_escape')
p = os.popen( &quot;echo $&quot; + var )
self.textEdit.setText(p.readline())
</pre>
<p><b>Terceira Idéia</b></p>
<p><b>Um pouco de interação&#8230;</b></p>
<p align="justify">Até o momento o programa não dá possibilidade ao usuário de alterar e gravar o conteúdo de alguma variável, iremos fazer isso:</p>
<p align="center"><img src="http://farm3.static.flickr.com/2077/2249711644_c207269ee4_o.png" height="296" width="376" /></p>
<p align="left">Lembrando de estabelecer as conexões dos <i>widgets</i>:</p>
<p align="left">
<pre class="brush: python;">
def makeconnections(self):
self.connect(self.comboBox, QtCore.SIGNAL('activated(int)'), self.showEnv)
self.connect(self.salvarButton, QtCore.SIGNAL('clicked()'), self.salvar )
self.connect(self.salvarpermanenteButton, QtCore.SIGNAL('clicked()'), self.salvarPermanentemente )
</pre>
<p>O botão <b>Salvar </b>grava<b> </b>o  conteúdo na variável no ambiente de execução  do programa, portanto se você fechar o programa e ver o estado da variável verá que nada foi alterado.  Para ver o resultado, descomente, na função <i>salvar</i> do script as seguintes linhas:</p>
<pre class="brush: python;">

#for param in os.environ.keys():
#print &quot;%20s %s&quot; % (param,os.environ[param])
</pre>
<p align="justify">Já o botão <b>Salvar Permanentemente</b> grava o conteúdo no arquivo <b>~/.</b><b>bashrc</b>, para que todas as novas instâncias mantenham o conteúdo alterado. Será salvo no final do arquivo.</p>
<pre class="brush: python;">

def salvarPermanentemente(self):

path = os.environ['HOME'] + &quot;/.bashrc&quot;

var = unicode(self.comboBox.currentText(), 'unicode_escape')

value = unicode(self.textEdit.toPlainText(), 'unicode_escape')

f=file(path, 'a')
f.write(&quot;export &quot; + var + &quot;=&quot; + value )
f.close()
</pre>
<p align="center">Os três exemplos estão no arquivo abaixo</p>
<p align="center"><b>*** <a href="http://br.geocities.com/maluta_tiago/blog/escovandobits/qenv/qenv.tar.gz" target="_blank">Download (tar.gz)</a> ***</b></p>
<p><b>Conclusão</b></p>
<p align="justify">Acredito que um principais objetivos das linguagens interpretadas é proporcionar a construção de aplicativos de forma mais rápida  se comparado com outras linguagens como Java ou C++. Pode-se desenvolver desde pequenos utilitários até automatizar grandes processos: como <i>backup</i>, configuração, comunicação, interfaces, <i>front-ends</i>; tudo aliado a vantagem da independência em relação ao Sistema Operacional  (exceto em casos específicos, como editar o arquivo .bashrc). Alguns exemplos de projetos,  como o <a href="http://handhelds.org/~pfalcon/gsoc/" target="_blank">PyQemu </a> &#8211; uma interface em Python para o Qemu &#8211; refletem as possibilidades da linguagem e sua utilização nos mais diversos segmentos.</p>
<p>Referências:</p>
<p><a href="http://docs.python.org/lib/lib.html" target="_blank">http://docs.python.org/lib/lib.html </a></p>
<p><a href="http://wiki.python.org/moin/PyQt4" target="_blank">http://wiki.python.org/moin/PyQt4</a></p>
<p><a href="http://www.diotavelli.net/PyQtWiki" target="_blank">http://www.diotavelli.net/PyQtWiki </a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/37/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/37/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=37&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/02/08/dicas-de-pyqt4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>

		<media:content url="http://www.python.org/images/python-logo.gif" medium="image" />

		<media:content url="http://escovandobits.files.wordpress.com/2008/02/qt.gif" medium="image">
			<media:title type="html">qt.gif</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2117/2248295698_9ecf939efd_o_d.png" medium="image" />

		<media:content url="http://farm3.static.flickr.com/2337/2249186363_768a77fabf_o_d.png" medium="image" />

		<media:content url="http://farm3.static.flickr.com/2015/2249500914_eb6485a1f9_o_d.png" medium="image" />

		<media:content url="http://farm3.static.flickr.com/2077/2249711644_c207269ee4_o.png" medium="image" />
	</item>
		<item>
		<title>QConv &#8211; conversão de codeset</title>
		<link>http://escovandobits.wordpress.com/2008/01/03/qconv-conversao-de-codeset/</link>
		<comments>http://escovandobits.wordpress.com/2008/01/03/qconv-conversao-de-codeset/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 22:44:53 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[utilitário]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/2008/01/03/qconvpy-conversao-de-codeset/</guid>
		<description><![CDATA[Quantas vezes você já teve dificuldades em ler algum texto ou mensagem digital, seja em computadores ou celulares, pois encontrou o texto todo bagunçado?
Batatinha quando nasce espalha ramas pelo chÃ£o,
mamÃ£ezinha quando dorme bota a mÃ£o no coraÃ§Ã£o.

Este post apresenta um pequeno script (aprox. 60 linhas) como um front-end de um utilitário do GNU/Linux (iconv) para corrigir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=21&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Quantas vezes você já teve dificuldades em ler algum texto ou mensagem digital, seja em computadores ou celulares, pois encontrou o texto todo bagunçado?</p>
<p align="center">Batatinha quando nasce espalha ramas pelo <font color="#ff0000">chÃ£o</font>,<br />
<font color="#ff0000">mamÃ£ezinha</font> quando dorme bota a <font color="#ff0000">mÃ£o </font>no <font color="#ff0000">coraÃ§Ã£o</font>.</p>
<pre></pre>
<p align="justify">Este <i>post </i>apresenta um pequeno <i>script </i>(aprox. 60 linhas) como um <i>front-end </i>de<i> </i>um utilitário<i> </i>do <i>GNU/Linux </i>(iconv)<i> </i>para corrigir esse problema.</p>
<p><span id="more-21"></span></p>
<h2 align="left">Um pouco de cultura&#8230;</h2>
<p align="justify">Por razões históricas, os textos nos computadores são gravados utilizando uma codificação dependente<b> </b>da língua em que foram escritos. Com a popularização da <i>internet</i> ocorreu um aumento no acesso e troca de textos entre nações, o simples ato de entrar em um <i>site</i> representava a necessidade de conversão entre idiomas. Dessa maneira, conversões tornaram-se essenciais. Devido a quantidade de codificações existentes começou a existir uma incompatibilidade nessa troca de textos. A solução foi unir esses caracteres em uma codificação que tornou-se um padrão chamado <a target="_blank" href="http://en.wikipedia.org/wiki/Unicode" title="Referência p/ Wikipedia (english)"><i>Unicode</i></a>.</p>
<div align="justify"></div>
<p align="justify">Contudo, muitos computadores ainda trabalham com codificações locais, com capacidade limitada para suportar caracteres de outros idomas. Softwares como <i>browsers</i> e <i>mailsers</i> devem se capazes de converter entre os padrões. Para facilitar a vida, o projeto GNU desenvolveu a biblioteca libiconv para fazer a conversão entre as diferetentes codificações (<i>codesets</i>).</p>
<h2 align="left">QConv &#8211; Introdução</h2>
<p align="justify">Basta colocar o nome do arquivo que se deseja converter, escolher a codifiação de entrada e o formato de saída. Lembrando que é apenas um <i>script</i> para facilitar a utilização do programa <b>iconv. </b>Portando, os formatos suportados são os suportados pelo iconv. Você irá perceber que existem vários <i>codesets</i>, mas muitos são apelidos. Os mais comuns são o ISO8859-1 e o UTF-8.</p>
<p align="center"><img width="500" src="http://farm3.static.flickr.com/2228/2144094545_367f2bfd34.jpg" alt="Tela do QConv" height="143" /></p>
<p align="justify">Eu utilizo quando faço <i>downloads</i> de arquivos no formato txt, doc, odt e html e não consigo lê-los de forma clara.</p>
<div align="justify"></div>
<p align="center">Para fazer o download do programa clique<b> <a href="http://br.geocities.com/maluta_tiago/blog/escovandobits/qconv/qconv-0.1.tar.gz" title="Versão 0.1">aqui</a></b>.</p>
<h2 align="left">QConv &#8211; Utilização</h2>
<p align="left">Descompacte o arquivo em uma pasta qualquer</p>
<div align="justify"></div>
<blockquote>
<h5 align="left"># cd ~ </h5>
</blockquote>
<blockquote>
<h5 align="left"># tar zxvf qconv-0.1.tar.gz</h5>
<p align="left">&nbsp;</p>
</blockquote>
<div align="justify"></div>
<p align="justify">Serão descompactados 3 arquivos:</p>
<div align="justify"></div>
<blockquote>
<p align="justify">qconv/<b>qconv.py </b>- arquivo principal<br />
qconv/ui_viewform.py &#8211; referência aos <i>widgets</i> do <i>script</i><br />
qconv/viewForm.ui &#8211; arquivo criado no <i>Qt Designer</i></p></blockquote>
<div align="justify"></div>
<p align="justify">Para utilizar o programa digite no diretório em que descompactou os arquivos:</p>
<div align="justify"></div>
<blockquote>
<h5 align="justify"># cd qconv/</h5>
</blockquote>
<blockquote>
<h5 align="justify"># python qconv.py</h5>
<p align="justify">&nbsp;</p>
</blockquote>
<div align="justify">Lembrando que é preciso ter o PyQt4 instalado. Caso não tenha faça o <a target="_blank" href="http://www.riverbankcomputing.co.uk/pyqt/download.php" title="Download PyQt4 for Windows e Linux">download</a>.</div>
<p align="justify">&nbsp;</p>
<h2>QConv &#8211; Conclusão</h2>
<p align="justify">Fiz esse programa para conhecer melhor a linguagem <a target="_blank" href="http://www.python.org/">Python</a> e o suporte ao <a target="_blank" href="http://trolltech.com/products/qt">Qt</a> desenvolvida pela RiverBank. Maiores informações <a target="_blank" href="http://www.riverbankcomputing.co.uk/pyqt/index.php" title="About PyQt">aqui</a>.</p>
<div align="justify"></div>
<p align="justify">Algumas coisas podiam ser melhoradas, uma delas é a detecção automática do <i>codeset</i>, mas isso fica para outro <i>post</i>&#8230;</p>
<div align="justify"></div>
<p align="justify">Como precisei aprender várias particularidades da linguagem Python eu pretendo, futuramente, mostrar alguma coisa, enquanto isso aproveite parar dar uma lida no código-fone. Não exite em comentar <i>bugs</i>, melhorias a serem feitas no código-fonte, críticas, etc;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=21&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/01/03/qconv-conversao-de-codeset/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2228/2144094545_367f2bfd34.jpg" medium="image">
			<media:title type="html">Tela do QConv</media:title>
		</media:content>
	</item>
	</channel>
</rss>