Gestion de la souris

.

EVENEMENT

.

On peut surveiller différents évènements selon les objets, la syntaxe est identique à tous les objets :

widget.bind(evenement,fonction)

widget peut être la fenêtre principale.

evenement est une chaîne de caractère, par exemple pour le clavier,

evenement= « <Key> » ou « <Shift> ».

fonction doit être est le nom de la fonction qui s’exécute lorsque l’évènement se déclenche, elle doit être déclarée en demandant un paramètre en entrée :

def fonction (event) :

.

NOM DES TOUCHES

.

Nom Description
« <Activate> » Un widget est passé de l’état inactif à l’état actif. Se rapporte au changement de l’option state des widgets comme un bouton qui est inactif (grisé) et devient actif.
« <Button> » L’utilisateur a appuyé sur l’un des boutons de la souris. La partie détail précise le bouton. Pour la molette de la souris sous Linux, votre gestionnaire distinguera le défilement vers le haut et le défilement vers le bas en examinant l’attribut .num de l’instance d’événement qui lui est fourni
« <ButtonRelease> » L’utilisateur relâche un bouton de la souris. C’est probablement un meilleur choix dans la plupart des cas d’utiliser ce type d’événement plutôt que Button parce que si l’utilisateur appuie accidentellement sur le bouton, il peut bouger la souris en-dehors du widget pour éviter de lancer l’action.
Configure L’utilisateur a modifié la taille d’un widget, par exemple en déplaçant un coin ou un côté de la fenêtre.
« <Enter> » L’utilisateur a bougé la souris qui est entrée dans la partie visible d’un widget. (Ne pas confondre avec la touche Entrée, qui est un événement de type KeyPress pour une touche dont le nom est “Return”).
« <KeyPress> » L’utilisateur a appuyé sur une touche du clavier. La partie détail précise optionnellement une touche en particulier. Ce mot clé peut être abrégé par  »<Key> ».
« <KeyRelease> » L’utilisateur a relâché une touche du clavier.
« <Leave> » L’utilisateur a déplacé le pointeur de la souris en dehors d’un widget.
« <Motion> » L’utilisateur a déplacé la souris à l’intérieur d’un widget.
« <MouseWheel> » L’utilisateur a tourné la molette de la souris, vers le haut ou vers le bas. Pour l’instant, cela n’est pris en compte que par Windows

.

NOM DES EVENEMENTS

.

évènement Déclenché lorsque
_images/image223.png La souris est déplacée.
_images/image224.png Le bouton gauche est enfoncé. \(\mathbf{(\ }\mathbf{2}\mathbf{\ }\): bouton du milieu, \(\mathbf{3}\mathbf{\ }\): bouton droit)
_images/image225.png Le bouton gauche est relâché. \(\mathbf{(\ }\mathbf{2}\mathbf{\ }\): bouton du milieu, \(\mathbf{3}\mathbf{\ }\): bouton droit)
_images/image226.png Double-clic avec le bouton gauche. \(\mathbf{(\ }\mathbf{2}\mathbf{\ }\): bouton du milieu, \(\mathbf{3}\mathbf{\ }\): bouton droit)
_images/image227.png La souris est déplacée alors que le bouton gauche est maintenu enfoncé
_images/image228.png La souris entre sur le widget.
_images/image229.png La souris sort du widget.

.

DETECTION

.

Utilisation des commandes de la souris :

Détection d’un clic de souris :

1201 détection d’un clic de souris.py

# 0801 detection d'un clic de souris.py

# Détection et positionnement d'un clic de souris dans une fenetre :

from tkinter import *

def clic(event,can):

    x,y=event.x,event.y

    can.create_text(x,y,text= "Clic détecté en\n (X ,Y)= ("+str(x)+";"+str(y)+")")

fenetre = Tk()

fenetre.configure(bg='light green')

fenetre.title("detection d'un clic de souris")

fenetre.geometry("400x150")

can=Canvas(fenetre,width=400,height=150,bg='light green')

can.grid(row=0,column=0)

can.bind("<Button-1>",lambda event: clic(event,can))

fenetre.mainloop()

_images/image231.png

.

DEPLACEMENT

.

Déplacer des objets à l’aide de la souris :

Nous allons voir maintenant comment déplacer des objets à l’aide de la souris.

Vidéo :

video mp4 by EasyHtml5Video.com v3.9.1

.

Progamme

#fenetre.py

#module de construction de fenetres

from tkinter import *

def creer_fenetre(fenetre,taille,titre,couleur):

       #modifie une fenêtre#

       fenetre.title(titre)

       fenetre.geometry(taille)

       fenetre.configure(bg=couleur)

       fenetre.resizable(height=False,width=False)

       return fenetre

def nettoie_fenetre(fenetre,can,liste_widgets):

       can.delete(ALL)      

       for w in liste_widgets:w.destroy()

       return fenetre,can          

def geoliste(g):

       r=[i for i in range(0,len(g)) if not g[i].isdigit()]

       return [int(g[0:r[0]]),int(g[r[0]+1:r[1]]),int(g[r[1]+1:r[2]]),int(g[r[2]+1:])]

# exemple d'utilisation:

