Enviar um café pro programador

Mostrando postagens com marcador Curso de Python. Mostrar todas as postagens
Mostrando postagens com marcador Curso de Python. Mostrar todas as postagens

Vídeo Aula 13 - O comando ELSE do teste condicional IF-ELSE

 No tutorial anterior, aprendemos a usar o teste condicional IF em Python. Daremos sequencia nesses estudos de testes para aprender o comando ELSE. Mas, antes, vamos relembrar o teste condicional IF.

Assista no Youtube nossa vídeo aula, e nos ajude dando like e se inscrevendo no canal Programação Progressiva:


O Teste Condicional IF em Python

Ele serve para testar uma condição (uma comparação ou mesmo apenas um valor), e caso o retorno desse teste seja verdadeiro (TRUE), ele executa um bloco específico de código. Caso seja falso (FALSE), ele não executa aquele código dentro do IF.

Por exemplo, o seguinte código pede a idade do usuário e avisa se ele é maior de idade ou não:

idade = int( input("Digite sua idade: " ) ) if (idade>=18): print("Você é maior de idade")

Mas veja que ele só avisa se é de maior. E se for de menor? Bem, aí fazemos outro teste condicional abaixo, testando sempre a condição oposta.

Se antes, testamos se tinha 18 ou mais, agora vamos testar se tem menos de 18:


idade = int( input("Digite sua idade: " ) ) if (idade>=18): print("Você é maior de idade") if (idade<18): print("Você é menor de idade")


E aí que vai entrar o ELSE.

O Teste Condicional ELSE em Python

Programador é preguiçoso, mas no bom sentido.

O resultado de uma comparação só pode ser TRUE ou FALSE, e o IF vai verificar e capturar sempre uma comparação verdadeira.

Então, adivinha: o que o ELSE vai fazer ?
Ele vai rodar um determinado trecho de código, caso o resultado do teste condicional seja FALSO.

Veja bem, ele vai usar o teste condicional do IF, logo, ele não vai precisar testar nada mais além daquilo.

Então, nosso código vai ficar assim:


idade = int( input("Digite sua idade: " ) ) if (idade>=18): print("Você é maior de idade") else: print("Você é menor de idade")


Não esqueça dos dois pontos, nem de alinhar o ELSE com seu IF.

Importante:

Cada else pertence somente a um IF, na qual está alinhado (identado)


Exercício

No exemplo anterior, o IF captura se o usuário tem 18 anos ou mais. Como ficaria o código para o IF filtrar quem é de menor, e deixar a mensagem de maioridade para o ELSE ?


Algoritmo: Verificar se um número é par

Em nossa vídeo-aula sobre operadores matemáticos em Python, vimos que o operador % nos fornece o resto da divisão de um número inteiro positivo por outro, e da escolinha, sabemos que os números pares deixam resto 0.

Então, já podemos criar um script de um algoritmo que pede um número inteiro ao usuário e diz se ele é par ou ímpar:

num = int( input("Digite um inteiro positivo: ") ) if (num%2 == 0): print("Par") else: print("Ímpar")

Curso de Python em vídeo - Aula 07: Operações Matemáticas

 Nesta vídeo aula de nosso curso, apresentamos as principais operações matemáticas em programação Python, bem como seus operadores:

  • Adição ou soma
  • Subtração ou menos
  • Multiplicação
  • Divisão
  • Divisão inteira
  • Resto da divisão
  • Exponenciação

Bem como os operadores usados em computação: + - * / // ** %

Vídeo aula: Como exibir mensagens de texto na tela

 Nesta vídeo aula de nosso Curso Python Progressivo, vamos te apresentar e ensinar a usar a função print(), para exibir mensagens de texto na tela de seu computador.


Como gerar a Sequência de Fibonacci com listas e recursão

 Neste tutorial, vamos aprender como criar um algoritmo que gera uma lista, em Python, com os números da série de Fibonacci:

Exibir a sequência de Fibonacci

Código da Sequência de Fibonacci em Python

