Interface graphique avec tkinter - key bindings

e - Événements et interactions



key binding: interaction avec le clavier et/ou la souris

Fonctionnement et exemples

On peut lier des événements, provenant de l'utilisateur, et des actions du programme: on parle d'event bindings.
Par exemple, dans le programme suivant, on lie l'appui sur la touche esc, ou Échap, et l'action de fermeture de la fenêtre via la fonction close_gui:
from tkinter import *
gui = Tk()

def close_gui(event):
    gui.quit()

gui.bind('<Escape>',close_gui)

gui.mainloop()

L'exemple suivant est une application de type "paint", ou dessin avec la souris.
On lie cette fois le déplacement de la souris, bouton 1 (ou gauche) enfoncé, qui est l'événement "<B1-motion>" à la fonction paint (voir ci-dessous pour une liste des événements).
On récupère dans cette fonction les coordonnées de cet événement (donc ici du curseur de la souris), via event.x et event.y (voir dans la rubrique Canvas: zone de dessin).
from tkinter import *

def paint(event):
   x1, y1 = ( event.x - 1 ), ( event.y - 1 )
   x2, y2 = ( event.x + 1 ), ( event.y + 1 )
   cnv.create_oval( x1, y1, x2, y2, fill = "black" )

gui = Tk()
cnv = Canvas(gui, width=500, height=200)
cnv.pack()
cnv.bind( "<B1-Motion>", paint )

message = Label( gui, text = "Dessiner avec la souris..." )
message.pack( side = BOTTOM )


gui.mainloop()

Exercice 1: Ajouter un bouton "clear" en bas de la fenêtre précédente et qui permet d'effacer le dessin fait jusque là.

Liste d'événements

<Button-1>
Le bouton 1 est celui de gauche de la souris, le bouton 2 celui du milieu et le 3 celui de droite.
<Button-1>, <ButtonPress-1>, et <1> sont synonymes.
<MouseWheel> désigne la molette de la souris (windows and MacOs semble-t-il, tandis que <Button-4> et <Button-5>, pour scroll up et down sous Linux)
<B1-Motion>
Mouvement de la souris, avec bouton 1 maintenu pressé (B2 pour le botuon du ilieu, ou B3 pour celui de droite)
<ButtonRelease-1>
Bouton 1 a été relaché
<Double-Button-1>
Double click avec le bouton 1.
On peut aussi utiliser Triple comme préfixe, ou les autres boutons.
<Enter>
Le curseur de la souris est entré sur le widget concerné.
<Leave>
Le curseur de la souris est sorti du widget concerné.
<FocusIn>
Le widget a reçu le focus par le clavier (via la touche tab).
<FocusOut>
Le widget a perdu le focus.
<Return>
Touche entrée. Les autres touches usuelles sont, usuellement, Cancel, BackSpace, Tab, Return, Shift_A (touches shift et A), Control_A, Alt_A, Pause, Caps_Lock, Num_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12
a
La touche "a", ou une autre touche, sauf espace: <space> et "moins": <less>.
Remarque: 1 correspond à la touche du clavier, tandis que <1> est le bouton de gauche de la souris.
<Shift-Up>
Simultanément les touches shift et Up (flèche vers le haut).
On peut aussi tuliser les autres préfixes: Alt, Shift, et Control.
<Configure>
Le widget change de taille (size), c'est-à-dire est redimensionné.
<Destroy>
Le widget est détruit.
<Expose>
Cet événement arrive quand au moins une partie de la fenêtre de l'application devient visible après avoir été cachée par une autre fenêtre.
<KeyRelease>
L'utilisateur ralache une touche
<Visibility>
Cet événement arrive auand au moins une partie de l'application devient visible à l'écran.
Voir cette page pour plus de détails. Deux exemples:
  • Déterminer les coordonnées d'un click dans la fenêtre:
    from tkinter import *
    gui = Tk()
    
    def callback(event):
        print("clicked at", event.x, event.y)
    
    gui.bind("<Button-1>", callback)
    
    gui.mainloop()
    
  • déterminer quelle touche a été pressée, et un traitement particulièrement pour les touches up ou down:
    from tkinter import *
    gui = Tk()
    
    def key(event):
        print("pressed",repr(event.char))
    
    gui.bind("<Key>", key)
    
    def up(event): print('up')
    def dn(event): print('down')
    
    gui.bind('', up)
    gui.bind('', dn)
    
    
    gui.mainloop()
    


Top Programmation en python



Quelques liens vers d'autres ressources: