{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapitre 9 : \"La programmation graphique orientée objet\"\n",
    "\n",
    "### <span class=\"bg-info\">« *Je m’étais rendu compte que seule la perception grossière et erronée place tout dans l’objet, quand tout est dans l’esprit…* »</span>\n",
    "\n",
    "Proust $-$ le Temps retrouvé\n",
    "\n",
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <span class=\"bg-success\">CE QU'IL FAUT RETENIR</span>\n",
    "\n",
    "- Les fenêtres comportent des éléments graphiques d'interface, les **widgets**.\n",
    "- Un système lié à la librairie graphique utilisée permet d'associer des **événements**, par exemple issus des actions de l'utilisateur, à des fonctions ou méthodes à appeler.\n",
    "- Si la librairie graphique est bien conçue, des **positionneurs** permettent de gérer logiquement le placement des widgets et leur redimensionnement.\n",
    "- La séparation de l'interface graphique d'un côté, la logique de manipulation des données de l'autre, avec un moyen de communication entre les deux, est une architecture à privilégier.\n",
    "\n",
    "**Attention : ** L'utilisation d'une librairie graphique (dans notre cas `tkinter`) ne fonctionnera que si le notebook est ouvert avec un Jupyter démarré localement (dans notre cas *via* Pyzo). L'ouverture d'un notebook avec un Jupyter distant ne permettra pas l'affichage sur votre écran. Il est conseillé de travailler alors avec Pyzo et des modules Python.\n",
    "\n",
    "**Liens :** \n",
    "\n",
    "- [Interfaces graphiques dans Python 3 — utilisation de Tkinter](http://ateliers.mse.free.fr/tkinter/page_tkinter.html) (documentation en français par «ateliers.mse.free.fr»), [document pdf](http://ateliers.mse.free.fr/tkinter/tkinter-ref5.pdf).\n",
    "- [Tkinter 8.5 reference: a GUI for Python](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html) (en anglais),  dont [Layout management](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/layout-mgt.html) pour l'exercice avec le *gridder*.\n",
    "- [Gestionnaire de positionnement](http://tkinter.fdex.eu/doc/gp.html) par Étienne Florent pour le *gridder*.\n",
    "\n",
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_01 ✓✓\n",
    "\n",
    "Sur le modèle de la **calculette minimaliste** détaillée dans le livre, on demande d'écrire une interface graphique en tkinter permettant de convertir des pieds en mètres.\n",
    "\n",
    "**On donne :** 1 ft = 0,3048 m.\n",
    "\n",
    "Il s'agit donc d'écrire :\n",
    "\n",
    "- une fonction `enMetres()` de convertion, déclenchée par la touche `Entrée` ;\n",
    "- une zone de saisie (widget `Entry`) ;\n",
    "- une zone d'affichage du résultat (widget `Label`).\n",
    "\n",
    "![f2m](../data/f2m.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# exo09_01\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_02 ✓✓\n",
    "\n",
    "On désire améliorer un peu l'apparence de l'interface précédente.\n",
    "\n",
    "Dans les laboratoires de physique, on utilise des fluides (souvent des gaz) dont on doit contrôler la pression, ce qui doit être fait en unité légale de pression : le pascal (symbole Pa). Malheureusement, les manomètres disponibles sont généralement gradués en PSI (*pound per square inch*). On a inévitablement besoin de convertir des livres par pouce carré en pascals !\n",
    "\n",
    "**On donne :** 1 PSI = 6894,75729 Pa\n",
    "\n",
    "Comme sur la figure ci-dessous, on désire faire précéder la zone de saisie du label \"psi :\" et la zone d'affichage du lablel \"Pa :\". On utilisera le *gridder* pour positionner les quatre widgets sur une grille $2 \\times 2$. Enfin on donnera le *focus* à la zone de saisie.\n",
    "\n",
    "![psi2pa](../data/psi2pa.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# exo09_02"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_03 ✓✓✓\n",
    "\n",
    "On veut afficher l'heure courante dans une interface.\n",
    "\n",
    "![hms](../data/hms.png)\n",
    "\n",
    "**Indications :** L'heure est fournie par la fonction `strftime()` du module `time`.\n",
    "\n",
    "Écrire une fonction de mise à jour de l'heure toutes les secondes en utilisant la méthode `after()` du module `tkinter`.  \n",
    "Voici un exemple d'utilisation de la méthode `after()` dans lequel la fonction `une_iteration` s'exécute tous les 100 ms :\n",
    "\n",
    "```python\n",
    "def une_iteration():\n",
    "    ... votre code ici ...\n",
    "    root.after(100, une_iteration)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# exo09_03"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_04 ✓✓✓\n",
    "\n",
    "Ajout d'une fonctionnalité de recherche dans tkPhone.\n",
    "\n",
    "![hms](../data/tkphone-rechercher.png)\n",
    "\n",
    "Ajouter un champs de saisie et un bouton `Rechercher` à la droite du bouton d'effacement.\n",
    "\n",
    "Un clic sur le bouton `Rechercher` doit mettre à jour la liste de noms afin de n'afficher \n",
    "que ceux qui contiennent la chaîne saisie dans le champs de recherche (si ce champs est \n",
    "vide l'ensemble de la liste est affichée).\n",
    "\n",
    "Un clic sur le bouton d'Effacement doit aussi effacer le champs de recherche, et mettre\n",
    "à jour la liste en conséquence.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
