{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapitre 9 : \"La programmation graphique orientée objet\" - solutions\n",
    "\n",
    "---\n",
    "\n",
    "<table class=\"appbclp1\">\n",
    "<tr> <td style=\"font-weight: bold!;\">auteurs :</td><td style=\"text-align: left!;\">Laurent Pointal &lt;<a href=\"mailtp:laurent.pointal@limsi.fr\">laurent.pointal@limsi.fr</a>&gt; &amp; Bob Cordeau &lt;<a href=\"pycours@kordeo.eu\">pycours@kordeo.eu</a>&gt; </td> </tr>\n",
    "<tr> <td style=\"font-weight: bold!;\">licence :</td><td style=\"text-align: left!;\">Creative Commons Attribution-ShareAlike 4.0 International Public License (CC BY-SA 4.0) </td> </tr>\n",
    "<tr> <td style=\"font-weight: bold!;\">source :</td><td style=\"text-align: left!;\"><a href=\"https://github.com/lpointal/appbclp\">https://github.com/lpointal/appbclp</a></td> </tr>\n",
    "<tr> <td style=\"font-weight: bold!;\">description :</td><td style=\"text-align: left!;\">Les programmes dans ce Notebook Jupyter servent de support au livre <span style=\"font-style: italic!;\">« Python 3 - Apprendre à  programmer dans l'écosystème Python»</span>, édition Dunod, dans lequel les différentes sections sont expliquées </td> </tr>\n",
    "<tr> <td style=\"font-weight: bold!;\">url :</td><td style=\"text-align: left!;\"><a href=\"https://www.dunod.com/sciences-techniques/python-3\">https://www.dunod.com/EAN/9782100809141</a></td> </tr>\n",
    "</table>\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_01"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# exo09_01\n",
    "\n",
    "# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
    "import tkinter as tk\n",
    "\n",
    "\n",
    "# Définition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
    "def enMetres(event):\n",
    "    res.configure(text='=> ' + str(float(pieds.get()) * 0.3048) + ' m')\n",
    "\n",
    "\n",
    "# programme principal =========================================================\n",
    "root = tk.Tk()\n",
    "pieds = tk.Entry(root)\n",
    "pieds.bind('<Return>', enMetres)\n",
    "res = tk.Label(root)\n",
    "pieds.pack()\n",
    "res.pack()\n",
    "\n",
    "root.mainloop()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_02"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# exo09_02\n",
    "\n",
    "# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
    "import tkinter as tk\n",
    "\n",
    "\n",
    "# Définition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
    "def enPa(event):\n",
    "    pa.configure(text=str(float(psi.get()) * 6894.75729))\n",
    "\n",
    "\n",
    "# programme principal =========================================================\n",
    "root = tk.Tk()\n",
    "etiq1 = tk.Label(root, text='psi :')\n",
    "etiq2 = tk.Label(root, text='Pa :')\n",
    "psi = tk.Entry(root)\n",
    "psi.bind('<Return>', enPa)\n",
    "psi.focus_set()\n",
    "pa = tk.Label(root)\n",
    "\n",
    "etiq1.grid(row=0)\n",
    "etiq2.grid(row=1)\n",
    "psi.grid(row=0, column=1)\n",
    "pa.grid(row=1, column=1)\n",
    "\n",
    "root.mainloop()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_03"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# exo09_03\n",
    "\n",
    "# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
    "import tkinter as tk\n",
    "import time\n",
    "\n",
    "# Définition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
    "def maj():\n",
    "    \"Mise à jour toutes les 1000 ms.\"\n",
    "    heure.set(time.strftime('%H:%M:%S'))\n",
    "    root.after(1000, maj)\n",
    "\n",
    "# Programme principal =========================================================\n",
    "root = tk.Tk()\n",
    "heure = tk.StringVar()\n",
    "tk.Label(root, textvariable=heure).pack(padx=10, pady=10)\n",
    "\n",
    "maj()\n",
    "\n",
    "root.mainloop() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo09_04\n",
    "\n",
    "Les corrigés pour cet exercice sont dans le répertoire `projets/`, fichiers `tkPhone_ch09.py` et `tkPhone_IHM_ch09.py`. \n",
    "Des commentaires `# MODIFICATION ch09` ajoutent des précisions sur ce qui est ajouté/modifié par rapport au code d'origine. \n",
    "\n",
    "La recherche mise en œuvre ici est très simple, la chaîne à rechercher est mise en minuscule et recherchée (opérateur `in`) dans les chaînes des noms, elles-mêmes mises en minuscules, ceci est réalisé dans une expression de liste en compréhension:\n",
    "\n",
    "    self.selection_list = [ x for x in self.phone_list  if rech in x.nom.lower() ]\n",
    "\n",
    "La liste des personnes sélectionnées est conservée, et est utilisée pour l'affichage, afin d'avoir une synchronisation entre la liste affichée et la liste de sélection en mémoire et de pouvoir faire les opérations précédentes (affichage, suppression) en considérant la liste de sélection.\n",
    "\n",
    "Il aurait été possible d'utiliser d'autres solutions pour le filtrage, par exemple en utilisant des expressions régulières avec le module `re` (présenté en annexe C), ou encore en utilisant le *globbing* avec le module [fnmatch](https://docs.python.org/fr/3/library/fnmatch.html) de Python."
   ]
  }
 ],
 "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
}
