Application de la POO à tkinter


Etape 3 - Contrôle des interactions

Consignes permanentes :

  • Copier/coller le code ci-dessous dans un idle et le compléter en suivant les indications suivantes.
  • Tous les termes en italique dans le code doivent être remplacés par des valeurs correctes (attributs, méthodes, ...).
  • D'éventuels points d'interrogation ??? dans le code doivent être remplacés par du code valide.

Exercice

Les objets animés peuvent sortir de l'écran, il faut alors les détruire afin d'éviter de mobiliser le processeur avec des calculs inutiles (mêmes invisibles les instances existent toujours en mémoire et leurs méthodes "automatiques" sont actives).
Remarque - Il est possible d'envisager d'autres solutions que la destruction : l'objet peut « rebondir » sur les limites du canvas, l'objet peut « réapparaître » ailleurs avec des propriétés différentes (couleur, taille, trajectoire...).

L'idée est la suivante : un attribut de type booléen souvent appelé drapeau (flag en anglais) renseigne sur un état de l'instance (ici l'état de mouvement).
Toutes les méthodes ont accès à cet attribut booléen et prennent des décisions en fonction de sa valeur.
Par aillleurs, une fonction de contrôle examine la position de l'instance (teste la sortie du canvas), les interactions avec l'extérieur et modifie le booléen.

  1. Modifier le constructeur de la classe Rectangle en ajoutant un nouvel attribut nommé arret initialisé à True.
  2. Modifier la méthode vitesse() afin qu'elle modifie l'attribut arret.
  3. Définir une nouvelle méthode nommée controle() qui teste la position de l'instance dans le canvas et qui modifie le booléen arret si nécessaire.
  4. Modifier la méthode mvt() de façon à ce qu'elle appelle la méthode controle() et que l'appel récursif ne soit lancé qu'après vérification de la variable arret.

Remarques :
- Les dimensions du canvas peuvent être déterminées grâce à : nom_canvas.winfo_reqwidth() et nom_canvas.winfo_reqheight().
- La méthode mvt() a été modifiée (abandon de move() au profit de coords()) car la nouvelle méthode controle() utilise les coordonnées x1, y1, x2, y2 qui sont définies au départ mais modifiées par move() de façon "invisible" ; on modifie donc explicitement les attributs x1, y1, x2, y2 puis on met les coordonnées à jour via coords() (on pourrait procéder autrement).

Perfectionnement : changement de couleur avant destruction de l'instance.

Modifier la méthode controle() de façon à ce qu'elle :
- modifie l'attribut cl (couleur)
- modifie la couleur de l'instance à l'aide de nom_canvas.itemconfig(nom_instance, fill=couleur)
- rafraichisse l'affichage à l'aide de nom_fenêtre.update_idletasks()
- ajoute un temps d'attente de 500 ms nom_fenêtre.after(500, None) (aucune fonction lancée)
- détruise l'instance à l'aide de nom_canvas.delete(nom_instance)


Code


Programmation objet