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