├── .gitignore ├── README.md ├── pyQt4 ├── Clientes.db ├── Db.py ├── FrmCadCliente.py ├── FrmCadDefault.py ├── FrmGif.py ├── FrmMenu.py ├── FrmPesquisaCliente.py ├── Makefile ├── base.py ├── inserirdados.sql ├── style.stylesheet ├── testes │ ├── pyQt01.py │ ├── pyQt02_HLayout.py │ ├── pyQt03_form_layout.py │ ├── pyQt04_layout.py │ ├── pyQt05_layout.py │ └── pyQt06_signal.py └── walking-man2.gif ├── pySide ├── Makefile ├── pyside01.py └── pyside02.py └── pythonBasico ├── README.md ├── calculadora ├── calculadora.py ├── calculadora2.py ├── usando_calculadora.py └── usando_calculadora2.py ├── tv └── tv.py └── user ├── user.py └── user_comentado.py /.gitignore: -------------------------------------------------------------------------------- 1 | .Python 2 | *.pyc 3 | *~ 4 | *.db 5 | 6 | bin/ 7 | include/ 8 | lib/ 9 | local/ 10 | __pycache__ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python Desktop App 2 | 3 | Python Desktop App é um projeto cujo objetivo é testar e experimentar as funcionalidades do [PyQt][0] e do [PySide][1], ambas bibliotecas para desenvolvimento de aplicações Desktop em Python. 4 | 5 | No caso, estou usando Linux, portanto instalei o [Qt libraries 4.8.6 for Linux/X11][2] e [PySide Binaries for Linux][3], nesta ordem. 6 | 7 | Estou seguindo os videos [Python+PySide (Español)][4] by [Alex Dzul][5], e [Introdução ao desenvolvimento de interfaces gráficas com PyQt][6] by [Jotagê Sales - python][7]. 8 | 9 | Uma aplicação interessante que está funcionando no momento (03/05/14) é o FrmCadCliente.py e FrmMenu.py. 10 | 11 | A pasta **pythonBasico** possui conteúdos Python com uma introdução básica sobre determinados assuntos, como uso de classes e métodos. 12 | 13 | ## pyQt4 14 | 15 | Entre na pasta pyQt4 e digite 16 | 17 | $ python FrmMenu.py # ou 18 | $ make pyqt 19 | 20 | 21 | ## PySide 22 | 23 | Talvez seja necessário instalar 24 | 25 | $ sudo apt-get install python-pyside 26 | 27 | Entre na pasta PySide e digite 28 | 29 | $ python pyside02.py # ou 30 | $ make pyside2 31 | 32 | [0]: http://www.python.org.br/wiki/PyQt 33 | [1]: http://qt-project.org/wiki/PySide 34 | [2]: http://qt-project.org/downloads#qt-lib 35 | [3]: http://qt-project.org/wiki/PySide_Binaries_Linux 36 | [4]: https://www.youtube.com/playlist?list=PLcfocqQ6w1T6-QCu9e6ip7CB0j9CM0BKk 37 | [5]: https://www.youtube.com/user/alexexc2 38 | [6]: https://www.youtube.com/watch?v=ufEi54WGyC0 39 | [7]: https://www.youtube.com/channel/UCvnv9lLT51aYpi0eBp022Sg -------------------------------------------------------------------------------- /pyQt4/Clientes.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/python-classes-metodos/8bf583ce6ef7b409627ee0db9b91521e0b15fbe3/pyQt4/Clientes.db -------------------------------------------------------------------------------- /pyQt4/Db.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | import sqlite3 4 | 5 | class Db(object): 6 | '''A classe Db representa o banco de dados, ela fornece os seguintes objetos 7 | conn = connection 8 | cursor = cursor para execução de instruções sql 9 | ''' 10 | def __init__(self): 11 | self.conn = sqlite3.connect('Clientes.db') 12 | self.cursor = self.conn.cursor() 13 | 14 | 15 | class ClientesDb(object): 16 | '''A classe ClientesDb representa um cliente no banco de dados, tendo os seguintes métodos: 17 | 18 | PUBLICOS: 19 | - Salvar() 20 | - Excluir() 21 | - ConsultaTodosClientes() 22 | 23 | PRIVADOS: 24 | - __IncluirNovo() 25 | - __Alterar() 26 | 27 | ''' 28 | def __init__(self): 29 | #instanciando um objeto que representa o banco, este objeto tem uma connection e um cursor 30 | self.banco = Db() 31 | 32 | def Salvar(self, pId, pNome, pCPF, pEmail, pFone, pUF): 33 | '''método recebe os parametros de cliente e toma decisão se vai criar um novo ou alterar um existente''' 34 | 35 | # recebendo os parametros 36 | self.Id = pId 37 | self.Nome = pNome 38 | self.CPF = pCPF 39 | self.Email = pEmail 40 | self.Fone = pFone 41 | self.UF = pUF 42 | 43 | # verificando se vai incluir um novo ou alterar um existente 44 | if self.Id == '': 45 | self.__IncluirNovo() 46 | else: 47 | self.__Alterar() 48 | 49 | def __IncluirNovo(self): 50 | '''Inclui novo cliente no banco''' 51 | 52 | #montando o sql de insert na tabela de clientes 53 | sql = 'INSERT INTO CLIENTES(Nome, CPF, Email, Fone, UF)\ 54 | values("%s", "%s", "%s","%s","%s")' %(self.Nome, 55 | self.CPF, 56 | self.Email, 57 | self.Fone, 58 | self.UF 59 | ) 60 | self.banco.cursor.execute(sql) 61 | self.banco.conn.commit() 62 | 63 | def __Alterar(self, pId): 64 | '''Alterar um cliente existente no banco''' 65 | pass 66 | 67 | def Excluir(self, pId): 68 | '''Recebe um id e exclui o registro do banco caso ele exista''' 69 | 70 | try: 71 | cliente = self.ConsultaCliente(pId) 72 | 73 | # verificando se existe cliente com o ID passado, caso nao exista gera exceção 74 | if cliente: 75 | sql = 'DELETE FROM CLIENTES WHERE id = "%i"' %(pId) 76 | self.banco.cursor.execute(sql) 77 | self.banco.conn.commit() 78 | else: 79 | raise Exception('Não exite cliente com o código informado') 80 | 81 | except Exception, e: 82 | raise Exception('Não foi possíel excluir o registro: \n Messagem original: ' + str(e)) 83 | 84 | 85 | 86 | def ConsultaCliente(self, pId): 87 | '''Método consulta os dados do cliente passado o id como parâmetro''' 88 | sql = 'SELECT * FROM CLIENTES WHERE id = "%i"' %(pId) 89 | resultado = self.banco.cursor.execute(sql) 90 | return resultado.fetchone() 91 | 92 | def ConsultaTodosClientes(self): 93 | sql = 'SELECT * FROM CLIENTES' 94 | resultado = self.banco.cursor.execute(sql) 95 | return resultado.fetchall() 96 | 97 | def ConsultaClientesPorNome(self, pNome = ''): 98 | print 'parametro:' + pNome 99 | sql = 'SELECT id, Nome, CPF, Email, Fone, UF FROM CLIENTES WHERE Nome like("%' + pNome + '%")' 100 | resultado = self.banco.cursor.execute(sql) 101 | return resultado.fetchall() 102 | 103 | 104 | if __name__ == '__main__': 105 | cliente = ClientesDb() 106 | 107 | # tbl_clientes = 'CREATE TABLE CLIENTES(id integer not null primary key,\ 108 | # Nome Varchar(100) not null,\ 109 | # CPF Varchar(11) not null,\ 110 | # Email Varchar(100) not null,\ 111 | # Fone Varchar(20) not null,\ 112 | # UF Varchar(2) not null )' -------------------------------------------------------------------------------- /pyQt4/FrmCadCliente.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from FrmCadDefault import FrmCadDefault 3 | from FrmPesquisaCliente import FrmPesquisaCliente 4 | from PyQt4.QtGui import QApplication 5 | from base import * 6 | from Db import Db, ClientesDb 7 | 8 | class FrmCadCliente(FrmCadDefault): 9 | 10 | def __init__(self,parent=None): 11 | super(FrmCadCliente,self).__init__(parent) 12 | 13 | self.frmCadClienteCreate() 14 | 15 | # Criando um objeto cliente DB para que fique a disposição para interagir com o 16 | # módulo de acesso a dados 17 | self.clientedb = ClientesDb() 18 | 19 | # abre o formulario FrmPesquisaCliente 20 | self.btnPesquisar.clicked.connect(self.AbrePesquisa) 21 | self.btnSalvar.clicked.connect(self.Salvar) 22 | self.btnExcluir.clicked.connect(self.__Excluir) 23 | 24 | # imprimir 25 | self.btnImprimir.clicked.connect(self.Imprimir) 26 | 27 | def frmCadClienteCreate(self): 28 | self.setWindowTitle('Cadastro de clientes') 29 | 30 | #criando os campos de cadastro 31 | self.txtNome=TextBox(self) 32 | self.txtCPF=TextBox(self) 33 | self.txtCPF.setFixedWidth(170) 34 | self.txtCPF.setMaxLength(11) 35 | self.txtEmail=TextBox(self) 36 | self.txtFone=TextBox(self) 37 | self.txtUF=TextBox(self) 38 | self.txtUF.setFixedWidth(40) 39 | self.txtUF.setMaxLength(2) 40 | 41 | #adicionando os campos no form layout da base de cadastro 42 | self.fLayout.addRow('Nome',self.txtNome) 43 | self.fLayout.addRow('CPF',self.txtCPF) 44 | self.fLayout.addRow('e-mail',self.txtEmail) 45 | self.fLayout.addRow('Fone',self.txtFone) 46 | self.fLayout.addRow('UF',self.txtUF) 47 | 48 | def AbrePesquisa(self): 49 | frmPesquisa=FrmPesquisaCliente(self) 50 | frmPesquisa.setModal(True) #tela em primeiro plano 51 | frmPesquisa.show() 52 | frmPesquisa.exec_() 53 | 54 | def Imprimir(self): 55 | print self.txtNome.text() 56 | print self.txtCPF.text() 57 | 58 | def Salvar(self): 59 | try: 60 | #capturando os dados da tela 61 | Codigo = self.txtCodigo.text() 62 | Nome = self.txtNome.text() 63 | CPF = self.txtCPF.text() 64 | Email = self.txtEmail.text() 65 | Fone = self.txtFone.text() 66 | UF = str(self.txtUF.text()).upper() 67 | 68 | if Codigo == '': 69 | self.__inserir(Codigo, Nome, CPF, Email, Fone, UF) 70 | msg = MessageBox() 71 | msg.information(self, 'Cadastro de clientes', 'Cliente salvo com sucesso!', MessageBox.Ok) 72 | else: 73 | pass 74 | except Exception, e: 75 | msg = MessageBox() 76 | msg.critical(self, 'Cadastro de clientes', 'Ocorreu o seguinte erro ao tentar inserir o cliente: \n ' + str(e), MessageBox.Ok) 77 | 78 | def __inserir(self, id, nome, cpf, email, fone, uf): 79 | '''Método cria um objeto cliente do modulo de acesso a dados, e inclui um novo cliente no banco''' 80 | self.clientedb.Salvar(id, nome, cpf, email, fone, uf) 81 | 82 | def __Excluir(self, pId): 83 | try: 84 | codigo = int(self.txtCodigo.text()) 85 | self.clientedb.Excluir(codigo) 86 | except Exception, e: 87 | msg = MessageBox() 88 | msg.critical(self, 'Cadastro de clientes', 'Ocorreu o seguinte erro ao tentar excluir: \n ' + str(e).decode('utf8'), MessageBox.Ok) 89 | 90 | if __name__ == '__main__': 91 | import sys 92 | root = QApplication(sys.argv) 93 | app = FrmCadCliente(None) 94 | app.show() 95 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/FrmCadDefault.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from base import * 3 | 4 | class FrmCadDefault(Widget): 5 | 6 | def __init__(self,parent=None): 7 | super(FrmCadDefault,self).__init__(parent) 8 | 9 | self.frmCadDefaultCreate() 10 | 11 | def frmCadDefaultCreate(self): 12 | self.setWindowTitle(u'Cadastro padrão') 13 | self.centerOnScreen() 14 | self.layoutPrincipal=LayoutVertical() 15 | 16 | self.txtCodigo=TextBox(self) 17 | self.txtCodigo.setFixedWidth(200) 18 | self.ckAtivo=CheckBox('Ativo',self) 19 | self.ckAtivo.setChecked(True) 20 | 21 | hboxcodigo=LayoutHorizontal() 22 | hboxcodigo.addWidget(self.txtCodigo) 23 | hboxcodigo.addWidget(self.ckAtivo) 24 | hboxcodigo.addStretch(2) 25 | 26 | self.fLayout=FormLayout() 27 | self.fLayout.addRow(u'Código',hboxcodigo) 28 | 29 | # Adicionando form layout layout principal 30 | self.layoutPrincipal.addLayout(self.fLayout) 31 | 32 | # Botoes 33 | self.btnNovo=Botao('&Novo',self) 34 | self.btnSalvar=Botao('&Salvar',self) 35 | self.btnExcluir=Botao('&Excluir',self) 36 | self.btnPesquisar=Botao('&Pesquisar',self) 37 | self.btnImprimir=Botao('&Imprimir',self) 38 | 39 | hboxBotoes=LayoutHorizontal() 40 | hboxBotoes.addStretch(2) 41 | hboxBotoes.addWidget(self.btnNovo) 42 | hboxBotoes.addWidget(self.btnSalvar) 43 | hboxBotoes.addWidget(self.btnExcluir) 44 | hboxBotoes.addWidget(self.btnPesquisar) 45 | hboxBotoes.addWidget(self.btnImprimir) 46 | 47 | self.layoutPrincipal.addLayout(hboxBotoes) 48 | 49 | self.setLayout(self.layoutPrincipal) 50 | 51 | def centerOnScreen(self): 52 | resolucao = QDesktopWidget().screenGeometry() 53 | self.move((resolucao.width()/2) - (self.frameSize().width()/2), 54 | (resolucao.height()/2) - (self.frameSize().height()/2)) 55 | 56 | if __name__ == '__main__': 57 | import sys 58 | root = QApplication(sys.argv) 59 | app = FrmCadDefault(None) 60 | app.show() 61 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/FrmGif.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from base import * 3 | 4 | class FrmGif(Widget): 5 | 6 | def __init__(self,parent=None): 7 | super(FrmGif,self).__init__() 8 | 9 | self.frmGif() 10 | 11 | def frmGif(self): 12 | self.resize(166,190) 13 | self.show_gif = QLabel(self) 14 | self.gif = QMovie("walking-man2.gif") 15 | self.show_gif.setMovie(self.gif) 16 | self.gif.start() 17 | 18 | if __name__ == '__main__': 19 | import sys 20 | root = QApplication(sys.argv) 21 | app = FrmGif(None) 22 | app.show() 23 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/FrmMenu.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from FrmCadDefault import FrmCadDefault 3 | from FrmCadCliente import FrmCadCliente 4 | from FrmPesquisaCliente import FrmPesquisaCliente 5 | from FrmGif import FrmGif 6 | from base import * 7 | 8 | class FrmMenu(Widget): 9 | 10 | def __init__(self,parent=None): 11 | super(FrmMenu,self).__init__(parent) 12 | 13 | self.frmMenu() 14 | 15 | def frmMenu(self): 16 | self.setWindowTitle('Menu principal') 17 | #self.centerOnScreen() 18 | self.resize(400,300) 19 | self.layoutPrincipal=LayoutVertical() 20 | 21 | # Botoes 22 | self.btnCadCliente=Botao('&Cadastro de Cliente',self) 23 | self.btnCadCliente.clicked.connect(self.AbreCadastro) 24 | self.btnPesquisaCliente=Botao('&Pesquisa Cliente',self) 25 | self.btnPesquisaCliente.clicked.connect(self.AbrePesquisa) 26 | self.btnGif=Botao('&Gif animado',self) 27 | self.btnGif.clicked.connect(self.AbreGif) 28 | self.btnFechar=Botao('&Fechar',self) 29 | self.btnFechar.clicked.connect(self.close) 30 | 31 | self.show_gif=QLabel(self) 32 | self.show_gif.resize(166,190) 33 | self.gif=QMovie("walking-man2.gif") 34 | self.show_gif.setMovie(self.gif) 35 | self.gif.start() 36 | 37 | hboxBotoes=LayoutHorizontal() 38 | hboxBotoes.addWidget(self.btnCadCliente) 39 | hboxBotoes.addWidget(self.btnPesquisaCliente) 40 | hboxBotoes.addWidget(self.btnGif) 41 | hboxBotoes.addWidget(self.btnFechar) 42 | hboxBotoes.addStretch(2) 43 | 44 | self.layoutPrincipal.addLayout(hboxBotoes) 45 | self.layoutPrincipal.addWidget(self.show_gif) 46 | self.setLayout(self.layoutPrincipal) 47 | 48 | def AbreCadastro(self): 49 | frmCadastro=FrmCadCliente(self) 50 | #frmCadastro.setModal(True) 51 | frmCadastro.show() 52 | frmCadastro.exec_() 53 | 54 | def AbrePesquisa(self): 55 | frmPesquisa=FrmPesquisaCliente(self) 56 | frmPesquisa.setModal(True) #tela em primeiro plano 57 | frmPesquisa.show() 58 | frmPesquisa.exec_() 59 | 60 | def AbreGif(self): 61 | frmGif=FrmGif(self) 62 | frmGif.show() 63 | frmGif.exec_() 64 | 65 | if __name__ == '__main__': 66 | import sys 67 | root = QApplication(sys.argv) 68 | app = FrmMenu(None) 69 | app.show() 70 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/FrmPesquisaCliente.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from base import * 3 | from Db import ClientesDb 4 | 5 | class FrmPesquisaCliente(Dialog): 6 | 7 | def __init__(self,parent=None): 8 | super(FrmPesquisaCliente,self).__init__(parent) 9 | 10 | self.frmPesquisaClienteCreate() 11 | self.btnBuscar.clicked.connect(self.PesquisarCliente) 12 | 13 | #criando um objeto cliente DB para que fique disponível para interagir c/ o módulo de acesso a dados 14 | self.clientedb = ClientesDb() 15 | 16 | self.CenterOnScreen() 17 | 18 | def frmPesquisaClienteCreate(self): 19 | self.setWindowTitle(u'Pesquisa de clientes') 20 | self.setMinimumSize(900,350) 21 | 22 | self.layoutPrincipal=LayoutVertical() 23 | 24 | # criando campo de busca 25 | self.lblBusca=Label('Busca',self) 26 | self.txtBusca=TextBox(self) 27 | self.btnBuscar = Botao('&Buscar', self) 28 | 29 | hboxBusca=LayoutHorizontal() 30 | self.CenterOnScreen() 31 | hboxBusca.addWidget(self.lblBusca) 32 | hboxBusca.addWidget(self.txtBusca) 33 | hboxBusca.addWidget(self.btnBuscar) 34 | 35 | self.layoutPrincipal.addLayout(hboxBusca) 36 | 37 | # criando o grid da pesquisa 38 | cabecalho_grid=[u'Código', 'Nome','CPF', 'email', 'Fone', 'UF'] 39 | self.grdPesquisaCliente=Grid(self,0,len(cabecalho_grid)) 40 | self.grdPesquisaCliente.setHorizontalHeaderLabels(cabecalho_grid) 41 | 42 | # desativando edição do grid de pesquisa 43 | self.grdPesquisaCliente.setEditTriggers(QAbstractItemView.NoEditTriggers) 44 | 45 | # redimensionando as colunas do grid 46 | self.grdPesquisaCliente.setColumnWidth(1,270) 47 | self.grdPesquisaCliente.setColumnWidth(2,200) 48 | 49 | # botao ListarTodos 50 | self.btnListarTodos=Botao('&Listar todos',self) 51 | self.btnListarTodos.clicked.connect(self.ListarTodosClientes) 52 | 53 | # botao fechar 54 | self.btnFechar=Botao('&Fechar',self) 55 | self.btnFechar.clicked.connect(self.close) 56 | 57 | # Layout horizontal inferior 58 | hboxFechar=LayoutHorizontal() 59 | hboxFechar.addWidget(self.btnListarTodos) 60 | hboxFechar.addWidget(self.btnFechar) 61 | 62 | self.layoutPrincipal.addWidget(self.grdPesquisaCliente) 63 | self.layoutPrincipal.addLayout(hboxFechar) 64 | self.setLayout(self.layoutPrincipal) 65 | 66 | def PesquisarCliente(self, e): 67 | '''Método faz uma busca de clientes no banco de dados, e cria uma lista de tuplas''' 68 | # faz a consulta no banco e recebe uma lista de tuplas 69 | texto_busca = str(self.txtBusca.text()) 70 | lista_dados_cliente = self.clientedb.ConsultaClientesPorNome(texto_busca) 71 | 72 | # setando no grid a quant de linhas, com a mesma quant de registros da lista 73 | quant_registros = len(lista_dados_cliente) 74 | self.grdPesquisaCliente.setRowCount(quant_registros) 75 | 76 | linha = 0 77 | for cliente in lista_dados_cliente: 78 | # capturando os dados da tupla 79 | id_cliente = cliente[0] 80 | Nome_cliente = cliente[1] 81 | CPF_cliente = cliente[2] 82 | Email_cliente = cliente[3] 83 | Fone_cliente = cliente[4] 84 | UF_cliente = cliente[5] 85 | 86 | # preenche o grid de pesquisa 87 | self.grdPesquisaCliente.setItem(linha, 0, QTableWidgetItem(id_cliente)) 88 | self.grdPesquisaCliente.setItem(linha, 1, QTableWidgetItem(Nome_cliente)) 89 | self.grdPesquisaCliente.setItem(linha, 2, QTableWidgetItem(CPF_cliente)) 90 | self.grdPesquisaCliente.setItem(linha, 3, QTableWidgetItem(Email_cliente)) 91 | self.grdPesquisaCliente.setItem(linha, 4, QTableWidgetItem(Fone_cliente)) 92 | self.grdPesquisaCliente.setItem(linha, 5, QTableWidgetItem(UF_cliente)) 93 | 94 | linha += 1 95 | 96 | def ListarTodosClientes(self): 97 | '''Método lista todos registros do banco de dados''' 98 | lista_dados_cliente = self.clientedb.ConsultaTodosClientes() 99 | 100 | # setando no grid a quant de linhas, com a mesma quant de registros da lista 101 | quant_registros = len(lista_dados_cliente) 102 | self.grdPesquisaCliente.setRowCount(quant_registros) 103 | 104 | linha = 0 105 | for cliente in lista_dados_cliente: 106 | # capturando os dados da tupla 107 | id_cliente = cliente[0] 108 | Nome_cliente = cliente[1] 109 | CPF_cliente = cliente[2] 110 | Email_cliente = cliente[3] 111 | Fone_cliente = cliente[4] 112 | UF_cliente = cliente[5] 113 | 114 | # preenche o grid de pesquisa 115 | self.grdPesquisaCliente.setItem(linha, 0, QTableWidgetItem(id_cliente)) 116 | self.grdPesquisaCliente.setItem(linha, 1, QTableWidgetItem(Nome_cliente)) 117 | self.grdPesquisaCliente.setItem(linha, 2, QTableWidgetItem(CPF_cliente)) 118 | self.grdPesquisaCliente.setItem(linha, 3, QTableWidgetItem(Email_cliente)) 119 | self.grdPesquisaCliente.setItem(linha, 4, QTableWidgetItem(Fone_cliente)) 120 | self.grdPesquisaCliente.setItem(linha, 5, QTableWidgetItem(UF_cliente)) 121 | 122 | linha += 1 123 | 124 | def CenterOnScreen(self): 125 | resolucao = QDesktopWidget().screenGeometry() 126 | self.move((resolucao.width()/2) - (self.frameSize().width()/2), 127 | (resolucao.height()/2) - (self.frameSize().height()/2)) 128 | 129 | if __name__ == '__main__': 130 | import sys 131 | root = QApplication(sys.argv) 132 | app = FrmPesquisaCliente() 133 | app.show() 134 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/Makefile: -------------------------------------------------------------------------------- 1 | pyqt: 2 | python FrmMenu.py 3 | -------------------------------------------------------------------------------- /pyQt4/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | import sys 4 | from PyQt4.QtCore import * 5 | from PyQt4.QtGui import * 6 | 7 | # styleFile=os.path.join(os.path.split(__file__)[0],"style.stylesheet") 8 | # with open(styleFile,'r') as fh: 9 | # self.setStyleSheet(fh.read()) 10 | 11 | class TextBox(QLineEdit): 12 | 13 | def __init__(self, parent=None): 14 | super(TextBox, self).__init__(parent) 15 | 16 | class Label(QLabel): 17 | 18 | def __init__(self, pText='', parent=None): 19 | super(Label, self).__init__(parent) 20 | 21 | self.setText(pText) 22 | 23 | class CheckBox(QCheckBox): 24 | 25 | def __init__(self, pText='', parent=None): 26 | super(CheckBox, self).__init__(parent) 27 | 28 | self.setText(pText) 29 | 30 | class Botao(QPushButton): 31 | 32 | def __init__(self, pText='', parent=None): 33 | super(Botao, self).__init__(parent) 34 | 35 | self.setText(pText) 36 | 37 | class LayoutVertical(QVBoxLayout): 38 | 39 | def __init__(self): 40 | super(LayoutVertical, self).__init__() 41 | 42 | class LayoutHorizontal(QHBoxLayout): 43 | 44 | def __init__(self): 45 | super(LayoutHorizontal, self).__init__() 46 | 47 | class Widget(QWidget): 48 | 49 | def __init__(self, parent=None): 50 | super(Widget, self).__init__() 51 | 52 | 53 | class FormLayout(QFormLayout): 54 | 55 | def __init__(self): 56 | super(FormLayout, self).__init__() 57 | 58 | 59 | class Dialog(QDialog): 60 | 61 | def __init__(self, parent=None): 62 | super(Dialog, self).__init__(parent) 63 | 64 | class Grid(QTableWidget): 65 | 66 | def __init__(self, parent=None, qtde_linhas=0, qtde_colunas=0): 67 | super(Grid,self).__init__(parent) 68 | 69 | self.setRowCount(qtde_linhas) 70 | self.setColumnCount(qtde_colunas) 71 | 72 | self.resizeRowsToContents() 73 | self.setAlternatingRowColors(True) 74 | self.setSortingEnabled(True) 75 | self.setSelectionBehavior(QAbstractItemView.SelectRows) 76 | 77 | class MessageBox(QMessageBox): 78 | 79 | def __init__(self, parent=None): 80 | super(MessageBox, self).__init__(parent) -------------------------------------------------------------------------------- /pyQt4/inserirdados.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE clientes(id INTEGER NOT NULL PRIMARY KEY, Nome VARCHAR(100) NOT NULL, CPF VARCHAR(11) NOT NULL, Email VARCHAR(20) NOT NULL, Fone VARCHAR(20), UF VARCHAR(2) NOT NULL ); 2 | INSERT INTO clientes values(1, 'Regis', '00000000000', 'rg@email.com', '1100000000', 'SP'); 3 | INSERT INTO clientes values(2, 'Abigail', '11111111111', 'abigail@email.com', '1112345678', 'RJ'); 4 | INSERT INTO clientes values(3, 'Benedito', '22222222222', 'benedito@email.com', '1187654321', 'SP'); 5 | INSERT INTO clientes values(4, 'Zacarias', '33333333333', 'zacarias@email.com', '1199999999', 'RJ'); 6 | -------------------------------------------------------------------------------- /pyQt4/style.stylesheet: -------------------------------------------------------------------------------- 1 | Botao { 2 | color: #ffffff; 3 | background-color: #428BCA; 4 | display: inline-block; 5 | } -------------------------------------------------------------------------------- /pyQt4/testes/pyQt01.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtCore import * 2 | from PyQt4.QtGui import * 3 | 4 | class main(QMainWindow): 5 | 6 | def __init__(self, parent = None): 7 | super(main, self).__init__(parent) 8 | 9 | txtNome = QLineEdit(self) 10 | btnBotao = QPushButton('OK',self) 11 | btnBotao.move(110,0) 12 | ckbCheck = QCheckBox('Marque',self) 13 | ckbCheck.move(0,50) 14 | 15 | if __name__ == '__main__': 16 | import sys 17 | root = QApplication(sys.argv) 18 | app = main(None) 19 | app.show() 20 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/testes/pyQt02_HLayout.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtCore import * 2 | from PyQt4.QtGui import * 3 | 4 | class main(QWidget): 5 | 6 | def __init__(self, parent = None): 7 | super(main, self).__init__(parent) 8 | 9 | txtNome = QLineEdit(self) 10 | txtSobrenome = QLineEdit(self) 11 | txtIdade = QLineEdit(self) 12 | 13 | hbox = QHBoxLayout() 14 | hbox.addWidget(txtNome) 15 | hbox.addWidget(txtSobrenome) 16 | hbox.addWidget(txtIdade) 17 | 18 | self.setLayout(hbox) 19 | # btnBotao = QPushButton('OK',self) 20 | # btnBotao.move(110,0) 21 | # ckbCheck = QCheckBox('Marque',self) 22 | # ckbCheck.move(0,50) 23 | 24 | if __name__ == '__main__': 25 | import sys 26 | root = QApplication(sys.argv) 27 | app = main(None) 28 | app.show() 29 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/testes/pyQt03_form_layout.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtCore import * 2 | from PyQt4.QtGui import * 3 | 4 | class main(QWidget): 5 | 6 | def __init__(self, parent = None): 7 | super(main, self).__init__(parent) 8 | 9 | txtNome = QLineEdit(self) 10 | txtSobrenome = QLineEdit(self) 11 | txtIdade = QLineEdit(self) 12 | 13 | flayout = QFormLayout() 14 | flayout.addRow('Nome:',txtNome) 15 | flayout.addRow('Sobrenome:',txtSobrenome) 16 | flayout.addRow('Idade:',txtIdade) 17 | 18 | self.setLayout(flayout) 19 | 20 | if __name__ == '__main__': 21 | import sys 22 | root = QApplication(sys.argv) 23 | app = main(None) 24 | app.show() 25 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/testes/pyQt04_layout.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtCore import * 2 | from PyQt4.QtGui import * 3 | 4 | class main(QWidget): 5 | 6 | def __init__(self, parent = None): 7 | super(main, self).__init__(parent) 8 | 9 | layoutPrincipal = QVBoxLayout() 10 | 11 | self.setMinimumSize(400,250) 12 | self.setWindowTitle('Layout') 13 | txtNome = QLineEdit(self) 14 | txtSobrenome = QLineEdit(self) 15 | txtIdade = QLineEdit(self) 16 | 17 | flayout = QFormLayout() 18 | flayout.addRow('Nome:',txtNome) 19 | flayout.addRow('Sobrenome:',txtSobrenome) 20 | flayout.addRow('Idade:',txtIdade) 21 | 22 | layoutPrincipal.addLayout(flayout) 23 | 24 | btnOK = QPushButton('OK', self) 25 | btnCancelar = QPushButton('Cancelar', self) 26 | 27 | hboxBotoes = QHBoxLayout() 28 | hboxBotoes.addWidget(btnOK) 29 | hboxBotoes.addWidget(btnCancelar) 30 | 31 | layoutPrincipal.addLayout(hboxBotoes) 32 | 33 | self.setLayout(layoutPrincipal) 34 | 35 | if __name__ == '__main__': 36 | import sys 37 | root = QApplication(sys.argv) 38 | app = main(None) 39 | app.show() 40 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/testes/pyQt05_layout.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtCore import * 2 | from PyQt4.QtGui import * 3 | 4 | class main(QWidget): 5 | 6 | def __init__(self, parent = None): 7 | super(main, self).__init__(parent) 8 | 9 | layoutPrincipal = QVBoxLayout() 10 | 11 | self.setMinimumSize(400,250) 12 | self.setWindowTitle('Layout') 13 | txtNome = QLineEdit(self) 14 | txtSobrenome = QLineEdit(self) 15 | txtIdade = QLineEdit(self) 16 | 17 | flayout = QFormLayout() 18 | flayout.addRow('Nome:',txtNome) 19 | flayout.addRow('Sobrenome:',txtSobrenome) 20 | flayout.addRow('Idade:',txtIdade) 21 | 22 | layoutPrincipal.addLayout(flayout) 23 | 24 | btnOK = QPushButton('OK', self) 25 | btnCancelar = QPushButton('Cancelar', self) 26 | 27 | hboxBotoes = QHBoxLayout() 28 | hboxBotoes.addStretch(2) # se quiser do lado esquerdo coloque este comando depois das duas linhas abaixo 29 | hboxBotoes.addWidget(btnOK) 30 | hboxBotoes.addWidget(btnCancelar) 31 | 32 | layoutPrincipal.addLayout(hboxBotoes) 33 | 34 | self.setLayout(layoutPrincipal) 35 | 36 | if __name__ == '__main__': 37 | import sys 38 | root = QApplication(sys.argv) 39 | app = main(None) 40 | app.show() 41 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/testes/pyQt06_signal.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtCore import * 2 | from PyQt4.QtGui import * 3 | 4 | class main(QWidget): 5 | 6 | def __init__(self, parent = None): 7 | super(main, self).__init__(parent) 8 | 9 | layoutPrincipal = QVBoxLayout() 10 | 11 | self.setMinimumSize(400,250) 12 | self.setWindowTitle('Layout') 13 | txtNome = QLineEdit(self) 14 | txtSobrenome = QLineEdit(self) 15 | txtIdade = QLineEdit(self) 16 | 17 | flayout = QFormLayout() 18 | flayout.addRow('Nome:',txtNome) 19 | flayout.addRow('Sobrenome:',txtSobrenome) 20 | flayout.addRow('Idade:',txtIdade) 21 | 22 | layoutPrincipal.addLayout(flayout) 23 | 24 | btnOK = QPushButton('OK', self) 25 | btnCancelar = QPushButton('Cancelar', self) 26 | btnCancelar.clicked.connect(self.close) 27 | 28 | hboxBotoes = QHBoxLayout() 29 | hboxBotoes.addStretch(2) # se quiser do lado esquerdo coloque este comando depois das duas linhas abaixo 30 | hboxBotoes.addWidget(btnOK) 31 | hboxBotoes.addWidget(btnCancelar) 32 | 33 | layoutPrincipal.addLayout(hboxBotoes) 34 | 35 | self.setLayout(layoutPrincipal) 36 | 37 | if __name__ == '__main__': 38 | import sys 39 | root = QApplication(sys.argv) 40 | app = main(None) 41 | app.show() 42 | root.exec_() -------------------------------------------------------------------------------- /pyQt4/walking-man2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/python-classes-metodos/8bf583ce6ef7b409627ee0db9b91521e0b15fbe3/pyQt4/walking-man2.gif -------------------------------------------------------------------------------- /pySide/Makefile: -------------------------------------------------------------------------------- 1 | pyside1: 2 | python pySide/pyside01.py 3 | 4 | pyside2: 5 | python pySide/pyside02.py 6 | -------------------------------------------------------------------------------- /pySide/pyside01.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from PySide.QtCore import * 3 | from PySide.QtGui import * 4 | 5 | app = QApplication(sys.argv) 6 | 7 | label = QLabel("Ola mundo!") 8 | label.show() 9 | 10 | app.exec_() 11 | sys.exit() -------------------------------------------------------------------------------- /pySide/pyside02.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from PySide.QtCore import * 3 | from PySide.QtGui import * 4 | 5 | app = QApplication(sys.argv) 6 | 7 | class main(QWidget): 8 | 9 | def __init__(self): 10 | QWidget.__init__(self) 11 | self.setMinimumSize(400,185) 12 | self.setWindowTitle('Meu programa') 13 | self.lbl_nome = QLabel('Nome:',self) 14 | self.lbl_nome.move(10,10) 15 | self.txt_nome = QLineEdit(self) 16 | self.txt_nome.setMinimumWidth(285) 17 | self.txt_nome.move(60,10) 18 | self.lbl_sauda = QLabel('Esperando para saudar...',self) 19 | self.lbl_sauda.move(200,100) 20 | self.btn_saudar = QPushButton('Saudar',self) 21 | self.btn_saudar.setMinimumWidth(145) 22 | self.btn_saudar.move(250,150) 23 | self.btn_saudar.clicked.connect(self.clicked_btn_saudar) 24 | 25 | def clicked_btn_saudar(self): 26 | sauda = 'Ola %s!!!'%self.txt_nome.text() 27 | self.lbl_sauda.setText(sauda) 28 | 29 | def run(self): 30 | self.show() 31 | app.exec_() 32 | 33 | app_main = main() 34 | app_main.run() -------------------------------------------------------------------------------- /pythonBasico/README.md: -------------------------------------------------------------------------------- 1 | # pythonBasico 2 | 3 | Esta pasta possui conteúdos sobre classes e métodos básicos em Python. 4 | 5 | Leia o artigo [Introdução a Classes e Métodos em Python (básico)][0]. 6 | 7 | [0]: http://pythonclub.com.br/introducao-classes-metodos-python-basico.html -------------------------------------------------------------------------------- /pythonBasico/calculadora/calculadora.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | class Calculadora: 4 | def __init__(self,a,b): 5 | self.a = a 6 | self.b = b 7 | 8 | def soma(self): 9 | return self.a + self.b 10 | 11 | def subtrai(self): 12 | return self.a - self.b 13 | 14 | def multiplica(self): 15 | return self.a * self.b 16 | 17 | def divide(self): 18 | return self.a / self.b 19 | 20 | -------------------------------------------------------------------------------- /pythonBasico/calculadora/calculadora2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | class Calculadora: 4 | def soma(self,a,b): 5 | return a + b 6 | 7 | def subtrai(self,a,b): 8 | return a - b 9 | 10 | def multiplica(self,a,b): 11 | return a * b 12 | 13 | def divide(self,a,b): 14 | return a / b 15 | 16 | -------------------------------------------------------------------------------- /pythonBasico/calculadora/usando_calculadora.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from calculadora import Calculadora 3 | 4 | c = Calculadora(128, 2) 5 | 6 | print('Soma:', c.soma()) 7 | print('Subtração:', c.subtrai()) 8 | print('Multiplicação:', c.multiplica()) 9 | print('Divisão:', c.divide()) 10 | 11 | c.a = 12 12 | c.b = 42 13 | 14 | print(c.soma()) 15 | -------------------------------------------------------------------------------- /pythonBasico/calculadora/usando_calculadora2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from calculadora2 import Calculadora 3 | 4 | c = Calculadora() 5 | 6 | print('Soma:', c.soma(2, 3)) 7 | print('Subtração:', c.subtrai(2, 10)) 8 | print('Multiplicação:', c.multiplica(3, 3)) 9 | print('Divisão:', c.divide(128, 2)) 10 | 11 | print(c.soma(10, 10)) 12 | -------------------------------------------------------------------------------- /pythonBasico/tv/tv.py: -------------------------------------------------------------------------------- 1 | class Televisao: 2 | 3 | def __init__(self): 4 | self.ligada = False 5 | self.canal = 2 6 | 7 | def muda_canal_para_baixo(self): 8 | self.canal -= 1 9 | 10 | def muda_canal_para_cima(self): 11 | self.canal += 1 12 | 13 | if __name__ == '__main__': 14 | tv = Televisao() 15 | print('Canal inicial:', tv.canal) 16 | print('Ligada:', tv.ligada) 17 | 18 | tv.ligada = True 19 | tv.canal = 5 20 | 21 | print('Ligada:', tv.ligada) 22 | print('Canal inicial:', tv.canal) 23 | tv.muda_canal_para_cima() 24 | print('Canal +', tv.canal) 25 | tv.muda_canal_para_cima() 26 | print('Canal +', tv.canal) 27 | tv.muda_canal_para_baixo() 28 | print('Canal -', tv.canal) 29 | -------------------------------------------------------------------------------- /pythonBasico/user/user.py: -------------------------------------------------------------------------------- 1 | class User: 2 | 3 | seq = 0 4 | objects = [] 5 | 6 | def __init__(self, nome, idade): 7 | self.id = None 8 | self.nome = nome 9 | self.idade = idade 10 | 11 | def save(self): 12 | self.__class__.seq += 1 13 | self.id = self.__class__.seq 14 | self.__class__.objects.append(self) 15 | 16 | def __str__(self): 17 | return self.nome 18 | 19 | def __repr__(self): 20 | return '<{}: {} - {} - {}>\n'.format(self.__class__.__name__, self.id, self.nome, self.idade) 21 | 22 | @classmethod 23 | def all(cls): 24 | return cls.objects 25 | 26 | if __name__ == '__main__': 27 | u1 = User('Regis', 35) 28 | u1.save() 29 | u2 = User('Fabio', 20) 30 | u2.save() 31 | print(User.all()) 32 | -------------------------------------------------------------------------------- /pythonBasico/user/user_comentado.py: -------------------------------------------------------------------------------- 1 | class User: 2 | 3 | # Define um atributo que servirá como contador inicial e um atributo objects 4 | # (tupla vazia) que é uma lista de instâncias de User que foram salvos 5 | # (que chamaram o método save). 6 | seq = 0 7 | objects = [] 8 | 9 | # Atribui um valor inicial aos atributos no momento da chamada do 10 | # construtor. 11 | def __init__(self, nome, idade): 12 | # inicializando os atributos, id começa com None, pois a instância foi 13 | # criada mas ainda não foi salva. 14 | self.id = None 15 | self.nome = nome 16 | self.idade = idade 17 | 18 | # Método para salvar os dados 19 | # ele incrementa o atributo de classe que conta quantas instâncias 20 | # foram salvas e adiciona a instância na lista de objects. 21 | def save(self): 22 | # self.__class__ acessa a classe que criou a instância, assim é possível 23 | # acessar o atributo de seq. Aqui poderia ser usado User.seq, 24 | # porém caso User fosse herdado, o seq seria o de User e não da classe 25 | # filha. 26 | self.__class__.seq += 1 27 | self.id = self.__class__.seq 28 | # Da mesma forma que acessamos seq, acessamos objects e é feito um 29 | # append com a instância. 30 | self.__class__.objects.append(self) 31 | 32 | # Retorna uma representação do objeto como str, usado em conversões para string. 33 | # Exemplo: str(my_user), print my_user 34 | def __str__(self): 35 | return self.nome 36 | 37 | # Retorna uma representação do objeto usada para outros objetos. 38 | # Exemplo: quando é convertida uma lista de user para string. 39 | def __repr__(self): 40 | # self.__class__.__name__ é a forma de acessar o nome da classe que 41 | # gerou a instância. 42 | return '<{}: {} - {} - {}>\n'.format(self.__class__.__name__, self.id, self.nome, self.idade) 43 | 44 | # Class method usado para acessar todas as instâncias salvas (que chamaram o método save). 45 | # Aqui usamos um @classmethod, pois faz mais sentido ser um método de classe 46 | # do que de instância, pois estamos retornando informações da classe 47 | # e não de uma instância isolada. 48 | @classmethod 49 | def all(cls): 50 | return cls.objects 51 | 52 | # Demonstração do uso da classe. 53 | if __name__ == '__main__': 54 | u1 = User('Regis', 35) 55 | u2 = User('Fabio', 20) 56 | # Note que nesse print a lista está vazia 57 | print(User.all()) 58 | u1.save() 59 | u2.save() 60 | # Após chamar o save para as duas instâncias elas são guardadas 61 | # e o método User.all() retorna essa lista. 62 | print(User.all()) 63 | --------------------------------------------------------------------------------