Sem mais delongas, vamos ao algoritmo:

  1. def fib(n):
  2.     f0, f1 = 0, 1
  3.     f = [1] * n
  4.     for i in range(1, n):
  5.         f[i] = f0 + f1
  6.         f0, f1 = f1, f[i]
  7.     return f
  8. num = int(input("Quantos termos gerar: "))
  9. print( fib(num) )

Diferente das outras vezes, que usamos o laço while e usando recursão com funções, dessa vez vamos usar listas.

Código comentado da Série de Fibonacci

Na linha 1, definimos a função fib(), que recebe um inteiro n, que é o número de termos que vamos gerar.

Os primeiros termos da série sempre são 0 e 1, armazenados nas variáveis f0 e f1.
E para os próximos termos? Bom, como teremos n termos, vamos criar uma lista f com n termos, isso foi feito na linha 3.

O próximo passo é aplicar nos próximos termos a regra da sequência de Fibonacci:
"Cada termo é a soma dos dois anteriores"

Como ja temos os termos f0 e f1, o próximo termo é a soma destes (linha 5).
Agora temos três termos: f0, f1 e f[i]

Na próxima iteração, o novo valor de f0 será o valor antigo de f1.
O novo valor de f1 será o valor anterior da lista f
E o novo valor da lista? É sempre a soma dos dois anteriores, que são f0 e f1.

  • Benchmarking do algoritmo

Vamos usar os comandos %timeit e %time para analisar o tempo e execução para achar uma lista com os 100 primeiros termos da Série de Fibonacci como nosso algoritmo:

Sequência de Fibonacci em Python

Veja que foram feitos 100.000 (cem mil!) loops, em poucos microssegundos! Ou seja, é um bom código.

Exercício:

Faça o mesmo benchmarking para o código usando apenas o laço while. E depois usando o código que usa apenas recursividade sem as listas.

E aí, qual deu melhor?

Gerenciador de Layout: Pack, Grid e Place

Neste tutorial de programação gráfica em Python, vamos aprender melhor como gerenciar o layout de nossos programas de interface gráfica.

Gerenciadores de Layout

Como já aprendemos a usar botões, caixa de entrada, caixa de diálogo, radio e checkbuttons, bem como tratar diversos eventos, chegou a hora de aprender como organizar melhor esse amontado de widgets!

Você deve ter notado que fomos adicionando botões, labels...e eles foram se encaixando em um canto, em outro...se você é dos que gosta de fuçar, certamente mexeu e viu widgets sumirem, ou ficarem desalinhados, feios etc.

Os gerenciadores de layout servem para definirmos melhor o posicionamento de nossos widgets em containers (janelas Tk() ou Frame() por exemplo), de modo a organizar e deixar eles esteticamente melhores.

Existem três principais gerenciadores de layout:
  1. pack - vai adicionando os widgets na ordem que forem sendo empacotados
  2. grid - adiciona através de posições de linhas e coluna, como uma tabela ou grade (grid)
  3. place - adiciona widgets em posições específicas, com tamanhos específicos

Gerenciador de Layout: pack


O gerenciador pack é o que vinhamos usando, no decorrer de nossos tutoriais de programação gráfica em Python, e é o mais básico.

Por padrão, ele vai adicionando os widgets na ordem quem forem empacotados (chamando o método pack() ), de cima pra baixo.

Porém, existem várias opções para empacotar os componentes:
  • side - indica de que lado você quer que seja adicionado (TOP, BOTTOM, LEFT e RIGHT). Se quer um alinhamento horizontal, use side=LEFT, por exemplo
  • fill - para preencher um espaço. Pode usar como argumneto X, Y ou BOTH, e ele vai cobrir todo o espaçamento horizontal (X), vertical (Y) ou ambos (BOTH)
  • expand - pode passar como YES ou NO, para definir se o widget vai preencher todo o espaço extra do container ou não.
  • padx e pady - preenchem o ao redor do widget com espaço em branco
  • pack_forget - retira um widget empacotado do container que foi inserido anteriormente
Estude o seguinte código, rode o script e veja o resultado você mesmo:

from tkinter import *

