############################################################################# # Créé par Jean-Christophe BONNEFOY # le 14/11/2016 en Python 3.5.2 # Exercice 1 du TP n°5 ############################################################################# import PIL.Image import PIL.ImageTk from tkinter.messagebox import showerror #import TkMessageBox from tkinter import * from tkinter.messagebox import * from tkinter import tix from tkinter.constants import * ############################################################################# # fonction qui va vérifier si la chaine ne contient que des chiffres et virgules # parametres : # - chaine : mot à vérifier # la fonction retourne True si tout est conforme et False sinon ############################################################################# def Isnumeric(chaine): reponse = True for i in range(0, len(chaine)): #on verifie dans la table ASCII code_ascii = ord(chaine[i]) if (code_ascii < 44) or (code_ascii == 45) or (code_ascii == 47) or (code_ascii > 57): reponse = False break #on sort du For, on a trouvé un caractére qui ne va pas, alors pas la peine de continuer return reponse class Application: def __init__(self): self.photo_billet = [] self.item_billet = [] self.photo_piece = [] self.item_piece = [] self.fenetre = Tk() self.fenetre.title("Rendu de monnaie") Frame_TXT = LabelFrame(self.fenetre, text=" Données à saisir ", padx=5, pady=5, width=1000) Frame_TXT.pack(side=TOP, fill=X) ssFrame_TXT = Frame(Frame_TXT, padx=5, pady=5, width=1000) ssFrame_TXT.pack(side=TOP, fill=X) lbl_TXT = Label(ssFrame_TXT, text="Montant à payer (en €) : ") lbl_TXT.pack(side=LEFT,padx=2,pady=2) self.txt_prix = Entry(ssFrame_TXT, textvariable=StringVar, width=35) self.txt_prix.pack(side=LEFT, padx=2, pady=2) ssFrame_TXT2 = Frame(Frame_TXT, padx=5, pady=5, width=1000) ssFrame_TXT2.pack(side=TOP, fill=X) lbl_SIZE = Label(ssFrame_TXT2, text="Montant donné par l'acheteur (en €) : ") lbl_SIZE.pack(side=LEFT,padx=2,pady=2) self.txt_montant = Entry(ssFrame_TXT2, textvariable=StringVar, width=35) self.txt_montant.pack(side=LEFT, padx=2, pady=2) Button(self.fenetre,text='Calculer la monnaie',command=self.calculer).pack() Frame_CAN = LabelFrame(self.fenetre, text=" A rendre : ", padx=5, pady=5, width=1000) Frame_CAN.pack(side=TOP, fill=X) self.can=Canvas(Frame_CAN,width=1020,height=400,bg='white') nom_fic = "images_tp5/bb.jpg" image = PIL.Image.open(nom_fic) x=85 for i in range(0,6): photo_temp = PIL.ImageTk.PhotoImage(image) self.photo_billet.append(photo_temp) self.item_billet.append(self.can.create_image(x,80,image=self.photo_billet[i])) x = x + 170 nom_fic = "images_tp5/pb.jpg" image = PIL.Image.open(nom_fic) x=85 for i in range(0,8): photo_temp = PIL.ImageTk.PhotoImage(image) self.photo_piece.append(photo_temp) self.item_piece.append(self.can.create_image(x,250,image=self.photo_piece[i])) x = x + 120 self.can.pack(side=TOP) def calculer(self): if (Isnumeric(self.txt_prix.get())) and (Isnumeric(self.txt_prix.get())): prx = float(self.txt_prix.get().replace(',','.')) montant = float(self.txt_montant.get().replace(',','.')) montant_donne = int(round(montant * 100)) #conversion en centimes prix = int(round(prx * 100)) compteur=0 monnaie = montant_donne-prix # en centimes ma_liste=[200,100,50,20,10,5,2,1,0.50,0.20,0.10,0.05,0.02,0.01] photo = [] print("A rendre :") indexbillet = 0 indexpiece = 0 x_b = 85 y_b = 150 x_p = 85 y_p = 340 for coupure in ma_liste: cents = int(round(coupure*100)) compteur = monnaie // cents monnaie = monnaie % cents if (compteur != 0): message = " -{compteur} {billet}{pluriel} de {euro} {euro_cent}".format(compteur=compteur, billet='billet' if coupure>=5 else 'pièce', pluriel='s' if compteur>1 else '', euro=coupure if coupure>=1 else cents, euro_cent='euro' if coupure>=1 else 'cent') nom_fic = "images_tp5/"+ str(cents) + ".jpg" image = PIL.Image.open(nom_fic) if (coupure >= 5): self.photo_billet[indexbillet] = PIL.ImageTk.PhotoImage(image) self.can.itemconfigure(self.item_billet[indexbillet],image=self.photo_billet[indexbillet]) indexbillet = indexbillet + 1 cpt_billet = "x"+str(compteur) self.can.create_text(x_b,y_b,text=cpt_billet,fill='#50565f',font='Courier 38') x_b = x_b + 170 else: self.photo_piece[indexpiece] = PIL.ImageTk.PhotoImage(image) self.can.itemconfigure(self.item_piece[indexpiece],image=self.photo_piece[indexpiece]) indexpiece = indexpiece + 1 cpt_piece = "x"+str(compteur) self.can.create_text(x_p,y_p,text=cpt_piece,fill='#50565f',font='Courier 38') x_p = x_p + 120 print(message) else: showerror("Erreur de saisie", "Les données doivent être numérique") app=Application() app.fenetre.mainloop()