Enviar um café pro programador

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()

Um comentário:

  1. Com o Tkinter funciona muito bem... estou com problemas com o PyQt5, quando tento interceptar a tecla Escape e o fechamento da janela quando o teclado o X vermelho... obrigado pela dica.

    ResponderExcluir