Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
public:appro-s7:td2 [2022/10/18 19:26] – ↷ Nom de la page changé de public:appro-s7:td5 à public:appro-s7:td2 edauce | public:appro-s7:td2 [2023/10/15 22:37] (Version actuelle) – edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ===== TD2 : Les hamsters ... la suite ===== | ||
+ | |||
+ | Ce TD fait suite au [[public: | ||
+ | |||
+ | |||
+ | * Dans ce TD, nous complétons le programme entamé au TD1 pour obtenir une interface fonctionnelle. Vous pouvez vous inspirer de la [[public: | ||
+ | |||
+ | |||
+ | ==== Interface graphique ==== | ||
+ | |||
+ | Nous allons programmer une interface graphique avec la librairie {{http:// | ||
+ | |||
+ | L' | ||
+ | * Une interface est constituée de plusieurs éléments graphiques (appelés // | ||
+ | * les widgets sont éditables/ | ||
+ | * il est possible de modifier leur contenu //en cours d' | ||
+ | * Les actions de l' | ||
+ | * Les événements sont déclenchés par des widgets actifs (boutons, menus,...) capables de lancer l' | ||
+ | * mise à jour d'une variable ou d'un attribut | ||
+ | * lancement d'un calcul | ||
+ | * envoi d'un message | ||
+ | * modification du rendu visuel | ||
+ | * arrêt du programme | ||
+ | * etc. | ||
+ | * Chaque élément graphique est caractérisé par son identifiant unique | ||
+ | * créé au moment de son initialisation | ||
+ | * utilisable au sein de l' | ||
+ | * (donc par toute fonction qui reçoit en paramètre le descripteur de l' | ||
+ | * permettant de changer le rendu graphique en cours d' | ||
+ | |||
+ | Dans le cadre du patron MVC, les informations affichées dans l' | ||
+ | * L' | ||
+ | * Le contrôleur exécute l' | ||
+ | * Les changements produits par l' | ||
+ | * l' | ||
+ | |||
+ | ==== A faire ==== | ||
+ | |||
+ | Ouvrez Pycharm et reprenez le projet du [[public: | ||
+ | |||
+ | Pour rappel, le programme sert à gérer une petite animalerie (constituée de rongeurs divers...). Les animaux sont décrits dans le fichier '' | ||
+ | * le modèle définit les opérations permettant la mise à jour de l' | ||
+ | * le contrôleur définit les actions possibles, à savoir nourrir, divertir, coucher et réveiller les animaux. Les actions sont valides (ou non) en fonction de l' | ||
+ | |||
+ | * Exécutez les tests pour vérifier que tout fonctionne bien | ||
+ | |||
+ | |||
+ | === Construction de l' | ||
+ | * Ajoutez un module '' | ||
+ | * Pour programmer l' | ||
+ | <code python> | ||
+ | from appJar import gui | ||
+ | </ | ||
+ | * On initialise une application (correspondant à une fenêtre graphique) | ||
+ | <code python> | ||
+ | app = gui() | ||
+ | </ | ||
+ | |||
+ | Le but est de construire une interface très simple: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Le premier bandeau (rose saumon) peut être défini à l'aide des commandes suivantes : | ||
+ | <code python> | ||
+ | app.addLabel(" | ||
+ | app.setLabelBg(" | ||
+ | app.setLabelFg(" | ||
+ | </ | ||
+ | * Un widget de type '' | ||
+ | * Son //index// (autrement dit son identifiant) est ''" | ||
+ | * Pour modifier son rendu, on applique un setter : '' | ||
+ | |||
+ | Pour tester le rendu, il suffit d' | ||
+ | <code python> | ||
+ | app.go() | ||
+ | </ | ||
+ | et d' | ||
+ | |||
+ | <note tip> **A FAIRE: ** | ||
+ | |||
+ | Définissez un deuxième bandeau de couleur grise (''" | ||
+ | <note important> | ||
+ | Pensez à définir un nouvel index | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Pour afficher l' | ||
+ | <code python> | ||
+ | import modele | ||
+ | </ | ||
+ | * La liste des animaux n' | ||
+ | <code python> | ||
+ | liste_animaux = [' | ||
+ | </ | ||
+ | |||
+ | <note tip> ** A FAIRE: ** | ||
+ | |||
+ | Pour chaque animal de la liste : | ||
+ | * Utiliser le modèle pour connaître l' | ||
+ | * Initialiser un widget de type Label, | ||
+ | * dont l' | ||
+ | * et dont le contenu est un texte indiquant le nom de l' | ||
+ | * Exécuter la vue pour vérifier que les animaux s' | ||
+ | </ | ||
+ | |||
+ | La deuxième partie de la vue est constituée de deux listes à choix multiples pour choisir l' | ||
+ | * choix de l' | ||
+ | * et choix de l' | ||
+ | Le bouton '' | ||
+ | |||
+ | === Listes à choix multiples === | ||
+ | Dans l' | ||
+ | * l' | ||
+ | * le choix de l' | ||
+ | <note important> | ||
+ | * Les boutons radio servant à gérer une même variable ont le même index | ||
+ | * chaque bouton sert à instancier une valeur différente | ||
+ | * la valeur courante est obtenue en appelant la méthode '' | ||
+ | </ | ||
+ | |||
+ | <note tip> **A FAIRE: ** | ||
+ | * pour chaque animal '' | ||
+ | <code python> | ||
+ | app.addRadioButton(" | ||
+ | </ | ||
+ | * définissez la liste des actions possibles | ||
+ | * pour chaque action '' | ||
+ | <code python> | ||
+ | app.addRadioButton(" | ||
+ | </ | ||
+ | * exécutez la vue et vérifiez que les boutons radio permettent bien la sélection de valeurs. | ||
+ | </ | ||
+ | |||
+ | === Boutons d' | ||
+ | On ajoute à présent le bouton d' | ||
+ | |||
+ | On commence par importer le contrôleur: | ||
+ | <code python> | ||
+ | import controleur | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | Rappel : le contrôleur propose les actions : nourrir, divertir, endormir et réveiller | ||
+ | |||
+ | Exemple : | ||
+ | <code python> | ||
+ | controleur.nourrir(id_animal) | ||
+ | </ | ||
+ | a pour effet de modifier //dans le modèle// l' | ||
+ | * il est déplacé vers la mangeoire (si elle n'est pas occupée) | ||
+ | * et l' | ||
+ | </ | ||
+ | |||
+ | Dans l' | ||
+ | <code python> | ||
+ | app.addButton(" | ||
+ | </ | ||
+ | |||
+ | <note tip> **A FAIRE: ** | ||
+ | |||
+ | Définir la fonction : | ||
+ | <code python> | ||
+ | def press(act): | ||
+ | ... | ||
+ | </ | ||
+ | qui exécute une action du contrôleur selon les deux valeurs : | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ainsi si l' | ||
+ | <code python> | ||
+ | controleur.nourrir(app.getRadioButton(" | ||
+ | </ | ||
+ | |||
+ | etc. | ||
+ | * Codez les appels aux actions nourrir, divertir, coucher et réveiller dans la fonction | ||
+ | * Exécutez la vue | ||
+ | * Pour vérifier que les actions sont bien prises en compte, effectuez une action // | ||
+ | </ | ||
+ | |||
+ | === Ce n'est pas fini ! === | ||
+ | |||
+ | Lorsqu' | ||
+ | Pour répercuter le résultat de l' | ||
+ | <note important> | ||
+ | Les identifiants d' | ||
+ | <code python> | ||
+ | app.setLabel(id_animal, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <note tip> **A FAIRE: ** | ||
+ | * Écrire une fonction qui met à jour l' | ||
+ | * Ajouter un appel à cette fonction à la fin de la fonction '' | ||
+ | * Exécuter la vue et vérifier que le tableau de bord est bien modifié lorsque les actions sont valides. | ||
+ | </ | ||
+ | |||
+ | === Améliorations === | ||
+ | |||
+ | Il est préférable lorsque l' | ||
+ | {{ : | ||
+ | |||
+ | Les fenêtre à message sont exécutées à l'aide d'une commande: | ||
+ | < | ||
+ | app.warningBox("", | ||
+ | </ | ||
+ | |||
+ | <note tip> ** A FAIRE: ** | ||
+ | * Comme les messages d' | ||
+ | * Définir également un message lorsque l' | ||
+ | * Les actions valides apparaissent dans des '' | ||
+ | </ | ||
+ | |||
+ | === Interface tabulaire === | ||
+ | |||
+ | Il est possible d' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | <note tip> | ||
+ | NB : | ||
+ | * pour le bleu pâle : '' | ||
+ | * pour aligner à gauche : '' | ||
+ | </ | ||
+ | |||