diff --git "a/seance4_4h/exo_s\303\251ances/Exo1.py" "b/seance4_4h/exo_s\303\251ances/Exo1.py" new file mode 100644 index 0000000000000000000000000000000000000000..525f003b950d8477891020563482146ecee9cdc2 --- /dev/null +++ "b/seance4_4h/exo_s\303\251ances/Exo1.py" @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Oct 16 13:36:20 2020 + +@author: marga +""" + +import random +from tkinter import * + +def tirage(): + nb = random.randint(1, 100) + texteResultat.set('Nombre : ' + str(nb)) + +if __name__ == '__main__': + + # création de l'arbre de scène + racine = Tk() # Appel à une méthode de classe (et non un constructeur, cf slide cours #2) + racine.title('Tirage aléatoire') + racine.geometry('300x100+400+400') + + # Les widgets de la scène + boutonLancer = Button(racine, text='Tirage') + boutonLancer.pack(side=LEFT, padx=5, pady=5) + texteResultat = StringVar() + labelResultat = Label(racine, textvariable=texteResultat) + labelResultat.pack(side=LEFT, padx=5, pady=5) + boutonQuitter = Button(racine, text='Quitter') + boutonQuitter.pack(side=LEFT, padx=5, pady=5) + + + # association des commandes aux widgets + boutonLancer.config(command=tirage) # appel dit callback (pas de parenthèses) + boutonQuitter.config(command=racine.destroy) # idem + racine.mainloop() # affichage de l'interface jusqu'à quit diff --git "a/seance4_4h/exo_s\303\251ances/Exo2.py" "b/seance4_4h/exo_s\303\251ances/Exo2.py" new file mode 100644 index 0000000000000000000000000000000000000000..28d14c5ea3d6928575f516660613c7492b20f8be --- /dev/null +++ "b/seance4_4h/exo_s\303\251ances/Exo2.py" @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Oct 16 14:15:32 2020 + +@author: marga +""" + +import random +from tkinter import * + +if __name__ == '__main__': + + # création de l'arbre de scène + racine = Tk() # Appel à une méthode de classe (et non un constructeur, cf slide cours #2) + racine.title('Tk') + racine.geometry('300x100+400+400') + + # Les widgets de la scène + boutonRectangle = Button(racine, text='Rectangle') + boutonRectangle.pack(side=LEFT, padx=5, pady=5) + + boutonEllipse = Button(racine, text='Ellipse') + boutonEllipse.pack(side=LEFT, padx=5, pady=5) + + boutonCouleur = Button(racine, text='Couleur') + boutonCouleur.pack(side=LEFT, padx=5, pady=5) + + boutonQuitter = Button(racine, text='Quitter') + boutonQuitter.pack(side=LEFT, padx=5, pady=5) + + # association des commandes aux widgets + boutonQuitter.config(command=racine.destroy) # idem + racine.mainloop() # affichage de l'interface jusqu'à quit diff --git "a/seance4_4h/exo_s\303\251ances/Exo3.py" "b/seance4_4h/exo_s\303\251ances/Exo3.py" new file mode 100644 index 0000000000000000000000000000000000000000..b6983d63cf784aa405ba79bafe3eaa4743ca222e --- /dev/null +++ "b/seance4_4h/exo_s\303\251ances/Exo3.py" @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Oct 16 14:37:21 2020 + +@author: marga +""" + +from tkinter import * +from formes import * +from tkinter import colorchooser + +class ZoneAffichage(Canvas): + + def __init__(self, parent, largeur, hauteur): + Canvas.__init__(self, parent, width=largeur, height=hauteur) + self.formeActuelle="Rectangle" + self.__ListeForme=[] + self.couleur='purple' + # self.selection=[] + self.__forme_deplacee=None + + def ajout_forme(self,x,y): + if self.formeActuelle=="Rectangle": + f=Rectangle(self, x-5, y-10, 10, 20, self.couleur) + self.__ListeForme.append(f) + else: + f=Ellipse(self,x-5, y-10, 20, 10, self.couleur) + self.__ListeForme.append(f) + + # def ajout_rectangle(self,x,y): + # r=Rectangle(self,x-5, y-10, 10, 20, couleur='purple') + + # def ajout_ellipse(self,x,y): + # e=Ellipse(self,x-5, y-10, 10, 20, couleur='gold') + + def selection_rectangle(self): + self.formeActuelle="Rectangle" + + def selection_ellipse(self): + self.formeActuelle="Ellipse" + + def delete_forme(self,x,y): + for f in self.__ListeForme: + if f.contient_point(x,y)==True: + f.effacer() + self.__ListeForme.remove(f) + break + + def selection_couleur(self): + ask_couleur = colorchooser.askcolor(title ="Choisir la couleur") + self.couleur=ask_couleur[1] + + + def deplacement_forme(self, x0, y0, x1, y1): + try: + if self.__forme_deplacee == None: + self.__forme_deplacee = next(f for f in reversed(self.__formes) + if f.contient_point(x0, y0)) + self.__forme_deplacee.deplacement(x1 - x0, y1 - y0) + except: + pass + + def fin_deplacement(self): + self.__forme_deplacee = None + + # def selection1 (self,x,y): + # for f in self.__ListeForme: + # if f.contient_point(x,y)==True: + # self.selection.append(f) + # self.__ListeForme.remove(f) + # break + + # def change_coord(self,new_x,new_y): + # if len(self.selection)!=0: + # f=self.selection[0] + # self.selection.pop() + # f.x=new_x + # f.y=new_y + # self.__ListeForme.append(f) + +class FenPrincipale(Tk): + + def __init__(self): + Tk.__init__(self) + # L'initialisation de l'arbre de scène se fait ici + + self.configure(bg="grey") + + barreOutils = Frame(self) + barreOutils.pack(side=TOP) + + # Les widgets de la scène + boutonRectangle = Button(barreOutils, text='Rectangle') + boutonRectangle.pack(side=LEFT, padx=5, pady=5) + + boutonEllipse = Button(barreOutils, text='Ellipse') + boutonEllipse.pack(side=LEFT, padx=5, pady=5) + + boutonCouleur = Button(barreOutils, text='Couleur') + boutonCouleur.pack(side=LEFT, padx=5, pady=5) + + boutonQuitter = Button(barreOutils, text='Quitter') + boutonQuitter.pack(side=LEFT, padx=5, pady=5) + + self.__canevas=ZoneAffichage(self,600,400) + self.__canevas.pack(side=TOP,padx=10,pady=10) + + self.__canevas.bind('<ButtonRelease-1>', self.release_canevas) + self.__canevas.bind('<Control-ButtonRelease-1>', self.erase_forme) + + + self.__canevas.bind("<Button-1>", self.clic_canevas) + self.__canevas.bind("<Control-ButtonRelease-1>", self.control_clic_canevas) + self.__deplacement_en_cours = False + self.__dernier_x = 0 + self.__dernier_y = 0 + self.__canevas.bind("<ButtonRelease-1>", self.release_canevas) + self.__canevas.bind("<B1-Motion>", self.drag_canevas) + + + # self.__canevas.bind('<Button-1>', self.clic_canevas) + # self.__canevas.bind('<B1-Motion>', self.control_clic_canevas) + # self.__deplacement_en_cours=False + # self.__dernier_x=0 + # self.__dernier_y=0 + # self.__canevas.bind('<ButtonRelease-1>', self.release_canevas) + # self.__canevas.bind('<B1-Motion>', self.drag_canevas) + + # self.__canevas.bind('<Button-1>', self.selection_forme) + # self.__canevas.bind('<ButtonRelease-1>', self.new_coordonnees) + + + boutonRectangle.config(command=self.__canevas.selection_rectangle) + boutonEllipse.config(command=self.__canevas.selection_ellipse) + + boutonCouleur.config(command=self.__canevas.selection_couleur) + + def release_canevas(self,event): + self.__canevas.ajout_forme(event.x,event.y) + + def erase_forme(self,event): + self.__canevas.delete_forme(event.x,event.y) + + def clic_canevas(self, event): + self.__dernier_x = event.x + self.__dernier_y = event.y + + def control_clic_canevas(self, event): + self.__canevas.suppression_forme(event.x, event.y) + + def release_canevas(self, event): + if not self.__deplacement_en_cours: + self.__canevas.ajout_forme(event.x, event.y) + else: + self.__canevas.fin_deplacement() + self.__deplacement_en_cours = False + + def drag_canevas(self, event): + self.__canevas.deplacement_forme(self.__dernier_x, self.__dernier_y, event.x, event.y) + self.__deplacement_en_cours = True + self.__dernier_x = event.x + self.__dernier_y = event.y + + + # def selection_forme(self,event): + # self.__canevas.selection1(event.x,event.y) + + # def new_coordonnees(self,event): + # self.__canevas.change_coord(event.x,event.y) + + + + # # association des commandes aux widgets + # boutonRectangle.config(command=self.__canevas.selection_rectangle) + # boutonEllipse.config(command=self.__canevas.selection_ellipse) + # #boutonRectangle.config(command=ajout_forme) + # boutonQuitter.config(command=barreOutils.destroy) + # boutonQuitter.config(command=canevas.destroy) + # barreOutils.mainloop() # affichage de l'interface jusqu'à quit + +if __name__ == "__main__": + fen = FenPrincipale() + fen.mainloop() diff --git "a/seance4_4h/exo_s\303\251ances/Forme.py" "b/seance4_4h/exo_s\303\251ances/Forme.py" new file mode 100644 index 0000000000000000000000000000000000000000..86b9526f77b21802cdea5f8ea44584c653c847a2 --- /dev/null +++ "b/seance4_4h/exo_s\303\251ances/Forme.py" @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Oct 16 14:41:32 2020 + +@author: marga +""" + +class Forme: + def __init__(self, canevas, x, y): + self.__canevas = canevas + self._item = None + self.x = x + self.y = y + + def effacer(self): + self.__canevas.delete(self._item) + + def deplacement(self, dx, dy): + self.__canevas.move(self._item, dx, dy) + self.x += dx + self.y += dy + +class Rectangle(Forme): + def __init__(self, canevas, x, y, l, h, couleur): + Forme.__init__(self, canevas, x, y) + self._item = canevas.create_rectangle(x, y, x+l, y+h, fill=couleur) + self.__l = l + self.__h = h + + def __str__(self): + return f"Rectangle d'origine {self.x},{self.y} et de dimensions {self.__l}x{self.__h}" + + def get_dim(self): + return self.__l, self.__h + + def set_dim(self, l, h): + self.__l = l + self.__h = h + + def contient_point(self, x, y): + return self.x <= x <= self.x + self.__l and \ + self.y <= y <= self.y + self.__h + + def redimension_par_points(self, x0, y0, x1, y1): + self.x = min(x0, x1) + self.y = min(y0, y1) + self.__l = abs(x0 - x1) + self.__h = abs(y0 - y1) + +class Ellipse(Forme): + def __init__(self, canevas, x, y, rx, ry, couleur): + Forme.__init__(self, canevas, x, y) + self._item = canevas.create_oval(x-rx, y-ry, x+rx, y+ry, fill=couleur) + self.__rx = rx + self.__ry = ry + + def __str__(self): + return f"Ellipse de centre {self.x},{self.y} et de rayons {self.__rx}x{self.__ry}" + + def get_dim(self): + return self.__rx, self.__ry + + def set_dim(self, rx, ry): + self.__rx = rx + self.__ry = ry + + def contient_point(self, x, y): + return ((x - self.x) / self.__rx) ** 2 + ((y - self.y) / self.__ry) ** 2 <= 1 + + def redimension_par_points(self, x0, y0, x1, y1): + self.x = (x0 + x1) // 2 + self.y = (y0 + y1) // 2 + self.__rx = abs(x0 - x1) / 2 + self.__ry = abs(y0 - y1) / 2 diff --git "a/seance4_4h/exo_s\303\251ances/formes.py" "b/seance4_4h/exo_s\303\251ances/formes.py" new file mode 100644 index 0000000000000000000000000000000000000000..964e35cbe688d0fbd2d88b01dffa8f70f6dc8320 --- /dev/null +++ "b/seance4_4h/exo_s\303\251ances/formes.py" @@ -0,0 +1,67 @@ +class Forme: + def __init__(self, canevas, x, y): + self.__canevas = canevas + self._item = None + self.x = x + self.y = y + + def effacer(self): + self.__canevas.delete(self._item) + + def deplacement(self, dx, dy): + self.__canevas.move(self._item, dx, dy) + self.x += dx + self.y += dy + +class Rectangle(Forme): + def __init__(self, canevas, x, y, l, h, couleur): + Forme.__init__(self, canevas, x, y) + self._item = canevas.create_rectangle(x, y, x+l, y+h, fill=couleur) + self.__l = l + self.__h = h + + def __str__(self): + return f"Rectangle d'origine {self.x},{self.y} et de dimensions {self.__l}x{self.__h}" + + def get_dim(self): + return self.__l, self.__h + + def set_dim(self, l, h): + self.__l = l + self.__h = h + + def contient_point(self, x, y): + return self.x <= x <= self.x + self.__l and \ + self.y <= y <= self.y + self.__h + + def redimension_par_points(self, x0, y0, x1, y1): + self.x = min(x0, x1) + self.y = min(y0, y1) + self.__l = abs(x0 - x1) + self.__h = abs(y0 - y1) + +class Ellipse(Forme): + def __init__(self, canevas, x, y, rx, ry, couleur): + Forme.__init__(self, canevas, x, y) + self._item = canevas.create_oval(x-rx, y-ry, x+rx, y+ry, fill=couleur) + self.__rx = rx + self.__ry = ry + + def __str__(self): + return f"Ellipse de centre {self.x},{self.y} et de rayons {self.__rx}x{self.__ry}" + + def get_dim(self): + return self.__rx, self.__ry + + def set_dim(self, rx, ry): + self.__rx = rx + self.__ry = ry + + def contient_point(self, x, y): + return ((x - self.x) / self.__rx) ** 2 + ((y - self.y) / self.__ry) ** 2 <= 1 + + def redimension_par_points(self, x0, y0, x1, y1): + self.x = (x0 + x1) // 2 + self.y = (y0 + y1) // 2 + self.__rx = abs(x0 - x1) / 2 + self.__ry = abs(y0 - y1) / 2