You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.8 KiB
148 lines
4.8 KiB
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
|
|
|
|
|