# interface-etalonnage

## Interface d'étalonnage

### Bibliothèques utilisées

On utilisera :

* Serial: Pour la communication avec l'Arduino
* tkinter: Pour avoir une UI basique

### Objectifs

* Pour le capteur de couleur, afficher la couleur à partir des données reçues et pouvoir choisir les coefficients d'étalonnage
* Pour le capteur de mouvement, afficher les coordonnées du gyroscopique, accéléromètre et de boussole.

### Introduction à Tkinter

##### Liens

* [Reference Tkinter](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web "http://infohost.nmt.edu/tcc/help/pubs/tkinter/web")
* [Documentation en francais](http://tkinter.fdex.eu/doc/ "http://tkinter.fdex.eu/doc/")

##### Import du package

```python
import tkinter as tk
```

##### Première fenêtre

Notre premier modèle de fenêtre.

```python
class PremiereFenetre(tk.Frame):
      def __init__(self, master=None):
      	  tk.Frame.__init__(self, master)
	  self.grid()
	  self.creerTexte()
 
      def creerTexte(self):
      	  self.texte = tk.Label(self, text='Bonjour')
	  self.texte.grid()
```

* En premier lieu, on remarque que notre classe hérite de la classe tk.Frame.
* Ensuite, on délégue la construction de la partie tk.Frame au constructeur de la classe.
* On doit appeler la méthode grid pour rendre la fenêtre affichable.
* On appelle ensuite creerTexte qui se charge de créer le texte Bonjour.
* Dans la fonction creerTexte, on appelle le constructeur de la classe tk.Label. Le premier argument est la frame parent. Le reste permet de configurer davantage le widget.

Dans l'entrée du programme, on met:

```python
pf = PremiereFenetre()
pf.mainloop()
```

##### Classes utiles

* Frame: la brique de base qui contiendra nos widget
* Label: Pour afficher du texte
* Canvas: Pour afficher des formes

##### Un petit chronometre

```python
class Chronometre(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.compteur = 0
        self.creerChrono()
        self.dessine()
 
    def dessine(self):
        self.chrono['text'] = str(self.compteur)
        self.compteur += 1
        self.chrono.after(1, self.dessine)
 
    def creerChrono(self):
        self.chrono = tk.Label(self, text=str(self.compteur))
        self.chrono.grid()
```

##### Un clignotant

```python
class Clignotant(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master, height=256, width=256)
        self.grid()
        self.compteur = 0
        self.dessine()
 
    def dessine(self):
        self['bg'] = "#" + ("%02x" % ((self.compteur << 3) % 256))*3
        self.compteur += 1
        self.after(1, self.dessine)
```

##### Un tournant

```python
class Tournant(tk.Canvas):
    def __init__(self, master=None):
        tk.Canvas.__init__(self, master, height=256, width=256)
        self.compteur = 0
        self.polygon = np.array([[-8, -8], [8, 8]])
        self.create_rectangle(*self.polygon.flat,  outline="red",
                              fill="yellow",
                              width=3,
                              tag="polygon") 
        self.grid()
        self.dessine()
 
    def unit_vector(self, r, w, t):
        return r*np.array([np.cos(w*t),
                           np.sin(w*t)])
 
    def dessine(self):
        self.compteur += 1
        self.coords("polygon",
                    *(self.polygon +
                      (128, 128) +
                      self.unit_vector(75, 1/32, self.compteur)
                    ).flat)
        self.after(1, self.dessine)
```