class PackDemo( Frame ):
 def __init__(self):
  # Inicializando o frame 
  Frame.__init__(self)
  self.master.title("Gerenciador pack")
  self.master.geometry( "600x250" )
  self.pack( expand = YES, fill = BOTH)
  
  # Botao que adiciona outros, no topo
  self.botao1 = Button(self, text = "Adicionar Botão",
         command = self.adicionarBotao)
  self.botao1.pack(side = TOP)
  
  # Botão 2, no fundo e preenche X e Y
  self.botao2 = Button(self,
           text = "expand = NO, fill = BOTH")
  self.botao2.pack( side = BOTTOM, fill = BOTH )
  
  # Botão3: na esquerda, fill só na horizontal
  self.botao3 = Button( self, text = "expand = YES, fill = X" )
  self.botao3.pack( side = LEFT, expand = YES, fill = X )
  
  # Botão4: na direita, fill só na vertical
  self.botao4 = Button( self, text = "expand = YES, fill = Y" )
  self.botao4.pack( side = RIGHT, expand = YES, fill = Y )
  
  mainloop()
  
 def adicionarBotao( self ):
  Button(self, text = "Botão novo" ).pack(pady = 5)
PackDemo()

Gerenciador de Layout: grid

Como o nome sugere, ele vai dividir o container em uma grade (grid em inglês), assim podemos posicionar os elementos dividino o Frame, por exemplo, em x linhas e y linhas.

Cada posição é chamada de célula, ou seja, cada célular é composta por um valor de linha, um valor de coluna e pode ter um widget

A primeira linha (row) é a 0, a segunda coluna é a de número 1, a terceira é de número 2...
A primeira coluna (column) é a 0, a segunda é a 1, a terceira é a 2...



Definimos a posição de cada widget com o método grid(), que recebe os parâmetros row e column, com a respectiva posição e numeração de cada linha e coluna.

Vamos, por exemplo, cria 9 labels, e exibir eles numa grid três por três, ou seja, 3 linhas e 3 colunas.
O código é o seguinte:

from tkinter import *

class Grid( Frame ):
 def __init__(self):
  # Inicializando o frame 
  Frame.__init__(self)
  self.master.title("Grid")
  self.master.geometry( "80x80" )
  
  # Criando os labels e adicionando
  # com o método grid()
  for linha in range(3):
   for coluna in range(3):
    Label(self.master, text=str(linha)+','+str(coluna)).grid(row=linha,column=coluna)
  
  mainloop()

Grid()

E o resultado:

Curso de Python

Veja, o primeiro label é o da posição 0,1
O segundo, na primeira linha e segunda coluna é 0,1
Na primeira linha e terceira coluna temos o 0,2
E assim vai...tente ver uma 'tabela', uma 'grade' ao usar o grid.

Sempre que quiser dispor seus elementos, alinhados por linhas e colunas, use o grid.
Um exemplo comum de programas que usam, são os que tem algum formulário, veja:

Apostila de Python grátis para download

Veja como fica bem alinhado e bonitinho.
O código pra fazer isso é:

from tkinter import *

class Grid( Frame ):
 def __init__(self):
  # Inicializando o frame 
  Frame.__init__(self)
  self.master.title("Grid")
  
  Label(self.master, text="Nome").grid(row=0)
  Label(self.master, text="Sobrenome").grid(row=1)

  entrada1 = Entry(self.master)
  entrada2 = Entry(self.master)

  entrada1.grid(row=0, column=1)
  entrada2.grid(row=1, column=1)

  mainloop()

Grid()

Note que quando omitimos alguma opção row ou column, é porque o valor padrão é 0.
Para se aprofundar melhor no manager grid, sugerimos pesquisar mais sobre a opção sticky, os métodos rowconfigure e columnconfigure.

Gerenciador de Layout: place

Esse gerenciador não é tão usado, mas é simples de usar, pois basta dizer onde quer inserir cada widget. Pronto.

Porém, isso complica um pouco as coisas.
Note que o pack e o grid faz muita coisa por você, automaticamente, você se estressa com pouca coisa.

O place é mais 'rigoroso', digamos assim, você precisa 'cravar' locais, saber exatamente onde vai cada coisa, até onde, até que altura, até que largura etc. Não vamos nos aprofundar nele.

Para fazer um programa com essa cara:

Curso de Python online grátis


Rode este código Python:

from tkinter import *

