Gestion de la souris
gestion du clavier
EVENEMENT

on utilise

Pour les touches classiques(0 ; E ; ..Z)

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

E.get()

Renvoi le texte saisi.

<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é. ( 2 : bouton du milieu, 3 : bouton droit)

_images/image225.png

Le bouton gauche est relâché. ( 2 : bouton du milieu, 3 : bouton droit)

_images/image226.png

Double-clic avec le bouton gauche. ( 2 : bouton du milieu, 3 : 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

Détection

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

Progamme
#1202 bouger_dessins.py from random import randrange from tkinter import * #module de construction de fenetres 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','old lace','blanched almond', 'bisque', 'slate grey', 'light slate gray', 'light slate grey', 'gray',, 'royal blue', 'blue', 'dodger blue', 'deep sky blue', 'sky blue', 'dark goldenrod', 'rosy brown', 'indian red', 'saddle brown', 'tomato', 'orange red', 'white', 'hot pink', 'deep pink', 'pink', 'dark blue', 'dark cyan', 'dark magenta', 'dark red', 'light green'] 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)) 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) m1="Pour déplacer les objets à l'aide de la souris\n" m2="Appuyer sur le bouton droit de la souris\n" m3="Laisser le bouton droit enfoncé pour\n " m4="que l'objet suive la souris" message1=m1+m2+m3+m4 message=Label(fenetre,text=message1,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()

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

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

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
DEPLACEMENT

.

Déplacement d'un objet avec le clavier
#Déplacement d'un objet avec le clavier #1101-deplacement-fleche.py from tkinter import * def creer_fenetre(fenetre,titre,taille): "modifie une fenêtre" fenetre.title(titre) fenetre.geometry(taille) return fenetre def nettoie_fenetre(fenetre,can,liste_widgets): can.delete(ALL) for w in liste_widgets:w.destroy() return fenetre,can def avancer(b1,b2,objet): #procédure d'avancement global x1,y1,x2,y2 futurx,futury=x2+b1,y2+b2 if futurx>480 or futurx<10: b1=-b1 futurx=b1+x2 if futury>400 or futury<10: b2=-b2 futury=b2+y2 x2,y2=futurx,futury can.coords(objet,x2,y2,x2+30,y2+30) def touche(event,distance,objet): #code reçoit le n° de la touche"" code=event.keycode if code==38: # Up avancer(0,-distance,objet) elif code==40: # Down avancer(0,distance,objet) elif code==37: #Left avancer(-distance,0,objet) elif code==39: #Right avancer(distance,0,objet) #------ Programme principal ------- x1, y1 = 40, 40 x2,y2=x1,y1 distance=10 fenetre = Tk() titre="Déplacement avec les flèches" taille="500x550" fenetre=creer_fenetre(fenetre,titre,taille) regle="Appuyer sur les flèches\n du clavier\n pour faire bouger la balle\n " regle2=chr(11013)+' '+chr(10145)+' '+chr(11015)+' '+chr(11014) regle=regle+regle2 texte0=Label(fenetre, text=regle,font="arial 16 bold",fg="blue",bg='white') can = Canvas(fenetre,bg='light blue',height=480,width=500) objet = can.create_oval(x1,y1,x1+30,y1+30,width=2,fill='red') can.grid(row=2,column=0,columnspan=2) texte0.grid(row=0,column=0,sticky=E) fenetre.bind_all('<Key>',lambda event:touche(event,distance,objet)) fenetre.mainloop()
Touches du clavier
Déplacement d’une balle avec les flèches du clavier.
_images/clavier120.gif
_images/up.PNG

Remarques :

On peut demander au gestionnaire d’évènements de surveiller (ou d’exécuter) les actions sur :

Certaines touches. Plusieurs touches simultanément. Exécute la fonction lorsqu’une touche est enfoncée. Exécute la fonction lorsque la touche est relâchée.

EVENEMENT :

A chaque fois qu’une touche est enfoncée (ou relâchée), c’est un évènement qui est déclenché. La méthode mainloop () que l’on place toujours en fin de programme déclenche le gestionnaire d’évènements.

On veut surveiller un évènement clavier :

E est le nom du widget et fenetre la fenêtre

Sur un widget Entry : Sur la fenêtre entière :
E.bind("<Key>«, fonction)
fenetre.bind ("<Key>",fonction)
Propriété retour
event.char
Renvoie le caractère correspondant à la touche enfoncé ligne 9
event.keysym
Renvoie une chaîne de caractères contenant le symbole correspondant à la touche enfoncée
event.keycode
Renvoie un entier contenant le code correspondant à la touche enfoncé
event.widget
Renvoie le widget sur lequel l’action a été déclenchée.
WIDGET entry

Rappel des méthodes du widget Entry :

Méthode Effet
E.get()
Renvoi le texte saisi.
E.insert(i,T)
Insère le texte T dans l’Entry E à la position i.
E.insert(INSERT,T)
Insère le texte T dans l’Entry E à la place du curseur.
E.insert(END,T)
Insère le texte T dans l’Entry E à la fin du contenu existant.
E.delete(i)
Efface un le caractère à la position i de l’Entry E.
E.delete(deb,fin)
Efface les caractères placés entre les indices deb et fin de l’Entry E. lignes 8 et 17
E.delete(0,END)
Efface l’intégralité du champ texte.
E.focus()

Donne la priorité au widget lignes 19 et 36

KEYCODE

Pour les touches classiques(0 ; E ; ..Z) on utilise le

keycode

correspondant au code ASCII de la lettre ou du nombre, la fonction

chr (i)

donne comme résultat le caractère correspondant au nombre i. La fonction qui donne le code ASCII d’un caractère est ord(« a ») qui renvoie pour la lettre a le nombre 97.

code ASCII :

# code ASCII.py

print("code ASCII :")

for i in range(33,400):

      if (i-33)%5!=0:

            print(" ",i," =",chr(i),end=" ;" )

      else:print(" ", i,"= ",chr(i))

     

 

GESTION CLAVIER
Exemple 1001 : gestion clavier
# gestion clavier entry.py from tkinter import * def creer_fenetre(fenetre,titre,taille,couleur): "modifie une fenêtre" fenetre.title(titre) fenetre.geometry(taille) fenetre.configure(bg=couleur) return fenetre def nettoie_fenetre(fenetre,can,liste_widgets): can.delete(ALL) for w in liste_widgets:w.destroy() return fenetre,can def attend_reponse(event,reponse): #receptionne le caractère de la touche du clavier rep=" " affiche.config(text=rep) reponse.delete(0,11) touche=event.char rep=" Appuyer sur la touche Entrée" affiche.config(text=rep) reponse.bind("<Return>",lambda utile:valide_reponse(utile,touche,reponse)) def valide_reponse(utile,touche,reponse): #Affiche la rèponse après l'action de la touche entrèe rep=" Vous avez appuyé sur la touche : "+touche affiche.config(text=rep) reponse.delete(0,11) reponse.insert(0,"Insérer") reponse.focus() reponse.bind("<Key>",lambda event:attend_reponse(event,reponse)) #---------------------------------------------------------------------# largeur,hauteur=450,150 taille=str(largeur)+'x'+str(hauteur) titre="Gestion clavier" couleur="khaki" ft='verdana 12 bold' #----------------------------------------------------------------------# fenetre = Tk() fenetre=creer_fenetre(fenetre,titre,taille,couleur) indication = Label(fenetre,font=ft, bg='khaki',text ='Appuyer sur une touche ') reponse = Entry(fenetre, font=ft,bg ='bisque', fg='red') indication.grid(row =1, sticky =E) reponse.grid(row =1, column =2) affiche = Label(fenetre,bg='khaki',font=ft, text ='') affiche.grid(row =3, sticky =E) reponse.insert(0,"Insérer") reponse.focus() reponse.bind("<Key>",lambda event:attend_reponse(event,reponse)) fenetre.mainloop()

L’illustration:

_images/gestionclavier.gif

SYMBOLES ET CODE :

Tableau des symboles et codes des touches spéciales.

keysym keycode keysym_num Touche
Alt_L 64 65513 La touche Alt située à gauche.
BackSpace 22 65288 La touche Retour Arrière
Caps_Lock 66 65509 Verr Maj
Control_L 37 65507 La touche Ctrl de gauche
Control_R 105 65508 La touche Ctrl de droite
Delete 119 65535 Suppr
Down 116 65364
End 115 65367 Fin
Escape 9 65307 Echap
F1 67 65470 La touche fonction F1
F2 68 65471 La touche fonction F2
Fi 66+i 65469+i La touche fonction Fi
F12 96 65481 La touche fonction F12
Home 110 65360 Début ou ↖
Insert 118 65379 Insér.
Left 113 65361
Linefeed 54 106 Control-J
KP_0 90 65456 0 sur le clavier numérique
KP_1 87 65457 1 sur le clavier numérique
KP_2 88 65458 2 sur le clavier numérique
KP_3 89 65459 3 sur le clavier numérique
KP_4 83 65460 4 sur le clavier numérique
KP_5 84 65461 5 sur le clavier numérique
KP_6 85 65462 6 sur le clavier numérique
KP_7 79 65463 7 sur le clavier numérique
KP_8 80 65464 8 sur le clavier numérique
KP_9 81 65465 9 sur le clavier numérique
KP_Add 86 65451
  • sur le clavier numérique
keysym keycode* keysym_num* Touche
KP_Begin 84 65437 La touche centrale (même que 5) sur le clavier numérique.
KP_Decimal 91 65454 . de la ponctuation décimale, Sur le clavier numérique.
KP_Delete 91 65439 Suppr sur le clavier numérique.
KP_Divide 106 65455 / sur le clavier numérique.
KP_Down 88 65433 ↓ sur le clavier numérique.
KP_End 87 65436 1 ou Fin sur le clavier numérique.
KP_Enter 104 65421 Entrée sur le clavier numérique.
KP_Home 79 65429 ↖ ou début sur le clavier numérique.
KP_Insert 90 65438 Insert sur le clavier numérique.
KP_Left 83 65430 ← sur le clavier numérique.
KP_Multiply 63 65450 \(times \ \)sur le clavier numérique.
KP_Next 89 65435  sur le clavier numérique.
KP_Prior 81 65434 ⇞  sur le clavier numérique.
KP_Right 85 65432 → sur le clavier numérique.
KP_Subtract 82 65453 \(-\) sur le clavier numérique.
KP_Up 80 65431 ↑ sur le clavier numérique.
Next 117 65366
Num_Lock 77 65407 Verr Num
Pause 127 65299 Pause
Print 111 65377 ImprÉcran
Prior 112 65365
Return 36 65293 La touche  Entrée.
Right 114 65363
Scroll_Lock 78 65300 Arrêt Défilement (ScrollLock)
Shift_L 50 65505 La touche   de gauche.
Shift_R 62 65506 La touche   de droite.
space 65 32 La barre espace.
Tab 23 65289 ↹ la touche de Tabulation.
Up 111 65362