Interface Gráfica Com Python
Interface Gráfica Com Python
Descrição
Propósito
Preparação
Antes de iniciar este conteúdo, você precisar ter instalado uma versão
do python, a IDE Spyder e o PostgreSQL.
Objetivos
Módulo 1
Módulo 2
Módulo 3
Módulo 4
meeting_room
Introdução
Cada vez mais, nós geramos e consumimos dados para
realizarmos atividades que vão desde a abertura de uma conta
bancária até as informações que disponibilizamos nas redes
sociais.
Tkinter
É o framework GUI padrão do python. Sua sintaxe é simples, possui
muitos componentes para interação com o usuário. Além disso, seu
código é aberto e é disponível sob a licença python. Caso ela não esteja
instalada na sua versão do python, basta digitar o comando:
Terminal
content_copy
Para quem usa a IDE Spyder (SPYDER, 2020), é necessário colocar uma
exclamação antes do comando “pip”, ou seja:
Terminal
content_copy
Python
content_copy
1 import tkinter
2 tkinter._test()
Atenção!
Devido à importância do Tkinter, vamos explorá-lo com bastantes
detalhes mais à frente.
Flexx
É um kit de ferramentas para o desenvolvimento de interfaces gráficas
com o usuário implementado em python que faz uso de tecnologia web
para sua renderização. O Flexx pode ser usado para criar tanto
aplicações de desktop como para web e até mesmo exportar uma
aplicação para um documento HTML independente. Para instalar o
Flexx, basta digitar o comando:
Terminal
content_copy
Comentário
Para evitar repetições sobre isso, apresentaremos aqui como instalar o
pacote Flexx na IDE Spyder, mas, para os próximos casos, mostraremos
apenas a instalação tradicional, ou seja, sem o símbolo de
“exclamação”.
Terminal
content_copy
Python
content_copy
CEF python
É um projeto de código aberto voltado para o desenvolvimento de
aplicações com integração ao Google Chrome. Existem muitos casos de
uso para CEF. Por exemplo, ele pode ser usado para criar uma GUI
baseada em HTML 5, pode usá-lo para testes automatizados, como
também pode ser usado para web scraping, entre outras aplicações.
Terminal
content_copy
Python
content_copy
1 from cefpython3 import cefpython as cef
2 import platform
3 import sys
4 def main():
5 check_versions()
6 sys.excepthook = cef.ExceptHook # To shutdown a
Atenção!
Como esse exemplo, apesar de simples, é um pouco maior, cabe
lembrar que a indentação faz parte da sintaxe do python (python 3.8.5
documentation, 2020), por isso, é necessário ter bastante cuidado, caso
contrário o programa apresentará erros.
Kivy
Terminal
content_copy
Python
content_copy
Pyforms
É um framework python 3 para desenvolver aplicações que podem
operar nos ambientes Desktop GUI, Terminal e Web. A biblioteca é
composta por três sub-bibliotecas, cada uma implementando a camada
responsável por interpretar a aplicação Pyforms em cada ambiente
diferente:
1. Pyforms-gui.
2. Pyforms-web.
3. Pyforms-terminal.
Python
content_copy
Python
content_copy
1 import pyforms
2 from pyforms.basewidget import BaseWidget
3 from pyforms.controls import ControlText
4 from pyforms.controls import ControlButton
5
6 class ExemploSimples(BaseWidget):
Comentário
No exemplo da imagem anterior, é possível ver três caixas de texto,
chamadas de “controle de texto”, e um componente botão, chamado de
“controle de botão” pelo Pyforms. Ele foi projetado a fim de desenvolver
aplicações para executar no modo Windows GUI.
PyQt
Uma aplicação desenvolvida no framework PyQt e executada nas
plataformas Windows, macOS, Linux, iOS e Android.
Terminal
content_copy
1 pip install PyQt5
Python
content_copy
1 import sys
2 from PyQt5 import QtCore, QtWidgets
3 from PyQt5.QtWidgets import QMainWindow, QLabel, Q
4 from PyQt5.QtCore import QSize
5
6 class HelloWindow(QMainWindow):
7 def __init__(self):
8 QMainWindow.__init__(self)
9
10 self.setMinimumSize(QSize(280, 120))
11 self.setWindowTitle("Olá, Mundo! Exemplo PyQ
12
13 centralWidget = QWidget(self)
14 self.setCentralWidget(centralWidget)
15
16 gridLayout = QGridLayout(self)
17 centralWidget.setLayout(gridLayout)
18
19 title = QLabel("Olá Mundo para PyQt", self)
20 title.setAlignment(QtCore.Qt.AlignCenter)
21
wxPython
É um kit de ferramentas GUI baseadas em uma biblioteca C++ chamada
wxWidgets que foi lançada em 1998. O wxpython usa os componentes
(widgets) reais na plataforma nativa sempre que possível. Essa,
inclusive, é a principal diferença entre o wxpython e outros kits de
ferramentas, como PyQt ou Tkinter.
Atenção!
As aplicações desenvolvidas em wxpython se assemelham a aplicações
nativas do sistema operacional em que estão sendo executadas.
Terminal
content_copy
Python
content_copy
1 import wx
2 class Janela(wx.Frame):
3 def __init__(self, parent, title):
4 super(Janela, self).__init__(parent, title=t
5 self.panel = ExemploPainel(self)
6 self.text_ctrl = wx.TextCtrl(self.panel, pos
7 self.btn_test = wx.Button(self.panel, label=
8
9
10 class ExemploPainel(wx.Panel):
11 def __init__(self, parent):
12 super(ExemploPainel, self).__init__(parent)
13
14
15 class ExemploApp(wx.App):
16 def OnInit(self):
17 self.frame = Janela(parent=None, title="Jane
18 self.frame.Show()
19 return True
20
PyAutoGUI
Comentário
Terminal
content_copy
Python
content_copy
1 import pyautogui
2 screenWidth, screenHeight = pyautogui.size()
3 currentMouseX, currentMouseY = pyautogui.position()
4 pyautogui.moveTo(100, 150)
5 pyautogui.click()
6 pyautogui click(100 200)
Atenção!
Antes de executar o código, cabe um alerta: Essa aplicação, apesar de
ser muito simples, vai interagir com o seu sistema.
PySimpleGUI
Esse pacote foi lançado em 2018 e possui portabilidade com os
pacotes: Tkinter, PyQt, wxpython e Remi, portanto aumenta as
possibilidades de uso de componentes na programação.
Terminal
content_copy
Python
content_copy
1 import PySimpleGUI as sg
2
3 sg.theme('DarkAmber')
4
5 layout = [ [sg.Text('Texto na linha 1')],
6 [sg.Text('Entre com um texto na linha 2'), sg.Inp
Exemplo PySimpleGUI.
Atenção!
A lista de frameworks e bibliotecas disponíveis para python ainda tem
muitos outros exemplos, como o PySide e o PyObject. A escolha deve
levar em consideração a maturidade da biblioteca/framework e a
necessidade de o projeto incorporar ou não aspectos mais elaborados
de uma GUI.
Interface GUI
Vantagens e desvantagens de uma Interface GUI
Agora, discutiremos sobre alguns dos aspectos do desenvolvimento de
um projeto de interface gráfica.
Vantagens
Desvantagens
video_library
Como criar uma aplicação com
interface gráfica
Aprenda a criar uma aplicação com interface gráfica. Veja a
apresentação do protótipo de sistema que será desenvolvido, os
frameworks a serem utilizados e a preparação do ambiente para
utilização.
Falta pouco para atingir seus objetivos.
Questão 1
Independentemente do ambiente de
B desenvolvimento, o comando “pip” deve ser usado
da mesma forma.
Questão 2
Biblioteca Tkinter
Conceitos
Neste módulo, o nosso foco será na criação de uma aplicação GUI. Para
isso, a biblioteca que vamos usar como referência é a Tkinter.
Comentário
Python
content_copy
1 import tkinter
2 janela = tkinter.Tk()
3 janela.mainloop()
Widgets Tkinter
O Tkinter possui diversos componentes (widgets), tais como botões,
rótulos e caixas de texto usados para criar aplicações interativas com o
usuário.
1. Window
2. Label
3. Button
4. Entry
5. Radiobutton
6. Checkbox
7. Text
8. Message
9. Sliders
10. Dialog
11. Combobox
Python
content_copy
1 import tkinter as tk
2 janela = tk.Tk()
3 janela.title(" Aplicação GUI")
4 janela.mainloop()
Python
content_copy
1 import tkinter as tk
2 janela = tk.Tk()
3 janela.title(" Aplicação GUI NÃO Dimensionável")
4 janela.resizable(False, False)
5 janela.mainloop()
Atenção!
A principal diferença desse exemplo em relação ao anterior está na linha
4, onde a propriedade de redimensionar a janela é colocada como
“Falso”.
Widget Label
Python
content_copy
1 import tkinter as tk
2 from tkinter import ttk
3 janela = tk.Tk()
4 janela.title(" Aplicação GUI com o Widget Label")
5 ttk.Label(janela, text="Componente Label" ).grid(col
6 janela.mainloop()
Widget Button
O próximo exemplo apresenta como usar o widget “Button”.
Python
content_copy
1 import tkinter as tk
2 contador = 0
3 def contador_label(lblRotulo):
4 def funcao_contar():
5 global contador
6 contador = contador + 1
7 lblRotulo.config(text=str(contador))
8 lblRotulo.after(1000, funcao_contar)
9 funcao_contar()
10 janela = tk.Tk()
11 janela.title("Contagem dos Segundos")
12 lblRotulo = tk.Label(janela, fg="green")
13 lblRotulo.pack()
14 contador_label(lblRotulo)
15 btnAcao = tk.Button(janela, text='Clique aqui para
16 btnAcao.pack()
17 janela.mainloop()
18
Widget Entry
Python
content_copy
1 import tkinter as tk
2 def mostrar_nomes():
3 print("Nome: %s\nSobrenome: %s" % (e1.get(), e2.
4 janela = tk.Tk()
5 janela.title("Aplicação GUI com o Widget Entry")
6
Widget Radiobutton
Python
content_copy
1 import tkinter as tk
2 janela = tk.Tk()
3 v = tk.IntVar()
4 tk.Label(janela,text="""Escolha uma linguagem de pr
5 tk.Radiobutton(janela,text="python",padx = 25,varia
6 tk.Radiobutton(janela,text="C++",padx = 25,variable
O código produzirá uma janela com dois “botões de rádio” (widgets
radiobutton), conforme a imagem a seguir.
Widget Checkbox
O próximo exemplo apresenta como usar o widget “checkbox”. O código
para gerar uma aplicação com esse componente é dado por:
Python
content_copy
1 import tkinter as tk
2 from tkinter import ttk
3 janela = tk.Tk()
4 def escolha_carreira():
5 print("Gerencial: %d,\nTécnica : %d" % (var1.get
6 ttk.Label(janela, text="Escolha sua vocação:").grid
7 var1 = tk.IntVar()
8 ttk.Checkbutton(janela, text="Gerencial", variable=
9 var2 = tk.IntVar()
10 ttk.Checkbutton(janela, text="Técnica", variable=va
11 ttk.Button(janela, text='Sair', command=janela.quit
12 ttk.Button(janela, text='Mostrar', command=escolha_
13 janela.mainloop()
O código produzirá uma janela com um “label”, dois “checkboxes” e dois
botões, conforme a Figura 16.
Widget Text
O próximo exemplo apresenta como usar o widget “Text”. O código para
gerar uma aplicação com o componente “Text” é dado por:
Python
content_copy
1 import tkinter as tk
2 janela = tk.Tk()
3 T = tk.Text(janela, height=2, width=30)
4 T.pack()
5 T.insert(tk.END, "Este é um texto\ncom duas linhas\
6 tk.mainloop()
Widget Message
O próximo exemplo apresenta como usar o widget “Message”. O código
para gerar uma aplicação com o componente “Message” é dado por:
Python
content_copy
1 import tkinter as tk
2 janela = tk.Tk()
3 mensagem_para_usuario = "Esta é uma mensagem.\n(Pod
4 msg = tk.Message(janela, text = mensagem_para_usuar
5 msg.config(bg='lightgreen', font=('times', 24, 'ita
6 msg.pack()
O código produzirá uma janela com uma mensagem, conforme pode ser
visto na imagem seguinte.
Widget Slider
O próximo exemplo apresenta como usar o widget “Slider”. O código
para gerar uma aplicação com esse componente é dado por:
Python
content_copy
1 import tkinter as tk
2 from tkinter import ttk
3 def mostrar_valores():
4 print (w1.get(), w2.get())
5 janela = tk.Tk()
6
Widget Dialog
Python
content_copy
1 import tkinter as tk
2 from tkinter import messagebox as mb
3 def resposta():
4 mb.showerror("Resposta", "Desculpe, nenhuma resp
5 def verificacao():
6 if mb.askyesno('Verificar', 'Realmente quer sair
close
Resposta Sair
close
Resposta No
Widget Combobox
O próximo exemplo apresenta como usar o widget “Combobox”. O
código para gerar uma aplicação com esse componente é dado por:
Python
content_copy
1 import tkinter as tk
2 from tkinter import ttk
3 # Criação de uma janela tkinter
4 janela = tk.Tk()
5 janela.title('Combobox')
6 janela.geometry('500x250')
7 # Componente Label
8 ttk.Label(janela, text = "Combobox Widget",backgrou
9 # Componente Label
10 ttk.Label(janela, text = "Selecione um mês :",font
11 # Componente Combobox
12 n = tk.StringVar()
13 escolha = ttk.Combobox(janela, width = 27, textvari
14 # Adição de itens no Combobox
15 escolha['values'] = (' Janeiro',' Fevereiro',' Març
16 escolha.grid(column = 1, row = 5)
17 escolha.current()
18 janela.mainloop()
video_library
Projetando a interface gráfica
Agora, daremos continuidade e projetaremos a interface gráfica. Veja
como são carregados os widgets necessários para o funcionamento do
protótipo.
Falta pouco para atingir seus objetivos.
Questão 1
Python
content_copy
1 import tkinter
2 lacuna_I = lacuna_II.Tk()
3 lacuna_III.mainloop()
Questão 2
Visão geral
Conceitos
O python possui muitas bibliotecas para interagir com diversos bancos
de dados. Aqui, o foco será a integração com o PostgreSQL. Isso porque
pode ser usado gratuitamente, possui bastante documentação
disponível on-line e pode ser aplicado para resolver problemas reais.
CRUD
Acrônimo da expressão do idioma Inglês, Create (Criação), Read (Consulta),
Update (Atualização) e Delete (Destruição).
Sql
content_copy
Sql
content_copy
Sql
content_copy
Agora, vamos estudar o pacote que será utilizado para que o python
possa interagir com o PostgreSQL: psycopg2.
Atenção!
O PostgreSQL pode ser integrado ao python usando o módulo psycopg2.
Trata-se de um adaptador de banco de dados PostgreSQL. O pacote
psycopg2 é simples, rápido e estável.
Terminal
content_copy
PostgreSQL expand_more
connection.cursor ()
Sql
content_copy
1 nomeDaTabela = 'tabelaExemplo'
2 cursor.execute(" insert into %s values (%%s, %%s)" %
Sql
content_copy
1 carros = (
2 (1, 'Celta', 35000),
3 (2, 'Fusca', 30000),
4 (3, 'Fiat Uno', 32000)
5 )
6
7 con = psycopg2.connect(database='BancoExemplo', us
8 password='postgres')
9
10 cursor = con.cursor()
11
12 query = "INSERT INTO cars (id, nome, preco) VALUES
13 cursor.executemany(query, carros)
14
O trecho de código começa com uma lista de três carros, na qual cada
carro possui um código de identificação, um nome e um preço.
Por fim, é executada a rotina “executemany”, sendo que ela recebe uma
query e uma lista de carros que serão inseridos no banco de dados.
cursor.callproc
('NomeDaFunção_Ou_NomeDoProcedimentoArmazenado',
[parâmetros IN e OUT,])
Esta rotina faz chamada para uma função ou um procedimento
armazenado do banco de dados. Os parâmetros IN e OUT
correspondem, respectivamente, aos parâmetros de entrada e
saída da função ou do procedimento armazenado e devem ser
separados por vírgulas.
cursor.rowcount
Este atributo retorna o número total de linhas do banco de dados
que foram modificadas, inseridas ou excluídas pela última
instrução de “execute“.
connection.commit()
Este método confirma a transação atual. É necessário que ele seja
chamado ao final de uma sequência de operações sql, pois, caso
contrário, tudo o que foi feito desde a última chamada até o
“commit” não será visível em outras conexões de banco de dados.
connection.rollback()
Este método reverte quaisquer mudanças no banco de dados
desde a última chamada até o “commit”.
connection.close()
Este método fecha a conexão com o banco de dados. Ele não
chama o “commit” automaticamente. Se a conexão com o banco
de dados for fechada sem chamar o “commit” primeiro, as
alterações serão perdidas.
cursor.fetchone()
Este método busca a próxima linha de um conjunto de resultados
de consulta, retornando uma única sequência, ou nenhuma,
quando não há mais dados disponíveis.
cursor.fetchmany([size = cursor.arraysize])
Esta rotina busca o próximo conjunto de linhas de um resultado de
consulta, retornando uma lista. Uma lista vazia é retornada quando
não há mais linhas disponíveis. O método tenta buscar quantas
linhas forem indicadas pelo parâmetro “size”.
table_rows
Criação de uma tabela
post_add
Inserção de dados
highlight_alt
Seleção de dados
refresh
Atualização de dados
delete_sweep
Exclusão de dados
Criação de tabela
Este primeiro código mostra como criar uma tabela a partir do python. É
uma alternativa em relação a criar a tabela usando o PostgreSQL.
Sql
content_copy
1 import psycopg2
2 conn = psycopg2.connect(database = "postgres", user
3 print("Conexão com o Banco de Dados aberta com suces
4 cur = conn.cursor()
5 cur.execute('''CREATE TABLE Agenda(ID INT PRIMARY KE
6 print("Tabela criada com sucesso!")
7 conn.commit()
8 conn.close()
Conexão com o Banco de Dados feita com Sucesso! Tabela criada com
sucesso!
Sql
content_copy
1 import psycopg2
2 conn = psycopg2.connect(database = " postgres", user
3 print ("Conexão com o Banco de Dados aberta com suce
4 cur=conn.cursor()
5 cur.execute("""INSERT INTO public."AGENDA" ("id", "n
6 conn.commit()
7 print("Inserção realizada com sucesso!"); 8conn.clos
postgres
Perceba que esse nome não é do sistema gerenciador de banco de dados, e
sim um nome que escolhemos. Poderia ser, por exemplo,
“banco_dados_teste”.
E no final do código:
Python
content_copy
1 import psycopg2
2 conn = psycopg2.connect(database = " postgres", user
3 print ("Conexão com o Banco de Dados aberta com suce
4 cur=conn.cursor()
5 cur.execute("""select * from public."AGENDA" where "
6 registro=cur.fetchone()
7 print(registro) 8 conn.commit() 9 print("Seleção rea
8 conn.close()
Python
content_copy
1 import psycopg2
2 conn = psycopg2.connect(database = " postgres", use
3 print ("Conexão com o Banco de Dados aberta com suc
4 cur=conn.cursor()
5 print("Consulta antes da atualização")
6 cur.execute("""select * from public."AGENDA" where
7 registro=cur.fetchone()
8 print(registro)
9 #Atualização de um único registro
10 cur.execute("""Update public."AGENDA" set "telefone
11 conn.commit()
12 print("Registro Atualizado com sucesso! ")
13 cur = conn.cursor()
14 print(" Consulta depois da atualização")
15 cur.execute("""select * from public."AGENDA" where
16 registro=cur.fetchone()
17 print(registro)
18 conn.commit()
19 print("Seleção realizada com sucesso!");
20 conn.close()
Parte 1
Uma consulta antes da atualização que mostra os dados do registro
antes de serem modificados.
Parte 2
A atualização do registro que vai modificar os dados.
Parte 3
Uma consulta depois da atualização do registro que mostra como
ficaram os dados do registro depois de serem atualizados.
Atenção!
A linha 10 é a mais importante deste código. É nela que é executado o
comando “update” do sql, que atualizará o dado do campo “telefone” do
registro, cujo campo “id” contenha o valor “1”.
Por fim, vamos ver o exemplo para excluir um registro de uma tabela.
Python
content_copy
1 import psycopg2
2 conn = psycopg2.connect(database = " postgres", use
3 print ("Conexão com o Banco de Dados aberta com suc
4 cur=conn.cursor()
5 cur.execute("""Delete from public."AGENDA" where "i
6 conn.commit()
7 cont=cur.rowcount
8 print(cont, "Registro excluído com sucesso!")
9 print("Exclusão realizada com sucesso!");
10 conn.close()
Depois de colocar o programa para executar, se tudo funcionar
corretamente, aparecerão as mensagens na tela:
video_library
Protótipo do sistema
Dando continuidade ao desenvolvimento do protótipo do sistema, veja a
modelagem do banco de dados a ser utilizado, criando o banco e
fazendo as inserções/atualizações/remoções necessárias.
Python
content_copy
1 import psycopg2
2 conn = psycopg2.connect(database = "postgres",
3 cursor = conn.cursor()
4 cursor.execute("""lacuna_I INTO public."AGENDA"
5 conn. lacuna_II()
6 print("Inserção realizada com sucesso!");
Questão 2
Existem muitas bibliotecas disponíveis para Python para fazer
interface com sistemas gerenciadores de bancos de dados. Entre
elas, está a “psycopg2”. Essa biblioteca faz interface com o
PostgreSQL, que é um sistema importante para desenvolver
aplicações reais. Nesse sentido, selecione a opção que relaciona B
às APIs do psycopg2 e suas funcionalidades.
Visão geral
Conceitos
Até o dado momento, vimos como criar uma aplicação com
componentes de interface gráfica e como interagir com um banco de
dados.
Atenção!
Comentário
No caso do nosso sistema, vamos criar a tabela Produto, que tem três
campos: “CODIGO”, “NOME” e “PRECO”.
Outra forma de criar uma tabela é mediante o próprio python, com o uso
da biblioteca “psycopg2”.
Seleção de dados.
Inserção de dados.
Exclusão de dados.
Classe principal.
Configuração de componentes.
Entrada de dados.
Este método lê os dados que estão nas caixas de texto e os retorna para
quem faz a chamada.
Por exemplo, na linha 114, a variável “codigo” recebe o valor da caixa de
texto “txtCodigo” depois que ele é convertido para um valor do tipo
“inteiro”.
Este método tem como objetivo fazer a inserção dos dados na tabela
“PRODUTOS”.
Programa principal.
video_library
Finalização da construção do
protótipo
Acompanhe a finalização da construção do protótipo do sistema
utilizando a linguagem python, uma interface GUI e a conexão ao banco
de dados.
Questão 1
Considere o fragmento de código Python abaixo que utiliza a
biblioteca “psycopg2” para fazer CRIAR a tabela PRODUTOv2 no
PostgreSQL:
Python
content_copy
1 import psycopg2
2 lacuna_I
3 conn = psycopg2.connect(database = "postgres",
4 print("Conexão com o Banco de Dados aberta com
5 cur = conn.cursor()
6 cur.execute('''CREATE TABLE PRODUTOv2
7 (CODIGO INT PRIMARY KEY NOT NULL,
8 NOME TEXT NOT NULL,
9 PRECO CHAR(12));''')
10 print("Tabela criada com sucesso!")
11 lacuna_II
12 conn.commit()
13 conn.close()
Questão 2
A if-else
B try-except
C if-elif
D try-catch
E if-else
Considerações finais
No decorrer do texto, apresentamos os principais frameworks e as
bibliotecas para desenvolver aplicações de interface gráfica, exploramos
a biblioteca “tkinter” com exemplos para usar os seus componentes
gráficos e também a biblioteca “psycopg2”, para realizar operações no
PostgreSQL, além de apresentarmos uma aplicação que relaciona
interface gráfica com operações no banco de dados.
headset
Podcast
Ouça agora sobre o processo de desenvolvimento de interfaces gráficas
com a linguagem Python.
Referências
MEIER, B. A. python GUI Programming Cookbook. Birmingham, United
Kingdom: Packt Publishing Ltd., 2015.
Explore +
Para saber mais sobre os assuntos tratados neste tema, pesquise na
internet: