Formation PUB400 : Python, 2018 Environnement graphique tkinter

9.9 Bouton associé à une fonction maison


Dans la majorité de vos applications, vous devrez coder une fonction qui contient le code à exécuter lorsqu'un événement survient, par exemple lorqu'un bouton est cliqué. Lorsqu'une fonction est associée à un événement, on lui donne le nom gestionnaire d'événement.

La déclaration d'un gestionnaire d'événement se fait comme pour toute autre fonction : à l'aide du mot-clé def.

C'est lors de l'exécution du gestionnaire d'événement que les choses sont différentes. En effet, il ne faut pas demander à Python d'exécuter la fonction tout de suite. Ce qu'on veut, c'est qu'elle soit exécutée seulement lorsque l'événement surviendra.

On associera donc notre gestionnaire d'événement à un événement à l'aide du paramètre command d'un bouton ou encore à l'aide de la fonction bind().

Python

# la fonction ne sera exécutée que lorsque le bouton sera cliqué

bouton_terminer = Button(fenetre, text='Terminer', command=ma_fonction)

Paramètres de la fonction

Lorsqu'une fonction est appelée automatiquement par Python en réponse à un événement, vous n'avez aucun contrôle sur les paramètres de cette fonction.

Parfois, la fonction ne recevra aucun paramètre. Ce sera le cas, par exemple, lorsqu'une fonction est associée à un événement à l'aide du paramètre command.

Ex :

Python

#!/usr/bin/env python

 

from tkinter import *

 

def terminer_click():

    ....

 

...

bouton_terminer = Button(fenetre, text='Terminer', command=terminer_click)

...

D'autres fois, elle recevra un paramètre qui représente l'événement. Ce sera le cas notamment lorsque la fonction est associée à un événement à l'aide de la fonction bind().

C'est Python qui se chargera de fournir cette information à la fonction. Vous devez simplement recevoir le paramètre, que vous en ayiez besoin ou pas.

Ex :

Python

#!/usr/bin/env python

 

from tkinter import *

 

def premier_bouton_click(event):

    ....

 

...

fenetre.bind('<Button-1>', premier_bouton_click)

...

Rappelez-vous que lorsqu'on fait l'assignation entre la fonction et l'événement, il ne faut pas mettre de parenthèses après le nom de la fonction ni l'entourer d'apostrophes ou de guillemets.

Hello World avec bouton et fonction maison

Voici une autre version du Hello World qui illustre l'utilisation d'une fonction maison.

Python

#!/usr/bin/env python

 

from tkinter import *

from tkinter import messagebox

 

def terminer_click():

    """ Affiche un message popup puis termine le programme. """

 

    messagebox.showinfo('Fin du programme', 'Au revoir !')

    fenetre.destroy()

 

########## programme principal ##########

 

fenetre = Tk()

 

libelle = Label(fenetre, text='Hello World')

libelle.pack()

 

bouton_terminer = Button(fenetre, text='Terminer', command=terminer_click)

bouton_terminer.pack()

 

# la fenêtre s'affiche puis attend les interactions de l'usager

fenetre.mainloop()

Remarquez l'appel à fenetre.destroy() dans la fonction. Il y a des parenthèses après le destroy().

Pourtant, lorsqu'on associait cette même fonction directement au clic sur le bouton, il n'y en avait pas.

Ex :

Python

bouton_terminer = Button(fenetre, text='Terminer', command=fenetre.destroy)

Saurez-vous dire pourquoi ?

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre