Mostrando postagens com marcador python. Mostrar todas as postagens
Mostrando postagens com marcador python. Mostrar todas as postagens

quinta-feira, 21 de outubro de 2010

Exemplo de Classe em PyQt

Eu coloquei um exemplo anteriormente de código em PyQt e coloquei o link dos arquivos no 4shared, mas o link caiu e agora irei colocar mais um exemplo e vou comentar, e colocarei na tela mesmo.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#importando as classes Qt abaixo
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtCore
#importando a interface criada no QtDesigner e transformada em classe
#python através do comando pyuic
from interfaces import ui_formCadastroBensImoveis
import datas_Brasileiras
from PyQt4.QtSql import *

'''
nesse sistema, os objetos checkbox alteram o estado dos dicionários com 
chaves com nomes homônimos aos checkbox, dessa forma, a alteração
das chaves do dicionário é transparente e ele fica gravado 
no banco de dados
'''
class FormCadastroBensImoveis(QMainWindow, 
ui_formCadastroBensImoveis.Ui_cadastroBensImoveis, datas_Brasileiras.Datas_cpf):
    '''
    Classe de cadastro de bens imóveis
    tudo que iniciar com txt são caixas de texto 
    da classe principal da interface gráfica do programa, 
    o que for iniciado com cmb são os objetos
    combobox e com radio os radiobox, checkbox são checkbox etc
    '''
    def __init__(self, parent=None, bancodados='', usuario='0000'):
        super(FormCadastroBensImoveis, self).__init__(parent)
        self.setupUi(self)
        self.dic = {}
        self.promptComando = QSqlQuery()
        self.usuario = usuario
        self.populaComboIgreja()
        self.validarCamposNumericos()
        self.fazerConexoes(True)
        
    def fazerConexoes(self, novo=True):
        '''
        Essa função faz as conexões dos objetos
        com os sinais e eventos, função de salvar não está aqui
        porque quando eu usar esse mesmo módulo como alteração
        eu irei usar o botão com a função alterar.
        a biblioteca partial permite criar funções 
        sob demanda desse modo eu economizo muitas linhas
        de código, as funções que são parecidas
        são criadas automaticamente
        '''
        from functools import partial
        from cadastros import sair
        self.connect(self.txtDataConstrucao, SIGNAL('editingFinished()')
        , self.validarData)
        #A função findChildren retorna uma lista com 
        #todos os objetos que responderem 
        #a um tipo ou função específica.
        lista = self.findChildren(QCheckBox)
        for objeto in lista:
            self.connect(objeto, SIGNAL('stateChanged(int)'),
            self.alt_diversos)
            self.dic[unicode(objeto.objectName(), 'utf-8')] = u"não"
        self.connect(self.txtDataConstrucao, SIGNAL("editingFinished ()"),
        self.validarData)
        if novo:
            self.connect(self.btnSalvar, SIGNAL('clicked()'),
            self.salvarDados)
        
    def validarCamposNumericos(self):
        '''Essa função valida os campos numéricos usando o objeto 
        QDoubleValidator, ele é muito bom e eficiente,
        tem muitas vantagens sobre a máscara, novamente,
        eu uso um laço for aqui para deixar a função
        mais compacta e pythoniana :)
        '''
        validarReal = QDoubleValidator(0, 99999, 0, self)
        validarReal.setDecimals(2)
        listaObj = [self.txtAreaAverbadaCasaOracao,
        self.txtAreaAverbadaTerreno,
        self.txtAreaRealCasaOracao, self.txtareaRealTerreno]
        for objeto in listaObj:
            objeto.setValidator(validarReal)
    
    def populaComboIgreja(self, tudo=False):
        '''
        Essa função popula o combo igreja
        '''
        comando = QString("SELECT cod_relatorio, nome_localidade FROM \
        bens_imoveis WHERE e_administracao LIKE 'sim'")
        if tudo:
            comando = QString("SELECT cod_localidade, nome_localidade \
            FROM bens_imoveis")
        self.cmbAdministracao.clear()
        self.promptComando.exec_(comando)
        listaAdministracao = QStringList('') 
        while self.promptComando.next() :
            listaAdministracao << self.promptComando.value(0).toString()\
             + " - " + self.promptComando.value(1).toString()
        self.cmbAdministracao.addItems(listaAdministracao)
        
    def alt_diversos(self):
        '''Essa função altera os valores das chaves do dicionário
        quando os objetos checkbox são clicados, a função sender()
        retorna o objeto que enviou o sinal, como as chaves
        do dicionário tem os nomes dos objetos então fica fácil
        usar essa função pois as chaves correspondentes
        a cada objeto são alteradas de acordo 
        com o nome do objeto que enviou o sinal.
        '''
        if self.sender().isChecked() == True:
            enviador = unicode(self.sender().objectName(),
            'utf-8')
            self.dic[enviador] = QString("sim")
        else:
            enviador = unicode(self.sender().objectName(),
            'utf-8')
            self.dic[enviador] = u"não"                                                       
    
    def salvarDados(self):
        ''' Essa é a função que salva os dados do formulário
        '''
        comando = QString("INSERT INTO bens_imoveis(cod_relatorio,\
        nome_localidade,administracao,registro_imovel,e_administracao,\
        alvara_construcao,alvara_funcionamento,CEI,CND,contrato,escritura,\
        habite_se,projeto_arquitetonico,projeto_eletrico,projeto_estrutural,\
        projeto_hidraulico,projeto_incendio,registro,data_construcao,\
        situacao,area_real_terreno,area_averbada_terreno,areaReal_casaOracao,\
        areaAverbada_casaOracao,justificativaDificuldade,usuario) \
        VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
        administracao = QString()
        if self.cmbAdministracao.currentText() != "":
            administracao = self.cmbAdministracao.currentText().split(" - ")[1]
        self.promptComando.prepare(comando)
        self.promptComando.bindValue(0, self.txtcodRelatorio.text())
        self.promptComando.bindValue(1, self.txtNomeLocalidade.text().replace(" - ", "-"))
        self.promptComando.bindValue(2, administracao)
        self.promptComando.bindValue(3, self.txtRegistroImovel.text())
        self.promptComando.bindValue(4, self.dic["checkAdministracao"])
        self.promptComando.bindValue(5, self.dic["checkAlvaraConstrucao"])
        self.promptComando.bindValue(6, self.dic["checkAlvaraFuncionamento"])
        self.promptComando.bindValue(7, self.dic["checkCEI"])
        self.promptComando.bindValue(8, self.dic["checkCND"])
        self.promptComando.bindValue(9, self.dic["checkContrato"])
        self.promptComando.bindValue(10, self.dic["checkEscritura"])
        self.promptComando.bindValue(11, self.dic["checkHabitese"])
        self.promptComando.bindValue(12, self.dic["checkProjArquitetonico"])
        self.promptComando.bindValue(13, self.dic["checkProjEletrico"])
        self.promptComando.bindValue(14, self.dic["checkProjEstrutural"])
        self.promptComando.bindValue(15, self.dic["checkProjHidraulico"])
        self.promptComando.bindValue(16, self.dic["checkProjIncendio"])
        self.promptComando.bindValue(17, self.dic["checkRegistro"])
        self.promptComando.bindValue(18, self.conversor_data(self.txtDataConstrucao.text()))
        self.promptComando.bindValue(19, self.cmbSituacao.currentText())
        self.promptComando.bindValue(20, self.txtareaRealTerreno.text().replace(",", "."))
        self.promptComando.bindValue(21, self.txtAreaAverbadaTerreno.text().replace(",", "."))
        self.promptComando.bindValue(22, self.txtAreaRealCasaOracao.text().replace(",", "."))
        self.promptComando.bindValue(23, self.txtAreaAverbadaCasaOracao.text().replace(",", "."))
        self.promptComando.bindValue(24, self.textoJustificativa.toPlainText())
        self.promptComando.bindValue(25, self.usuario)
        if self.promptComando.exec_():
            id = str(self.promptComando.lastInsertId().toInt()[0])
            QMessageBox.warning(self, unicode("O número do registro gravado foi: ",
            "utf-8"), unicode("Número de Registro: " + id, "utf-8"))
            self.limpar_dados()
        else:
            textoErro = self.promptComando.lastError().text()
            QMessageBox.warning(self, unicode("Falha ao Gravar o Registro",
            "utf-8"), unicode("O código do erro foi: " + textoErro, "utf-8"))
        
    
    def limpar_dados(self, tudo=True):
        '''
        Essa função limpa os campos do formulário, o interessante
        é que eu resolvi usar laços for associados com listas,
        achei dessa forma uma maneira mais "pythoniana" :)
        '''
        # Esse laço coloca todas as chaves do dicionário como "não"
        for chaves in self.dic.keys(): 
            self.dic[chaves] = u"não"
        lista = self.findChildren(QLineEdit)
        #Esse laço pega a lista anterior de objetos texto e coloca 
        #em todos o texto vazio
        for objeto in lista: 
            objeto.setText('')
        # Essa lista pega os objetos "checkbox" e o laço seguinte 
        #desmarca todos eles.
        lista = self.findChildren(QCheckBox)
        for objeto in lista: 
            objeto.setChecked(False)
        if tudo:
            self.cmbAdministracao.setCurrentIndex(0)
            self.cmbAdministracao.setFocus()
            self.populaComboIgreja()
        self.textoJustificativa.setPlainText("")
        self.cmbSituacao.setCurrentIndex(0)


Eu usei um programinha bacana chamado colored para criar o código html para colar aqui no blog, isso vai ajudar demais agora pois colocarei todos os códigos aqui.

terça-feira, 6 de abril de 2010

Programação em Python e Qt, exemplo prático e funcional

Estou de volta à atividade no Blog com uma informação bastante legal, Criei um programinha baseado em uma aula de VB.net (Blarg!) que eu tive e criei uma Agenda Eletrônica usando o Banco de Dados MySQL e PyQt, é fácil de instalar, você precisa instalar o Python, eo PyQt, se estiver usando Linux, basta ir no Gerenciador de pacotes que ele está disponível, não se esqueça do QtSQL, se estiver usando Windows basta ir nos links que eu deixei.
As demais explicações sobre o Programa estão no código do mesmo, basta clickar aqui para baixar:

Código Fonte: Download

Instalador Para Ambiente Windows: Download

Eu usei o Eclipse com o plugin Pydev e o Qt designer.


segunda-feira, 28 de dezembro de 2009

Porque Resolvi Usar PyQt.

Eu estudei bastante PyGTK, e baixei manuais de referência e etc, consigo fazer diversas coisas em GTK e já fiz diversos programinhas legais para uso interno, porém surgiu recentemente um projeto maior e tive problemas com o PyGTK:

- Graves instabilidades com o Glade3.
- Biblioteca nativa GTK com limitações para o meu uso.
- Suporte Muito fraco para o windows.

Resolvi então dar uma olhada nas bibliotecas Qt que devido à minha preferência por Gnome eu nunca havia dado uma olhada nelas para programar, logo de cara uma coisa me agradou que foi a nokia estar por trás do projeto, eu gostei disso porque quando uma empresa está coordenando alguma coisa as suas diretrizes são bem definidas, nada contra outro tipo de modelo ou empresa, mas o fato é que isso me tranquilozou um pouco. Os pontos positivos de usar as bibliotecas Qt e o PyQt4 foram:

- Widgets com recursos úteis nativos, por exemplo, o masked entry faz parte do pacote do Qt Designer.

- Qt designer mais estável do que o Glade3, eu ainda não tinha tido problemas com o Glade e percebi que se o trabalho for pequeno ele não nega fogo, porém quando precisei criar interfaces mais complexas me deparei com travamentos e falhas de segmentação esporádicas que atrasaram e muito o meu trabalho, coisa que ainda não aconteceu com o Qt Designer.

- Ferramenta de geração de código faz parte da suíde de desenvolvimento PyQt- pyuic4. A ferramenta que eu utilizava para gerar o código no python era um script que eu encontrei garimpando a internet chamado gladeloader.py, ele é realmente muito bom, porém foi criado por um cara que não faz parte do desenvolvimento principal e não está ligado a nenhum projeto, o que significa que novidades vindas do glade poderiam gerar incompatibilidades com o script o que me faria ter que começar a minha odisséia novamente, temos o tepache que vem nos repositórios de diversas distros porém nunca me dei bem com ele.

- Suporte Excelente em Windows, Symbian, Maemo etc... Isso creio que não preciso comentar né?

Claro que nem tudo são flores, mas visto os benefícios eu decidi mudar todo o programa que eu esava construindo para as bibliotecas Qt, os problemas que estou encontrando são:

- Documentação do PyQt basicamente apenas em inglês e eu não encontrei material atualizado para download, não que inglês seja um encalço muito grande porém ler um documento técnico em sua lingua nativa é bem melhor e com um desenvolvimento mais rápido.

- Diferenças conceituais no manejo de sinais e eventos. As bibliotecas Qt utilizam um conceito diferente de sinais e métodos, eles usam: Sinal, Emissor, Receptor e Slot's; eu estou tendo um pouco de dificuldades de entender isso apropriadamente.

- Arquivo do Qt designer não é aproveitado como no Glade/GTK. No glade, o arquivo glade é aproveitado e no código fica apenas o código de importação do glade e a lógica do programa fica no arquivo python, no Qt designer o código de criação da Gui fica no arquivo .py e , se for o caso, teria que criar uma classe depois importar para o código da lógica, terei que fazer isso.

Fica aí a dica, se alguém como eu está tendo problemas com o PyGTK o PyQt é uma solução, é claro que temos o projeto kiwi entre outros que podem resolver essa situação, mas no meu caso não era apenas as limitações das widgets que estavam me dando dor de cabeça.

segunda-feira, 27 de julho de 2009

Exemplo de codificação no Python

Estou meio ausente do blog, mas agora eu descobri uma maneira de colocar acentos no MySQL via python, eu coloquei a codificação de caracteres como UTF-8 no banco de dados e no python, mas sempre tinha problemas com a inserção de caracteres com acentos entre outros no python pois eu sempre imaginei que bastava colocar isso no início do arquivo : #-*- coding:utf-8 -*-, mas descobri que era necessário algo mais, então está aí o exemplo de conexão com um banco de dados MySQL com definição de codificação de caracteres o nome do banco de dados é python, usuário python e senha python. Exemplo de código:

bd=MySQLdb.connect(host="localhost",user="python",passwd="python",
db="python",charset="utf8", use_unicode = True)

Com isso eu terminei todos os meus problemas com acentuação no MySQL, ficou beleza. Espero que essa dica ajude mais pessoas, até!