Tratamento de eventos
Uma aplicação em Tkinter recebe eventos de várias origens: teclado, rato, despoletados por acções do utilizador mas também eventos eventos internos como o redesenho de uma janela. Tratar um evento significa capturar o momento em que um determinado evento ocorre e despoletar a execução de uma função que faz algo quando isso acontece.
Tipos de eventos
Os tipos de eventos mais comuns são os seguintes:
Evento | Descrição |
---|---|
<Button-1> | Botão esquerdo do rato foi pressionado sobre o componente. <Button-1>: botão esquerdo do rato<Button-2>: botão central do rato<Button-3>: botão direito do rato<ButtonPress-1> e <1> são a mesma coisa que <Button-1> |
Botão esquerdo do rato foi libertado. <ButtonRelease-1>: botão esquerdo do rato<ButtonRelease-2>: botão central do rato<ButtonRelease-3>: botão direito do rato | |
Botão esquerdo do rato foi duplamente clicado sobre o componente.Nota: para obter um triplo clique do rato deve-se usar o prefixo triple <Double-Button-1>: botão esquerdo do rato<Double-Button-2>: botão central do rato<Double-Button-3>: botão direito do rato | |
<B1-Motion> | Movimento do rato com o botão esquerdo pressionado. <B1-Motion>: botão esquerdo do rato<B2-Motion>: botão central do rato<B3-Motion>: botão direito do rato |
<Enter> | O apontador do rato acabou de entrar no componente. |
<Leave> | O apontador do rato acabou de sair do componente. |
<FocusIn> | O componente ou um dos seus filhos obteve o foco do teclado. |
<FocusOut> | O componente acabou de perder o foco do teclado. |
<Return> | A tecla Return foi pressionada. |
Ligação de eventos
Muitas vezes queremos que a aplicação faça algo específico de cada vez que um determinado evento ocorre, normalmente através da execução de uma função. A isso chamamos tratar o evento. A função é a função tratadora do evento.
Para que uma função trate um determinado evento, temos de ligar essa função a esse evento.
O Tkinter possui 3 métodos que permitem fazer essa ligação. São os métodos .bind(), .bind_class() e .bind_all().
A – Ligação ao nível de uma instância de um componente: método .bind()
Permite ligar um evento a um componente específico:
canvas = Canvas(window)
canvas.bind('<Button-1>', desenhaLinha)
O exemplo acima faz com que ao clicar no botão do rato, no componente canvas, a função desenhaLinha() seja chamada.
B – Ligação ao nível de uma classe de componentes: método .bind_class()
Permite ligar um evento a uma classe de componentes específicos:
window.bind_class('Canvas', '<Button-1>', desenhaLinha)
O exemplo acima faz com que ao clicar no botão do rato, em todos os componentes da classe Canvas presentes, a função desenhaLinha() seja chamada.
C – Ligação ao nível da aplicação: método .bind_all()
Permite ligar um evento ao nível da aplicação, independentemente do componente que tenha o foco:
window.bind_all('<Key-Escape>', clear)
O exemplo acima faz com que ao clicar na tecla ESC, independentemente do componente que tenha o foco, a a função clear() seja chamada.