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:

EventoDescriçã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.