Enviar um café pro programador

Tratamento de Eventos com Mouse

Neste tutorial, vamos criar um programa para usar, ao mesmo tempo, 5 tratamento de eventos envolvendo mouse, como clicar, soltar e arrastar.

Event Handler com mouse em programação gráfica em Python

Eventos com Mouse: <ButtonRelease-1><B1-Motion>

Vamos te mostrar como criar um programa que detecta se o mouse está dentro da janela, se está fora, se você clicou em algum ponto, soltou e arrastou, bem como mostra as coordenadas em pixels desses eventos.

Para isso, vamos usar 5 eventos:
  1. <Button-1> - Botão 1 do mouse (mais a esquerda) é pressionado
  2. <ButtonRelease-1> - Botão 1 é liberado (released)
  3. <Enter> - Mouse entrou no frame (janela)
  4. <Leave> - Mouse deixou o frame da janela
  5. <B1-Motion> - Botão 1 do mouse foi arrastado (clicar e segurar)

Desses cinco, dois são novos: o <ButtonRelease-1> e o <B1-Motion>, mas bem fáceis de entender com a explicação do programa, a seguir.

Vamos lá, inicialmente criamos nossa classe MouseEvent, que herda a Frame, logo é um frame.
Inicializamos a classe master (Frame.__init__), depois empacotamos o frame, definimos um título e seu tamanho.

Depois, vamos criar o objeto StringVar(), que vai ser um label que dinâmico, que vai ficar variando e mudando de valor (alterando seu texto). Inicialmente, definimos o texto "Mouse fora da janela" para ele.

Depois, criamos nosso Label, com o parâmetro textvariable recebendo o objeto StringVar.

Agora vamos fazer os binds.
O primeiro, <Button-1>, chama o método botaoPressionado, que recebe o evento do clique e mostra sua posição através dos atributos event.x e event.y, no label.

O segundo bind é com o evento <ButtonRelease-1>, que chama o método botaoLiberado que faz o mesmo do método anterior, mas mostra onde você soltou o botão do mouse.

Depois vem o <Enter> e o <Leave>, eventos que já estudamos, que identificam se o mouse entrou ou saiu do widget em questão, no caso, o frame.


Por fim, o bind com o evento <B1-Motion>, que vai identificar até onde o mouse estará sendo arrastado (clicar, segura e se mover).

Veja como ficou nosso código Python:


from tkinter import *

class MouseEvent( Frame ):
 def __init__( self ):
  # Criando o frame, título e tamanho
  Frame.__init__( self )
  self.pack( expand = YES, fill = BOTH )
  self.master.title( "Eventos com Mouse" )
  self.master.geometry( "300x200" )
  
  # String com a posição do mouse
  self.mousePosicao = StringVar()
  self.mousePosicao.set( "Mouse fora da janela" )
  
  # Criando e posicionando o label embaixo
  self.positionLabel = Label( self,textvariable = self.mousePosicao )
  self.positionLabel.pack( side = BOTTOM )
  
  # Criando os binds com os eventos de mouse
  self.bind( "<Button-1>", self.botaoPressionado )
  self.bind( "<ButtonRelease-1>", self.botaoLiberado )
  self.bind( "<Enter>", self.entrouJanela )
  self.bind( "<Leave>", self.saiuJanela )
  self.bind( "<B1-Motion>", self.mouseArrastado )
  
  mainloop()
  
 def botaoPressionado( self, event ):
  self.mousePosicao.set( "Pressionado em [ " + str( event.x ) +
        ", " + str( event.y ) + " ]" )
 def botaoLiberado( self, event ):
  self.mousePosicao.set( "Solto em [ " + str( event.x ) +
        ", " + str( event.y ) + " ]" )
 def entrouJanela( self, event ):
  self.mousePosicao.set( "Mouse na janela )
 def saiuJanela( self, event ):
  self.mousePosicao.set( "Mouse fora da janela" )
 def mouseArrastado( self, event ):
  self.mousePosicao.set( "Arrastado até [ " + str( event.x ) +
        ", " + str( event.y ) + " ]" )
  
# Chamando a classe
MouseEvent()

Nenhum comentário:

Postar um comentário