class Place( Frame ):
 def __init__(self):
  top = Tk()
  top.title("place")
  top.geometry("250x200")
  
  # Label e primeira entrada
  label1 = Label(top, text = "Nota 1")
  label1.place(x = 10,y = 10)
  entrada1 = Entry(top, bd = 5)
  entrada1.place(x = 60,y = 10)
  
  # Label e segunda entrada
  label2 = Label(top,text = "Nota 2")
  label2.place(x = 10,y = 50)
  entrada2 = Entry(top,bd = 5)
  entrada2.place(x = 60,y = 50)
 
  # Label e terceira entrada
  label3 = Label(top,text = "Média")
  label3.place(x = 10,y = 150)
  entrada3 = Entry(top,bd = 5)
  entrada3.place(x = 60,y = 150)

  # Botão
  botao = Button(top, text = "Calcular")
  botao.place(x = 100, y = 100)

  top.mainloop()
Place()

Tratamento de Eventos envolvendo Teclado e Teclas

Agora que já aprendemos a tratar eventos envolvendo mouse (clicar, soltar e arrastar), vamos ver como fazer o event handling com seu teclado, quando o usuário pressionar alguma tecla.

Eventos de Teclado

Control+C copia, Ctrl+V cola, Alt+F4 fecha a janela etc etc.

Esses são alguns 'atalhos' que conhecemos no dia a dia de quem lida com informática.

Nada mais são que eventos.

O navegador, editor de texto ou qualquer janela que esteja usando, é uma GUI, é uma interface gráfica pro usuário e também responde a eventos, como os de teclado, que vamos estudar agora.


Keyboard Events


  • <KeyPress> ou <Key> - Dispara quando qualquer tecla é pressionada
  • <KeyRelease> - Dispara quando uma tecla é solta ou liberada
  • <KeyPress-tecla> ou <Key-tecla> - Quando uma tecla específica, a tecla, é pressionada
  • <KeyRelease-tecla> - Quando a tecla específica é solta ou liberada
  • <key> - Abreviação ou atalho, faz o mesmo de <KeyPress-tecla>
  • <prefixo-tecla> - Dispara quando você aperta a tecla específica tecla enquanto segura a prefixo. Esse prefixo pode ser Alt, Shift ou Control apenas.


Saber quando uma tecla foi pressionada ou não em Python

Detectar qual tecla foi pressionada

Vamos colocar esses eventos em prática?
Vamos criar um programa que aguarda o usuário digitar alguma tecla, e exibe na tela qual foi pressionada e quando foi liberada.

Vamos criar a classe KeyboardEvent, que é do tipo Frame.
Inicializamos sua classe master, empacotamos, damos um título e definimos um tamanho.

Depois, vamos criar o objeto mensagem, do tipo StringVar(), que vai ter uma string dentro dela que vai ficar mudando, conforme você pressiona e solta as teclas.



Passamos esse objeto como argumento do parâmetro textvariable, de nossa Label label.
Inicialmente, o texto em mensagem é "Aperte uma tecla", é o que vai aparecer no início. Empacotamos o label.

Agora vamos fazer os binds, associar os eventos ao métodos.
Se apertar qualquer tecla, o evento <KeyPress> chama o método teclaPressionada, que seta a mensagem com uma string mostrando a tecla pressionada, que é armazenada no atributo event.char

O mesmo para <KeyRelease>, que chama o método teclaLiberada quando você solta a tecla.

Para detectarmos teclas como Control, Alt e Shift, temos que usar events específicos.
Por exemplo, para detectar a tecla Alt da esquerda (Left, L), usamos: <KeyPress-Alt_L> e para detectar quando ela foi liberada, usamos <KeyRelease-Alt_L>

Veja como ficou nosso código Python:

from tkinter import *