couleurs = ['snow', 'ghost white', 'white smoke', 'gainsboro', 'floral white',

         'old lace', 'linen', 'antique white', 'papaya whip',

         'blanched almond', 'bisque', 'peach puff', 'navajo white',

         'moccasin', 'cornsilk', 'ivory', 'lemon chiffon', 'seashell',

         'honeydew', 'mint cream', 'azure', 'alice blue', 'lavender',

         'lavender blush', 'misty rose', 'white', 'black', 'dark slate gray',

         'dark slate grey', 'dim gray', 'dim grey', 'slate gray',

         'slate grey', 'light slate gray', 'light slate grey', 'gray',

         'grey', 'light grey', 'light gray', 'midnight blue', 'navy',

         'navy blue', 'cornflower blue', 'dark slate blue', 'slate blue',

         'medium slate blue', 'light slate blue', 'medium blue',

         'royal blue', 'blue', 'dodger blue', 'deep sky blue', 'sky blue',

         'light sky blue', 'steel blue', 'light steel blue', 'light blue',

         'powder blue', 'pale turquoise', 'dark turquoise',

         'medium turquoise', 'turquoise', 'cyan', 'light cyan', 'cadet blue',

         'medium aquamarine', 'aquamarine', 'dark green', 'dark olive green',

         'dark sea green', 'sea green', 'medium sea green',

         'light sea green', 'pale green', 'spring green', 'lawn green',

         'green', 'chartreuse', 'medium spring green', 'green yellow',

         'lime green', 'yellow green', 'forest green', 'olive drab',

         'dark khaki', 'khaki', 'pale goldenrod', 'light goldenrod yellow',

         'light yellow', 'yellow', 'gold', 'light goldenrod', 'goldenrod',

         'dark goldenrod', 'rosy brown', 'indian red', 'saddle brown',

         'sienna', 'peru', 'burlywood', 'beige', 'wheat', 'sandy brown',

         'tan', 'chocolate', 'firebrick', 'brown', 'dark salmon', 'salmon',

         'light salmon', 'orange', 'dark orange', 'coral', 'light coral',

         'tomato', 'orange red', 'white', 'hot pink', 'deep pink', 'pink',

         'light pink', 'pale violet red', 'maroon', 'medium violet red',

         'violet red', 'magenta', 'violet', 'plum', 'orchid',

         'medium orchid', 'dark orchid', 'dark violet', 'blue violet',

         'purple', 'medium purple', 'thistle', 'dark grey', 'dark gray',

         'dark blue', 'dark cyan', 'dark magenta', 'dark red', 'light green']

        

#1202 bouger_dessins.py

from random import randrange

from tkinter import *

from fenetre import*

def souris_clic(event,can):

    #Met en avant l'objet sélectionné

    x1=event.x

    y1=event.y

    objet=can.find_closest(x1,y1)

    can.itemconfig(objet,width=5)

    can.lift(objet)

    can.bind("<Button1-Motion>",lambda event :souris_deplace(event,x1,y1,can,objet))     

def souris_deplace(event,x1,y1,can,objet):

       #Effectue le déplacement des objets

       x2=event.x

       y2=event.y

       dx,dy=x2-x1,y2-y1

       x1,y1=x2,y2

       can.coords(objet,x2,y2,x2+40,y2+40)

       x1,y1=x2,y2

       can.bind("<Button1-ButtonRelease>",lambda event:souris_releve(event,x2,y2,can,objet))  

def souris_releve(event,x2,y2,can,objet):

       #Remet l'objet dans sa configuration initiale

       can.itemconfig(objet,width=1)

       can.coords(objet,x2,y2,x2+30,y2+30)

       can.bind("<B1-Motion>", lambda event:souris_clic(event,can))

#------La liste couleurs est dans le module fenetre.py  ------#

nbrecouleurs=len(couleurs)  

#--------------       programme principal    ------------------#

fenetre=Tk()

titre="Déplacement d'un objet par la souris "

couleur='white'

largeur,hauteur,cote=660,460,30

ligne,colonne=hauteur//int(20+1.2*cote),largeur//(20+2*cote)

taille=str(largeur+20)+'x'+str(hauteur+80)

fenetre=creer_fenetre(fenetre,taille,titre,couleur)

can = Canvas(fenetre, width =largeur, height =hauteur, bg ='white')

can.grid(row=0,column=0)

message="Pour déplacer les objets à l'aide de la souris\n\

Appuyer sur le bouton droit de la souris\n"+"Laisser le bouton droit enfoncé pour\n "+\

"que l'objet suive la souris"

message=Label(fenetre,text=message,font='verdana 10 bold',fg='blue')

message.grid(row=1,column=0)

for i in range(colonne):

       x4=10+ i*2*(cote+20)

       x5=x4+cote+20

       for j in range(ligne):

             y4=10+j*1.2*(20+cote)

             y5=y4

             coul =couleurs[randrange(nbrecouleurs)]

             if (i+j)%2==0:

                    can.create_rectangle(x4, y4, x4+cote, y4+cote, fill =coul,activefill="red")

             elif (i+j)%2==1:

                    can.create_oval(x4, y4, x4+cote, y4+cote, fill =coul,activefill="red")

can.bind("<Button-1>",lambda event:souris_clic(event,can))

fenetre.mainloop()