#! /usr/bin/env python
# -*- coding:Utf-8 -*-

"""
Trois curseur pour contrôler la fréquence, la phase et l'amplitude.

Un événement spécifique est généré à chaque modification, pour informer 
le widget maître qui peut alors réagir en conséquence.

fichier : curseurs.py
auteur  : G. Swinnen (modifié Bob)
"""

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import tkinter as tk
from math import pi

# Définition de classe ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class ChoixVibra(tk.Frame):
    """Curseurs pour choisir fréquence, phase & amplitude d'une vibration"""
    def __init__(self, maitre=None, coul='red'):
        tk.Frame.__init__(self)      # constructeur de la classe parente
        # Définition de quelques attributs d'instance :
        self.freq, self.phase, self.ampl, self.coul = 0, 0, 0, coul
        # Variable d'état de la case à cocher :
        self.chk = tk.IntVar()       # 'objet-variable' Tkinter
        tk.Checkbutton(self, text='Afficher', variable=self.chk,
                    fg=self.coul, command=self.setCurve).pack(side=tk.LEFT)
        # Création des 3 curseurs :
        tk.Scale(self, length=150, orient=tk.HORIZONTAL, sliderlength=25,
              label='Fréquence (Hz) :', from_=1., to=9., tickinterval=2,
              resolution=0.25, showvalue=0, 
              command = self.setFrequency).pack(side=tk.LEFT, pady=5)
        tk.Scale(self, length=150, orient=tk.HORIZONTAL, sliderlength=15,
              label='Phase (degrés) :', from_=-180, to=180, tickinterval =90,
              showvalue=0, command=self.setPhase).pack(side=tk.LEFT, pady =5)
        tk.Scale(self, length=150, orient=tk.HORIZONTAL, sliderlength=25,
              label='Amplitude :', from_=2, to=10, tickinterval=2,
              showvalue=0, command=self.setAmplitude).pack(side=tk.LEFT, pady=5)

    def setCurve(self):
        self.event_generate('<Control-Z>')

    def setFrequency(self, f):
        self.freq = float(f)
        self.event_generate('<Control-Z>')

    def setPhase(self, p):
        pp =float(p)
        self.phase = pp*2*pi/360        # conversion degrés -> radians
        self.event_generate('<Control-Z>')

    def setAmplitude(self, a):
        self.ampl = float(a)
        self.event_generate('<Control-Z>')

# Auto-test ====================================================================
if __name__ == '__main__':
    def afficherTout(event=None):
        lab.configure(text=f'{fra.chk.get()} | {fra.freq:.1f} | {fra.phase:.2f} | {fra.ampl}')
    
    root = tk.Tk()
    fra = ChoixVibra(root, 'navy')
    fra.pack(side=tk.TOP)
    lab = tk.Label(root, text ='test')
    lab.pack()
    root.bind('<Control-Z>', afficherTout)
    root.mainloop()