class KeyboardEvent(Frame):
 def __init__(self):
  Frame.__init__(self)
  self.pack(expand=YES, fill=BOTH)
  self.master.title("Eventos de teclado")
  self.master.geometry("250x50")

  # Label e Stringvar que vao exibir a tecla
  self.mensagem = StringVar()
  self.label = Label(self, textvariable = self.mensagem)
  self.mensagem.set("Aperte uma tecla" )
  self.label.pack()
  
  # Fazendo os binding no frame
  self.master.bind( "<KeyPress>", self.teclaPressionada )
  self.master.bind( "<KeyRelease>", self.teclaLiberada )
  self.master.bind( "<KeyPress-Alt_L>", self.altPressionado )
  self.master.bind( "<KeyRelease-Alt_L>", self.altLiberado )
  
  mainloop()
  
 def teclaPressionada( self, event ):
  self.mensagem.set( "Tecla pressionada: " + event.char )
 def teclaLiberada( self, event ):
  self.mensagem.set( "Tecla solta: " + event.char )
 def altPressionado( self, event ):
  self.mensagem.set( "Alt pressionado" )
 def altLiberado( self, event ):
  self.mensagem.set( "Alt liberado" )

# Chamando a classe
KeyboardEvent()

O evento < Return > : Apertando Enter

Neste tutorial, vamos aprender como lidar e tratar o evento de pressionar a tecla enter do teclado, através do <Return> event.

Através de um programinha simples, vamos entender o que ocorre por trás dos panos quando você digita a tecla enter do seu teclado e algo acontece em um programa.



<Return> event - Pressionar tecla enter

Sem mais delongas, vamos criar a seguinte aplicação:

Evento de dar enter

Na janelinha principal, exibimos um widget do tipo Entry de entrada de dados.
Você digita algo e dá enter.


Ao fazer isso, vai abrir uma nova janela, com o nome do widget e o conteúdo que está dentro dele.
Vamos te mostrar o código, e logo abaixo, a explicação:

from tkinter import *
from tkinter import messagebox

class EntryTeste( Frame ):
 def __init__( self ):
  # Inicializando configurações do frame
  Frame.__init__(self)
  self.pack()
  self.master.title( "<Return> teste" )
  self.master.geometry( "300x50" )
  self.frame = Frame( self )
  self.frame.pack( pady = 5 )
  
  # Criando a caixa de entrada
  self.caixa = Entry( self.frame, name = "caixa1" )
  
  # Fazendo o bind dela com o event handler exibe() 
  self.caixa.bind( "<Return>", self.exibe )
  self.caixa.pack( side = LEFT, padx = 5 )
  
  # Looping pra rodar a GUI
  self.mainloop()
  
 # Event handler
 def exibe(self, event):
  nomeCaixa = event.widget.winfo_name()
  conteudoCaixa = event.widget.get()
  messagebox.showinfo( "Texto na caixa", "Nome do widget: " + nomeCaixa + "\nConteúdo: " + conteudoCaixa )
  
# Criando um objeto
minhaGui = EntryTeste()

A classe onde toda mágica vai acontecer se chama EntryTeste() e ela herda a classe Frame.
Ou seja, ela é um frame também, ela vai ser a janela principal.

Iniciamos o método construtor chamando o construtor da classe base, e em seguida se empacotando.
Com o método master.title(string) definimos o título da janelinha que vai abrir.
Com o método master.geometry("largura x comprimento") definimos o tamanho do frame.

Depois, criamos o frame frame1 que vai ser o container da caixa de entrada, e empacotamos ele com o espaçamento vertical (pad y) de 5 pixels.


Vamos criar a caixa de entrada, objeto de nome caixa do tipo Entry, vamos dar o nome de caixa1 pra esse widget.

Agora vem a parte mais importante, o bind.
Vamos ligar o evento <Return>, que representa o ato de apertar o enter com o event handler de nome exibe, que é um método que será chamado sempre que você der enter.

Esse método recebe o objeto event.
Vamos extrair algumas informações interessantes desse objeto.

Vamos usar: event.widget.winfo_name() pra pegar o nome do widget
E também: event.widget.get() pra pegar o conteúdo que foi digitado na caixa de entrada.

Em seguida, esse método, que é nosso event handler (tratador de eventos), vai exibir uma caixa de diálogo com essas duas informações: nome do widget e conteúdo que você escreveu nele, antes de dar enter.
Conseguiram entender?

Quebrando a cabeça

Não tenha vergonha de ter que ler, reler, quebrar a cabeça, mexer uma coisa aqui, alterar outra ali.
Faz parte do aprendizado.

