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