Formation PUB400 : Python, 2018 Environnement graphique tkinter

9.8 Les fenêtres popup


Le paquet tkinter nous offre la possibilité d'afficher un message dans une fenêtre popup.

Pour accéder à cette fonctionnalité, il faut ajouter une seconde instruction import :

Python

from tkinter import *

from tkinter import messagebox

Pourquoi un second import est-il nécessaire alors que le module messagebox fait partie du paquet tkinter ? C'est simplement parce que ce module n'est pas chargé automatiquement lors du chargement de tkinter.

Afficher un message d'information, d'avertissement ou d'erreur

La fonction showinfo() permet d'afficher un message d'information avec un bouton OK et une icône « information ».

Les paramètres de cette fonction sont :

  • le texte à afficher dans la barre de titre (peut être aussi simple que « Information »)
  • le texte à afficher dans la fenêtre (vous pouvez forcer un saut de ligne dans le texte avec \n)

Il est possible d'ajouter d'autres paramètres pour spécifier le bouton par défaut (qui sera cliqué si l'usager appuie sur Entrée), l'icône à afficher ainsi que le parent de la fenêtre popup, c'est-à-dire au-dessus de quel widget elle doit apparaître. Dans la pratique, les valeurs par défaut sont suffisante et on utilisera rarement ces paramètres.

Ex :

Python

messagebox.showinfo('Information', 'Le produit a été ajouté avec succès !')

showinfo()

Les fonctions showwarning() et showerror() fonctionnent sur le même principe mais l'icône affiché représente, selon le cas, un avertissement ou une erreur.

Ex :

Python

messagebox.showwarning('Attention', 'Aucun produit ne correspond aux critères demandés.')

showwarning

Ex :

Python

messagebox.showerror('Erreur', 'Un problème a empêché la suppression du produit.')

showerror()

Poser une question

La fonction askquestion() permet d'afficher un popup avec une question suivie des boutons Oui et Non. La fonction retournera la chaîne 'yes', en lettres minuscules, si l'usager a cliqué sur le bouton Oui ou 'no' s'il a cliqué sur le bouton Non.

Ex :

Python

reponse = messagebox.askquestion('Question', 'Désirez-vous vraiment supprimer ce produit ?')

 

# askquestion retourne 'yes' ou 'no'

if reponse == 'yes':

    ...

askquestion()

Il est possible d'afficher une question avec des boutons ou des comportements différents, par exemple :

  • askyesno() : boutons Oui et Non, tout comme avec askquestion(), sauf que la fonction retournera True ou False

    Ex :

    Python

    reponse = messagebox.askyesno('Question', 'Désirez-vous vraiment supprimer ce produit ?')

     

    # askyesno retourne True ou False

    if reponse:

        ...

    askyesno()

  • askyesnocancel() : boutons Oui, Non et Annuler, retournera True, False ou None.

    Ex :

    Python

    reponse = messagebox.askyesnocancel('Question', 'Désirez-vous enregistrer les modifications avant de quitter ?')

     

    if reponse == None:

        ...

    elif reponse:

        ...

    elif not reponse:

        ...

    askyesnocancel()

    Attention : il peut y avoir confusion entre les valeurs False et None. En effet, lorsque la réponse vaut None, les deux affirmations suivantes sont vraies : not reponse et reponse == None. Pour régler ce problème, il suffit de tester si la réponse est None avant de tester si elle est False. Sans cette précaution, le code suivant traiterait toujours la réponse Annuler comme si l'usager avait cliqué sur Non.

    Ex :

    Python

    reponse = messagebox.askyesnocancel('Question', 'Désirez-vous enregistrer les modifications ?')

     

    if reponse:

        messagebox.showinfo('Réponse', 'oui')

    elif not reponse:

        messagebox.showinfo('Réponse', 'non')

    elif reponse == None:

        messagebox.showinfo('Réponse', 'annuler')

    Par contre, le code suivant fonctionnera comme il faut. Notez que le test est reponse == False, ce qui n'englobe pas le cas où la réponse est à None.

    Ex :

    Python

    reponse = messagebox.askyesnocancel('Question', 'Désirez-vous enregistrer les modifications ?')

     

    if reponse:

        messagebox.showinfo('Réponse', 'oui')

    elif reponse == False:

        messagebox.showinfo('Réponse', 'non')

    elif reponse == None:

        messagebox.showinfo('Réponse', 'annuler')

  • D'autres fonctions offrent encore quelques variantes : askretrycancel() et askokcancel()

Pour plus d'information

« Fenêtres de dialogues ». Tkinter pour ISN. http://tkinter.fdex.eu/doc/popdial.html

▼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