Rode o código a seguir, e tente entender linha por linha o que está acontecendo.
Se tiver dúvida de algo, não existe em pesquisar no Google, todo programador faz isso, sempre, pro resto da vida, mesmo os melhores do mundo.


from tkinter import *
from tkinter import messagebox

class EntryTeste( Frame ):
 def __init__( self ):
  # Inicializando os frames, títulos e tamanhos
  Frame.__init__( self )
  self.pack( expand = YES, fill = BOTH )
  self.master.title( "Componentes de entrada" )
  self.master.geometry( "325x100" ) # width x length
  
  # Criando o primeiro frame que vai armazenar
  # as duas primeiras caixas de entrada
  self.frame1 = Frame( self )
  self.frame1.pack( pady = 5 )
  
  # Criando a primeira caixa de entrada
  self.text1 = Entry( self.frame1, name = "caixa1" )
  
  # Associando o evento <Return> com o
  # event handler exibe()
  self.text1.bind( "<Return>", self.exibe )
  self.text1.pack( side = LEFT, padx = 5 )
  
  # Criando a segunda caixa e seu bind
  self.text2 = Entry( self.frame1, name = "caixa2" )
  self.text2.insert( INSERT, "Digite um texto aqui" )
  self.text2.bind( "<Return>", self.exibe )
  self.text2.pack( side = LEFT, padx = 5 )
  
  # Segundo frame, com as duas outras caixas
  self.frame2 = Frame( self )
  self.frame2.pack( pady = 5 )
  
  # Criando a caixa que não dá pra editar
  self.text3 = Entry( self.frame2, name = "caixa3" )
  self.text3.insert( INSERT, "Texto ineditável" )
  self.text3.config( state = DISABLED )
  self.text3.bind( "<Return>", self.exibe )
  self.text3.pack( side = LEFT, padx = 5 )
  
  # Criando a caixa estilo senha
  self.text4 = Entry( self.frame2, name = "caixa4", show = "*" )
  self.text4.insert( INSERT, "Texto escondido" )
  self.text4.bind( "<Return>", self.exibe )
  self.text4.pack( side = LEFT, padx = 5 )
  
  mainloop()
 
 def exibe( self, event ):
  # Pegando o nome do widget
  nomeCaixa = event.widget.winfo_name()
  # Pegando o conteúdo do widget
  conteudoCaixa = event.widget.get()
  messagebox.showinfo( "Texto na caixa", nomeCaixa + ": " + conteudoCaixa )
  
# Chamando a classe
EntryTeste()


Tratamento de Eventos: Método bind() e Classe Event (Event Handling Model)

Neste tutorial de GUI, vamos aprender o que são eventos, para que servem, como funcionam bem como fazer seu tratamento (event handling) em programação gráfica no Python.

Acessar conteúdo em PDF: Apostila de Python

Tratamento de Eventos - Event Handling

Dizemos que a programação gráfica é event driven, ou seja, acionada por eventos.

Esses eventos nada mais são que algum tipo de interação da GUI com o usuário, como digitar algum texto, clicar no mouse, fechar uma janela, maximizar, selecionar algum radiobutton etc.

Os programas em GUI são ditos assíncronos, pois eles rodam e ficam lá parados, esperando o usuário fazer algo, diferente de um script puramente textual, que segue uma ordem mais direta e clara.

Em GUI, algo só acontece se você fizer algo acontecer.
E quando você faz algo, algum evento, uma informação, um evento é enviado pro programa, através de um objeto da classe Event.

Para processar ou tratar um evento, precisamos de duas coisas:
bind: o programa tem que ligar, vincular (bind em inglês) um evento a um componente gráfico, um widget
event handler (ou callback): temos que implementar um 'tratador' de eventos

Ou seja, temos que fazer uma ligação de um evento com um componente, por exemplo, clicar num botão, e criar uma maneira de processar esse evento: quando clicar no botão, abra outra janela, por exemplo.

Em outra palavras, o eventi handler nada mais é que um bom e velho conhecido método que é sempre invocado quando um evento ocorre.

Exemplo de Event Handling: bind() e <Button-1>

