1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #-*- coding : utf8 -*-
#importation de fonctions externes
from tkinter import * #importation du module graphique tkinter sous python 3. /!\ a ne pas confondre avec Tkinter avec python 2
import time#importation module time pour la mesure du tps
#import re#importation du module re pour travailler avec les expression régulière
# *** DEFINITION LOCAL DE CLASSE
class LabelRb(Label):#on fait hériter cette classe de la classe Label
"""
classe pr créer des label identique d'aspect
"""
def __init__(self, parent, contenu, lig, col):#methode constructeur
Label.__init__(self, parent)#on appel le constructeur de la classe Label
self.grid(row=lig, column=col)
self.configure(text=contenu, bg="#EED8AE", fg="blue")
class EntryRb(Entry):#on fait hériter cette classe de la classe Entry
"""
classe pour crée des Entry identique d'aspect et de propriété notament pr le clic de souris
"""
def __init__(self, parent, contenu,lig, col):#methode constructeur
#print(parent.geometry)
Entry.__init__(self, parent)#on appel le constructeur de la classe Entry à qui on affecte l'objet crée ds nouvelle classe issue de l'héritage. On obtient un Entry que l'on peut adapter à nos besoins.
self.grid(row=lig, column=col, sticky=E+W)#on applique la méthode de positionnement grid() à self. Ceci possible car self et par défaut un Entry
self.config(width="7")
self.insert(0, contenu)#on insert par défaut la valeur 0 ds tous les Entry instancié.
self.bind("<Button-1>", lambda event=None: self.deleteEntry())#au clic gauche, on appel la méthode deleteEntry qui met à vide l'Entry.
#print(self.master.winfo_height)
#print("qqc")
def deleteEntry(self):#méthode qui vide l'entry. On donne en argument self, bien qu'à l'appel de la méthode on n'en donne pas.
self.delete(0,END)#on efface le contenu de l'Entry du début (indice 0), jusqu'au dernier indice (END, END permet de connaitre cet indice ss calcul)
class ButtonRb(Button):
"""
classe pr créer des Button identique d'aspect
"""
def __init__(self, parent, contenu, lig, col):#methode constructeur.
#parent=le contenant parent, contenu=le label du bouton, lig et col=position du widget avec grid(), action=commad à executer par button
Button.__init__(self, parent)#on appel le constructeur de la classe Button
self.config(text=contenu, bg="#EED8AE", fg="blue")#ligne qui permet d'ajouter des attribut à l'objet
self.grid(row=lig, column=col, sticky=E+W, ipadx=0, ipady=0)#on applique la méthode de positionnement grid() à self.
fenPrin=Tk()
fenPrin.title("Compte à rebours")
fenPrin.configure(bg="#EED8AE")
#LIGNE 0
entIntitule=EntryRb(fenPrin, "Titre du compte à rebours", "0", "0")
#LIGNE 1
#FRAME frmTps . Frame contenant les widget relatif au temps
frmTps=Frame(fenPrin, bg="#EED8AE")
frmTps.grid(row="1", column="0")
#--frmTps LIGNE 0
lblHeure=LabelRb(frmTps, "Heure", "0", "0")#instanciation des Label
lblMin=LabelRb(frmTps, "Minute", "0", "1")
lblSec=LabelRb(frmTps, "Seconde", "0", "2")
lblTitreDec=LabelRb(frmTps, "Temps restant", "0", "3")
#--frmTps LIGNE 1
entHeure=EntryRb(frmTps, "0", "1", "0")#instanciation des Entry
entMin=EntryRb(frmTps, "0", "1", "1")
entSec=EntryRb(frmTps, "0", "1", "2")
lblAffDec=LabelRb(frmTps, "00 00 00", "1", "3")#Label d'affichage du décompte
#LIGNE 2
#FRAME frmBt. Frame contenant les boutons
frmBt=Frame(fenPrin, bg="#EED8AE")
frmBt.grid(row="2", column="0", sticky=E+W)
frmBt.columnconfigure(0, weight=3)
frmBt.columnconfigure(1, weight=3)
frmBt.columnconfigure(2, weight=0)
#création de la liste contenant les Entry des H M N
lstTps=list()#instantiation de la liste
lstTps=[entHeure, entMin, entSec]
#--frmBt LIGNE 0
btArret=ButtonRb(frmBt, "Quitter", "0","0")
btStart=ButtonRb(frmBt, "Départ", "0","1")
btReset=ButtonRb(frmBt, "Mise à zéro", "0","2")
fenPrin.mainloop()#la fenêtre principale est en attente d'action |