.

Logiciel de dessin

.

téléchager application dessin

.

Vidéo

download html5 video by EasyHtml5Video.com v4.0

.

Vidéo

html5 video api by EasyHtml5Video.com v3.9.1

.

Logiciel de dessin

.

Programmation orientée objet

OBJECTIF

Construire un programme qui possède un menu pour faire des dessins et pour les sauvegarder dans des fichiers

  • Afficher une fenêtre, avec un titre .
  • Inclure dans la fenêtre un canevas (Canvas) pour afficher des figures qui peuvent se déplacer .
  • Utiliser les fichiers pour stocker les créations.

.

Le code du programme:

_images/tpage10001.PNG
_images/tpage10002.PNG
_images/tpage10003.PNG

Affichage de la classe logiciel :

Exported from Notepad++
#1106 dessiner.py from tkinter import* from tkinter.colorchooser import* import subprocess import os from math import* from tkinter.filedialog import* from PIL import ImageGrab class logiciel(): """classe logiciel de base""" def __init__(self,donnees): #methode constructeur fenetre,can,largeur=donnees[0],donnees[1],donnees[2] hauteur,l_widgets,nb= donnees[3],donnees[4],donnees[5] self.d=donnees self.fen=[fenetre,str(donnees[2])+"x"+str(donnees[3]),"Logiciel","white"] self.enregistrer=False self.texted="" self.saisie=StringVar() self.copie="" self.ltg=[] self.x=0 self.y=0 self.xinit=0 self.yinit=0 self.delite=[] b1="non" self.tx,self.ty=largeur/2,hauteur/2 self.precedent=(None,None) self.transparent="" self.couleur='blue' self.couleur1='' self.widget=can.create_rectangle(self.xinit,self.yinit,self.x,self.y,fill=self.couleur) self.figure=0 self.fichier='' self.epaisseur=3 def creer_fenetre(self,fl): #fonction qui redimensionne, donne le titre #et l'icône de la fenêtre ainsi que la couleurfl[0] fl[0].geometry(fl[1]) # redimensionne la fenêtre fl[0].title(fl[2]) # affiche le titre dans la fenêtre fl[0].configure(bg=fl[3])# change la couleur du fond return fenetre def run(): c = reportlab.pdfgen.canvas.Canvas('colortest02.pdf') def courbe(self,fonction,debut,fin): #trace une courbe dans un canevas largeur,hauteur=self.d[2],self.d[3] hi=hauteur/2 #axe abscisses self.widget=can.create_line(20,hi,largeur-20,hi,fill="black",width=1,arrow=LAST) #axe des ordonnées self.widget=can.create_line(20,hauteur-20,20,20,fill="black",width=1,arrow=LAST) long=int(fin-debut) pas=int((largeur-40)/long) unite=int(hi/pas) for i in range(long): abscisse=i*pas self.widget=can.create_line(abscisse,hi-10,abscisse,hi+10,fill="black",width=1) self.widget=can.create_text(abscisse,hi+20,text=str(debut+i)) if i!=0: self.widget=can.create_line(abscisse,hi-10,abscisse,10,fill="black",width=1,dash=(3,5)) self.widget=can.create_line(abscisse,hi+20,abscisse,hauteur-20,fill="black",width=1,dash=(3,5)) for i in range(unite): ordonnee=i*pas self.widget=can.create_line(15,hi-i*pas,25,hi-i*pas,fill="black",width=1) if i!=0: self.widget=can.create_line(25,hi-i*pas,largeur-20,hi-i*pas,fill="black",width=1,dash=(3,5)) self.widget=can.create_line(25,hi+i*pas,largeur-20,hi+i*pas,fill="black",width=1,dash=(3,5)) self.widget=can.create_text(10,hi-i*pas,text=str(i)) self.widget=can.create_line(15,hi+i*pas,25,hi+i*pas,fill="black",width=1) self.widget=can.create_text(10,hi+i*pas,text=str(-i)) x1=20 y1=hi for i in range(0,1000*long): x=debut+i/(1000*long)*((long))*pas y=hi+pas*fonction(x*pi/(pas)) x= x-debut+20 self.widget=can.create_line(x1,y1,x,y,fill="red",width=2,smooth=1) x1,y1=x,y def change_couleur(self): #change la couleur de la figure coul="" self.transparent="non" coul=askcolor(coul) self.couleur=coul[1] self.couleur1=coul[1] def transparence(self): #effectue la transparence self.transparent="oui" def sans_trace(self,event): self.b1="non" def Aide(self): can=self.d[1] txt=can.create_text(260, 75, text="Pour dessiner click gauche souris", font="Arial 16 italic", fill="green") txt=can.create_text(260, 125, text="Pour déplacer les objets click droit souris", font="Arial 16 italic", fill="green") def debut(self,event): #début du tracé texte1=self.texted self.b1="oui" clair=self.transparent self.precedent=(None,None) self.xinit,self.yinit=event.x,event.y x,y=self.xinit,self.yinit self.precedent=x,y epais=self.epaisseur if self.figure==1: if clair=="non": self.widget=can.create_rectangle(x-1,y-1,x+10,y+10,outline=self.couleur,fill=self.couleur1,width=epais) else: self.widget=can.create_rectangle(x-1,y-1,x+10,y+10,outline=self.couleur,fill='',width=epais) if self.figure==2: if clair=="non": self.widget=can.create_oval(x-1,y-1,x+10,y+10,outline=self.couleur,fill=self.couleur1,width=epais) else: self.widget=can.create_oval(x-1,y-1,x+10,y+10,outline=self.couleur,fill='',width=epais) if self.figure==3: self.widget=can.create_line(x-1,y-1,x,y,fill=self.couleur,width=epais) if self.figure==5: self.widget=can.create_line(x-1,y-1,x,y,fill=self.couleur,width=epais) if self.figure==4: item=can.create_text(500,200,text=texte1,fill=self.couleur,justify='center',font="verdana 20 bold",anchor='n') def change(self,event): "Opération à effectuer quand le bouton gauche de la souris est enfoncé" # event.x et event.y contiennent les coordonnées du clic effectué : x1, y1 = event.x, event.y self.xinit,self.yinit=x1,y1 x0,y0=x1+5,y1+5 if self.figure<6 : # <find_closest> renvoie la référence du dessin le plus proche : item = can.find_closest(x1,y1) item=can.addtag_overlapping("OME",x0, y0, x1, y1)# can.itemconfig("OME") can.lift("OME") def deplace(self,event): "Op. à effectuer quand la souris se déplace, bouton gauche enfoncé" x2, y2 = event.x, event.y self.x,self.y=x2,y2 dx, dy = x2 -self.xinit, y2 -self.yinit #selObject=can.addtag_enclosed("OME",x0, y0, x1, y1) # if selObject: can.move("OME", dx, dy) self.xinit,self.yinit = x2, y2 def relache(self, event): "Op. à effectuer quand le bouton gauche de la souris est relâché" can.itemconfig("OME") can.dtag("OME","OME") def tracer_dessin(self,event): a=self.figure item=self.widget xd,yd=self.xinit,self.yinit item=self.widget x,y=event.x,event.y self.x,self.y = x, y couleur1=self.couleur1 couleur=self.couleur epais=self.epaisseur #print(couleur,couleur1,self.transparent) if a==1 or a==2 : if self.transparent=="non": can.itemconfigure(item, width =epais,fill=self.couleur1) can.coords(item,xd,yd,x,y) else: can.itemconfigure(item, width =epais,fill='') can.coords(item,xd,yd,x,y) if a==4 : can.itemconfigure(item, width =epais) can.coords(item,xd,yd,x,y) if a==5: can.coords(item,xd,yd,x,y) if a==3: xd,yd=self.precedent can.create_line(xd,yd, x,y,fill=self.couleur,width=epais) self.precedent=self.x,self.y def nom_fichier(self,saisie): self.figure=4 texteun="" texteun=self.copier(saisie) self.fichier=texteun def tracer_rectangle(self): self.figure=1 def tracer_ellipse(self): self.figure=2 def tracer_ligne(self): self.figure=3 def tracer_trait(self): self.figure=5 def copier(self,saisie): copie=saisie.get() saisie.set("") textecl=copie self.enregistrer=True return textecl def framePage(canvas, title): canvas.setFont('Times-BoldItalic',20) canvas.drawString(inch, 10.5 * inch, title) canvas.setFont('Times-Roman',10) canvas.drawCentredString(4.135 * inch, 0.75 * inch, 'Page %d' % canvas.getPageNumber()) canvas.setStrokeColorRGB(1,0,0) canvas.setLineWidth(5) canvas.line(0.8 * inch, inch, 0.8 * inch, 10.75 * inch) #reset carefully afterwards canvas.setLineWidth(1) canvas.setStrokeColorRGB(0,0,0) def geoliste(self,g): g=g.replace("+"," ") g=g.replace("x"," ") lst=[] lst=g.split() return [int(lst[0]),int(lst[1]),int(lst[2]),int(lst[3])] def imprimer(self): fenetre=self.d[0] can=self.d[1] largeur,hauteur=self.d[2],self.d[3] can=self.d[1] largeur,hauteur=self.d[2],self.d[3] dimension=4*[0] dimension=self.geoliste(fenetre.geometry()) fichier11=open("save.txt","w") for i in range(1,5): fichier11.write(str(dimension[i-1])+"\n") fichier11.close() def epaisseur_trait3(self): self.epaisseur=3 def epaisseur_trait5(self): self.epaisseur=5 def epaisseur_trait8(self): self.epaisseur=8 def epaisseur_trait10(self): self.epaisseur=10 def clic(self,inutile,texte,liste): self.figure=4 can=self.d[1] self.texted=liste.get(liste.curselection())+" \n" texte1=self.texted item=Label(can,text=texte1,fill="red",justify='center',font="verdana 20 bold",anchor='n') self.widget=item def run(self): titre="Logiciel" ft="verdana 12 bold" fl=self.d fenetre=self.d[0] fenetre=self.creer_fenetre(self.fen) fenetre.resizable(width=False,height=False) can=self.d[1] fe=[self.fen[0],"Entrer les données","light blue"] #self.framePage(c, '-pages de démonstrations RGB CMYK ' ) # Creation du systeme de menu (variable explicite sysdemenu): sysdemenu = Menu(fenetre) # Creation du premier menu: menu1= Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label="Enregistrer",command=self.sauvegarder) menu1.configure(bg='light green') # addition des sous-items du second item du second menu et leur commande associee menu2 = Menu(sysdemenu) sysdemenu.add_cascade(label="Couleurs",command=lambda:self.change_couleur()) menu2.configure(bg='gold') # addition des deux items pour le premier menu et leur commande associee mt=["Rectangle","Ellipse","Ligne","Trait"] menu3 = Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label="figures", menu=menu3) menu3.configure(bg='white') menu3.add_command(compound='center',label='Rectangle',command=self.tracer_rectangle) menu3.add_command(label='elipse',command=self.tracer_ellipse) menu3.add_command(label='ligne',command=self.tracer_ligne) menu3.add_command(label='trait',command=self.tracer_trait) # addition du second item pour le second menu et leur sous-items associes menu4 = Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label='Epaisseur', menu=menu4) menu4.configure(bg='light green') menu4.add_command(compound='center',label='▁▁',command=self.epaisseur_trait3) menu4.add_command(label='▂▂',command=self.epaisseur_trait5) menu4.add_command(label='▃▃',command=self.epaisseur_trait8) menu4.add_command(label='▄▄',command=self.epaisseur_trait10) menu5 = Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label="Transparent",command=self.transparence) menu5.configure(bg='light blue') menu7 = Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label="Effacer",command=lambda :can.delete(ALL)) menu8 = Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label="Aide", menu=menu8) menu8.configure(bg='pink') menu8.add_command(label="Aide",command=self.Aide) fenetre.config(menu=sysdemenu) fenetre.bind("<Button1-Motion>",lambda event:self.tracer_dessin(event)) fenetre.bind("<Button-1>",lambda event:self.debut(event)) fenetre.bind("<Button1-ButtonRelease>",lambda event:self.sans_trace(event)) fenetre.bind("<Button-3>", lambda event:self.change(event)) can.tag_bind("OME","<Button3-Motion>", self.deplace) can.tag_bind("OME","<Button3-ButtonRelease>",self.relache) def sauvegarder(self): dimension=fenetre.geometry() larg='' haut='' cote='' dessus='' k=0 for i in range(int(len(dimension))): if dimension[i]=='x' or dimension[i]=='+': k=k+1 if dimension[i]!='x' or dimension[i]!='+': if k==0:arg=larg+dimension[i] if k==1: haut=haut+dimension[i] if k==2:cote=cote+dimension[i] if k==3: dessus=dessus+dimension[i] X,Y,L,H=fenetre.winfo_width()-1,fenetre.winfo_height(),int(cote),int(dessus) a,b,c,d=L+15,H+55,X+L,Y+H img2 = ImageGrab.grab((a,b,c,d)) largeur=fenetre.winfo_width() hauteur=fenetre.winfo_height() #img.save(fichier) # sauvegarde le fichier sur disque... fichier = asksaveasfilename(title="Enregistrer",filetypes=[('all files','.*')]) img2.save(fichier) fenetre=Tk() largeur=fenetre.winfo_screenwidth() hauteur=fenetre.winfo_screenheight() fichier1='' can=Canvas(fenetre,bg='white',width=largeur,height=hauteur) can.grid(row=0,column=0) l_widgets,nb=[],10 donnees=[fenetre,can,largeur,hauteur,l_widgets,nb] dessin=logiciel(donnees) dessin.run() fenetre.mainloop()