Para fazermos uma bind num widget, usamos o método bind():

  • widget.bind( evento , tratador_do_evento )

Um exemplo de evento é o "<Button-1>"
Ele fica 'de olho' se o primeiro botão do mouse (o mais da esquerda) é pressionado.

Vamos dar um exemplo com o widget do tipo Frame.
Criamos uma janela principal, que é um objeto da classe Tk()
Em seguida, criamos um frame nessa janela principal, de tamanho 100x100

E associamos ao widget meuframe o bind:
meuframe.bind("<Button-1>", tratador_evento)

Pronto. Sempre que alguém clicar no widget o evento <Button-1> ocorre e chamamos o método tratador_evento, enviando pra ele um objeto event.

Este método simplesmente printa no terminal de comando o local que foi printado. Essa informação está nos atributos event.x (posição horizontal) e event.y (posição vertical).



Teste o código:

from tkinter import *

# É o event handler
def tratador_evento(event):
    print("Você clicou na posição:", event.x, event.y)

janela_principal = Tk()
meuframe = Frame(janela_principal, width=100, height=100)
meuframe.bind("<Button-1>", tratador_evento)
meuframe.pack()

janela_principal.mainloop()

O resultado vai ser algo assim:

Event handling em Python



  1. <Button-1> se refere ao botão mais a esquerda do mouse.
  2. <Button-2> se refere ao botão do meio, quando existe.
  3. <Button-3> é o evento que se refere ao botão mais a direita.


Experimente clicar com o botão mais a direita e veja que nada ocorre.
Troque <Button-1> por <Button-3> e tente novamente.

É como se seu programa GUI ficasse o tempo todo perguntando:
Evento ocorreu? Não? Ok
Evento ocorreu? Não? Tá bom
Evento ocorreu? Não? Tudo certo
....
Evento ocorreu? Sim? Qual? Ah, o <Button-3>, ok, então chama o método tratador_evento, ele que vai tratar ele.
...
Evento ocorreu? Não? ...

O Python fica na espreita, aguardando algum evento ocorrer. Se ocorrer, ele identifica qual foi e chama o handler correspondente.

E o que é esse handler? E o que ele faz?
Simples: o que você quiser, o que você decide, é você quem manda nessa bagaça toda. Vamos aprender um pouco mais como tratar alguns eventos.

Botão de Checagem - A classe Checkbutton

Neste tutorial de GUI em Python, vamos estudar o widget de Checkbutton, os famosos botões de checagem, tipo on/off, de marcado ou não marcado:

Check Button em Python

Checkbutton em Python

Se você entendeu bem o conceito e uso dos botões de rádio (radiobutton), vai facilmente entender os checkbuttons.

Assim como os botões de rádio, os de check podem ser selecionados e deselecionado (espero que essa palavra exista). A diferença é que num mesmo grupo de botões de rádio, você pode deixar apenas um selecionado.

Já nos botões de check, você pode selecionar quantos quiser, até mesmo todos ou nenhum.
Para trabalharmos com botões de check, usamos a classe Checkbutton, do módulo tkinter também.

A grande diferença, na hora de programar, é que vamos usar um objeto da classe IntVar para cada botão de checagem. Nos botões de rádio, usávamos apenas um objeto IntVar para o grupo de botões, pois apenas um dele seria marcado...já nos de check, todos podem ser marcados, por isso cada botão tem seu IntVar.

Como usar Checkbutton em uma GUI em Python

Mas vamos deixar de papo teórico e partir para a prática.
Vamos criar um programinha com a seguinte cara:

Como usar botão de checagem em Python
Teremos dois frames:

  • frame_cima: o label 'Que tipo de música você gosta' e os 4 botões de check
  • frame_baixo: os dois botões


Criamos 4 objetos do tipo IntVar: checkvar1, checkvar2, ..., checkvar4, um para cada checkbutton.
Depois colocamos o valor 0 como argumento do método set da classe IntVar, para dizer que queremos que os check buttons iniciem zerados (sem estarem marcados).

