bollet.c
6 months ago
5 changed files with 222 additions and 27 deletions
@ -0,0 +1,148 @@ |
|||||
|
import tkinter as tk |
||||
|
from datetime import date |
||||
|
from tkinter import messagebox |
||||
|
|
||||
|
|
||||
|
class DateSelection: |
||||
|
def __init__(self, master): |
||||
|
"""initialise le widget""" |
||||
|
|
||||
|
self.master = master |
||||
|
self.value = "0001-01-01" |
||||
|
|
||||
|
frame_btn_date = tk.LabelFrame(self.master, text="Date", font=(25), fg="gray") |
||||
|
frame_btn_date.pack() |
||||
|
|
||||
|
self.button = tk.Button(frame_btn_date, text="Choisir une date", command=self.select) |
||||
|
self.button.pack(padx=10, pady=2, side="left") |
||||
|
|
||||
|
self.aff_date = tk.Label(frame_btn_date, text=self.value, padx=10, pady=2, font=(25), fg="gray") |
||||
|
self.aff_date.pack(padx=10, pady=2, side="left") |
||||
|
|
||||
|
def select(self): |
||||
|
"""permet de choisir une date au format isoformat""" |
||||
|
|
||||
|
self.popup = tk.Toplevel(padx=15, pady=15) |
||||
|
self.popup.wm_title("Veuillez choisir une date") |
||||
|
|
||||
|
frame_choix = tk.LabelFrame(self.popup, text="jour / mois / année", font=(50), fg="gray") |
||||
|
frame_choix.pack() |
||||
|
|
||||
|
self.jour = tk.Spinbox(frame_choix, from_=1, to=31, font=(100), width=2) |
||||
|
self.jour.pack(side="left", padx=10, pady=10) |
||||
|
tk.Label(frame_choix, text="/", font=(100)).pack(side="left") |
||||
|
self.mois = tk.Spinbox(frame_choix, from_=1, to=12, font=(100), width=2) |
||||
|
self.mois.pack(side="left", padx=10, pady=10) |
||||
|
tk.Label(frame_choix, text="/", font=(100)).pack(side="left") |
||||
|
self.annee = tk.Spinbox(frame_choix, from_=1, to=9999, font=(100), width=4) |
||||
|
self.annee.pack(side="left", padx=10, pady=10) |
||||
|
|
||||
|
ok_btn = tk.Button(self.popup, text="OK", command=self.update) |
||||
|
ok_btn.pack() |
||||
|
|
||||
|
def update(self): |
||||
|
"""assigne la date choisie (si elle est valide) à self.valeur, |
||||
|
sinon, ne change rien""" |
||||
|
|
||||
|
val = self.format2iso() |
||||
|
if self.est_valide(val): |
||||
|
self.value = val |
||||
|
self.aff_date['text'] = self.value |
||||
|
self.popup.destroy() |
||||
|
else: |
||||
|
messagebox.showerror("Erreur", "La date n'est pas valide") |
||||
|
|
||||
|
def format2iso(self): |
||||
|
"""renvoie une chaine de caractère avec |
||||
|
la date au format iso""" |
||||
|
|
||||
|
aaaa = "0"*(4-len(self.annee.get())) + self.annee.get() |
||||
|
mm = "0"*(2-len(self.mois.get())) + self.mois.get() |
||||
|
jj = "0"*(2-len(self.jour.get())) + self.jour.get() |
||||
|
|
||||
|
res = aaaa + "-" + mm + "-" + jj |
||||
|
|
||||
|
return res |
||||
|
|
||||
|
def est_valide(self, d): |
||||
|
"""renvoie True si la date d est valide, |
||||
|
False sinon""" |
||||
|
try: |
||||
|
date.fromisoformat(d) |
||||
|
return True |
||||
|
except ValueError: |
||||
|
return False |
||||
|
|
||||
|
def get(self): |
||||
|
"""renvoie la date choisie""" |
||||
|
|
||||
|
return self.value |
||||
|
|
||||
|
class TemperatureSelection: |
||||
|
def __init__(self, master, nom): |
||||
|
"""initialise le widget""" |
||||
|
|
||||
|
self.master = master |
||||
|
|
||||
|
self.value = 0 |
||||
|
|
||||
|
frame_choix = tk.LabelFrame(self.master, text=nom, font=(25), fg="gray") |
||||
|
frame_choix.pack() |
||||
|
|
||||
|
self.choix_tmp = tk.Entry(frame_choix, fg="black") |
||||
|
self.choix_tmp.insert("end", self.value) |
||||
|
self.choix_tmp.pack(side="left", padx=(10,5), pady=10) |
||||
|
self.choix_tmp.bind("<KeyRelease>", lambda e : self.isCorrect()) |
||||
|
tk.Label(frame_choix, text="°C", font=(50), fg="gray").pack(side="left") |
||||
|
|
||||
|
def isCorrect(self): |
||||
|
"""vérifie que la température entrée est correcte""" |
||||
|
val = self.choix_tmp.get() |
||||
|
if is_float(val) and float(val) > -273.15: |
||||
|
self.choix_tmp['bg'] = 'lightgreen' |
||||
|
self.choix_tmp['fg'] = 'black' |
||||
|
return True |
||||
|
else: |
||||
|
self.choix_tmp['bg'] = 'red' |
||||
|
self.choix_tmp['fg'] = 'white' |
||||
|
return False |
||||
|
|
||||
|
def get(self): |
||||
|
"""renvoie la température choisie""" |
||||
|
|
||||
|
if self.isCorrect(): |
||||
|
return float(self.choix_tmp.get()) |
||||
|
else: |
||||
|
return 0 #valeur par défaut |
||||
|
|
||||
|
|
||||
|
class VoisinSelection: |
||||
|
def __init__(self, master): |
||||
|
"""initialise le widget""" |
||||
|
|
||||
|
self.master = master |
||||
|
|
||||
|
frame_choix = tk.LabelFrame(self.master, text="Nombre de voisins (k)", font=(25), fg="gray") |
||||
|
frame_choix.pack() |
||||
|
|
||||
|
self.choix_k = tk.Entry(frame_choix, font=(100), width=3) |
||||
|
self.choix_k.insert("end", "1") |
||||
|
self.choix_k.pack(pady=10) |
||||
|
|
||||
|
def get(self): |
||||
|
"""renvoie le nombre de voisins""" |
||||
|
c = self.choix_k.get() |
||||
|
return int(c) if c.isdigit() and int(c) != 0 else 1 |
||||
|
|
||||
|
|
||||
|
#fonction axiliaire |
||||
|
def is_float(element): |
||||
|
if element is None: |
||||
|
return False |
||||
|
try: |
||||
|
float(element) |
||||
|
return True |
||||
|
except ValueError: |
||||
|
return False |
||||
|
|
||||
|
|
Loading…
Reference in new issue