Aula 17: Interação com a interface gráfica

Na aula anterior aprendemos sobre como funciona a criação de interfaces gráficas em Python, mas você percebeu que criamos um botão completamente inútil, certo? Você clica e simplesmente nada acontece. Nesta aula veremos como tratar essas interações do usuário com a interface e como levar em conta essa interação ao acionar pinos da sua placa.

Vale lembrar que você precisa executar os programas a seguir na própria Raspberry Pi, via SSH não irá funcionar, pois não existe suporte a interface gráfica.

Tratando eventos

Ao realizar essa tarefa, é necessário utilizar o que foi aprendido com textos e botões na aula passada com o objetivo de aprender a tratar eventos e criar uma interface que faça algo. Primeiramente, vamos alterar a propriedade “command” do botão, que define o que será feito caso o botão seja clicado. Esse clique chamamos de evento.

A fim de exemplificar a aplicação de eventos, faremos um contador de cliques. Terá um botão e um texto, cada vez que que o botão é clicado será ativada a função “clicou” e altera o texto apresentado. Como estamos chegando mais perto de um produto final, o código acaba ficando um pouco mais complexo, mas repare nos comentários que podem te ajudar a entender.

from tkinter import *

janela = Tk()

# Definimos o contador, comecando em 0
contador = 0

# Cada vez que e clicado entra nesta funcao
def clicou():
    # Utilizamos uma variavel nao definida dentro da funcao
    global contador
    # E adicionado 1 ao contador
    contador = contador + 1
    # Modificamos o "text" do texto para apresentar o contador
    texto["text"] = ("Contador: " + str(contador))
    # stt(contador) transforma o numero em texto para ser apresentado


## Os elementos da interface botao e texto
# Em command, passamos a funcao criada para isso
botao = Button(janela, width = 4, text = "+1", command = clicou)
botao.place(x = 250, y = 150)

# O texto, conforme visto antes
texto = Label(janela, text = "Vamos contar", bg = "#B0314C", fg = "#FFFFFF")
texto.place(x = 250, y = 120) # O atributo place para posicionar

#titulo da janela
janela.title("Meu contador")

#cor do fundo da janela "background"
janela["bg"] = "#56A9DE"

janela.geometry("600x300+400+100")

janela.mainloop()

# Apresenta no console a contagem final
print("A contagem acabou em: ", contador)

A principal diferença com relação aos códigos anteriores é que foi definida a função “clicou“, que é citada na criação do botão. Repare que não usamos “()” na hora quando citamos a função.

É importante observar, também, o uso da variável “contador“, que como é uma variável global, precisamos chamá-lo dentro da função e na hora de modificar o texto utilizamos a função “str()” que transforma em texto o valor numérico do contador.

Agora você tem as ferramentas necessárias para utilizar interfaces nos seus projetos e não precisa mais utilizar o console, podemos ver como utilizar interfaces na hora trabalhar com os pinos da Raspberry Pi!

GPIO com a interface gráfica

A fim de ilustrar o uso da GPIO em conjunto com interfaces gráficas vamos criar um botão na interface gráfica que acende ou apaga um LED, como fizemos na Aula 12, só que no lugar de um botão físico, um botão na interface gráfica. Nesta etapa, vamos utilizar o mesmo circuito das outras vezes que fizemos um LED acender. Se você tiver alguma dúvida, basta rever os projetos anteriores.

Ao criar a interface, iremos utilizar uma janela comum, e um botão. A diferença do projeto em relação ao anterior é que iremos acionar um pino do GPIO na função que definimos que será executada no clique do botão. O programa fica assim:

from tkinter import *
import RPi.GPIO as GPIO

janela = Tk()

status = True
GPIO.setmode(GPIO.BOARD)

pinoLED = 12 #vamos utilizar o pino 12 da placa

# Define os pinos dos leds como saida
GPIO.setup(pinoLED, GPIO.OUT)

# Cada vez que clicam o botao, entra nesta funcao
def clicou():
    # Utilizamos uma variavel (status) nao definida dentro da funcao
    global status
    status = not status # Troca o status do LED
    GPIO.output(pinoLED, status) # Aplica no LED o novo status

# Criando o botao 
botao = Button(janela, text = "LED", command = clicou)
botao.place(x = 300, y = 150)

#titulo da janela
janela.title("Mexendo no LED")

#cor do fundo da janela "background"
janela["bg"] = "#56A9DE"

#definimos o tamanho e posicao da tela
janela.geometry("600x300+400+100")

janela.mainloop()

Repare que cada vez que é chamada a função a variável “status” muda o seu valor e é atualizado.

Com isso, cada vez que clicamos no botão na interface, o LED troca o estado.