Depois, vamos criar nossos widgets. Primeiro o label.
Depois, os 4 checkbuttons, através da classe Checkbutton, que recebe primeiro o container que vamos adicionar os botões (frame_cima), depois o texto que vai ao lado do check e o parâmetro variable, onde passamos o objeto do tipo IntVar responsável por lidar com o valor assinalado (0 para desmarcado ou 1 para marcado).

Empacotamos o label e os checkbuttons (usamos anchor='w' para alinhar a esquerda, west).
Depois criamos os botões Exibe e o Sair, onde o Exibe chama o método exibe().

Empacotamos os botões, depois os frames.
Agora vamos para o método exibe().

Ele vai exibir uma caixa de diálogo com uma string começada com 'Você curte: ' e vai adicionando 'MPB', 'Música clássica' e ou 'Metal' de acordo com o que for assinalado.

>
Exceto se você curtir Funk, se marcar essa opção vai aparecer a string 'Tá de sacanagem né?'

Para sabermos o valor que está nos objetos da IntVar, basta acessar o método get().
Se estiver assinalado, ele retorna 1. Se não estiver, retorna 0.

Veja como ficou o código de nosso programinha:

from tkinter import *
from tkinter import messagebox

class MinhaGUI:
 def __init__(self):
  # Cria janela principal
  self.janela_principal = Tk()
  
  # Cria dois frames
  self.frame_cima = Frame(self.janela_principal)
  self.frame_baixo = Frame(self.janela_principal)
  
  # Objetos IntVar dos botões
  self.checkvar1 = IntVar()
  self.checkvar2 = IntVar()
  self.checkvar3 = IntVar()
  self.checkvar4 = IntVar()
  
  # Setando valor 0 para aparecem desmarcados
  self.checkvar1.set(0)
  self.checkvar2.set(0)
  self.checkvar3.set(0)
  self.checkvar4.set(0)
  
  # Criando os check buttons e o label
  self.label = Label(self.frame_cima, text='Que tipo de música você gosta: ')
  self.checkbutton1 = Checkbutton(self.frame_cima, text='MPB', \
       variable = self.checkvar1)
  self.checkbutton2 = Checkbutton(self.frame_cima, text='Música clássica', \
       variable = self.checkvar2)
  self.checkbutton3 = Checkbutton(self.frame_cima, text='Metal', \
       variable = self.checkvar3)
  self.checkbutton4 = Checkbutton(self.frame_cima, text='Funk', \
       variable = self.checkvar4)
  
  # Empacotando o label e os check buttons
  self.label.pack(anchor = 'w')
  self.checkbutton1.pack(anchor = 'w')
  self.checkbutton2.pack(anchor = 'w')
  self.checkbutton3.pack(anchor = 'w')
  self.checkbutton4.pack(anchor = 'w')
  
  # Criando os botões
  self.botao = Button(self.frame_baixo, text='Exibe',command=self.exibe)
  self.botao_sair = Button(self.frame_baixo, text='Sair',command=self.janela_principal.quit)
            
  # Empacotando os botões
  self.botao.pack(side='left')
  self.botao_sair.pack(side='left')
  
  # Empacotando os frames na janela principal
  self.frame_cima.pack()
  self.frame_baixo.pack()
  
  # Rodando
  mainloop()
  
 def exibe(self):
   self.texto = 'Você curte: \n'
   if self.checkvar1.get() == 1:
    self.texto += 'MPB\n'
   if self.checkvar2.get() == 1:
    self.texto += 'Música clássica\n'
   if self.checkvar3.get() == 1:
    self.texto += 'Metal\n'
   if self.checkvar4.get() == 1:
    self.texto = 'Tá de sacanagem né?'
   messagebox.showinfo('Seu gosto musical:', self.texto)

  
gui = MinhaGUI()

Quando usar Radiobutton ou Checkbuton

Você deve usar radiobutton quando quiser que o usuário selecione uma, e posso selecionar apenas uma, opção. Por exemplo:
Quando usar checkbutton

Não tem como você ter menos de 18 e entre 18 até 65 ao mesmo tempo. Nem tem como ter de 18 até 65 e mais de 65 ao mesmo tempo. Nesse caso, use sempre botões de rádio.

Agora se o usuário puder escolher mais de uma opção, como gosto musical, aí sim use checkbutton.