From b13a6f34bc6a72afb8ed0794dda534bd2f2f1c0f Mon Sep 17 00:00:00 2001
From: GParamucchio <72977930+GParamucchio@users.noreply.github.com>
Date: Fri, 16 Oct 2020 17:44:06 +0200
Subject: [PATCH] =?UTF-8?q?J'ai=20r=C3=A9pondu=20jusqu'=C3=A0=20la=20quest?=
 =?UTF-8?q?ion=207=20du=20BE4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 seance4_4h/Exo1.py         |  35 ++++++++++++
 seance4_4h/Exo3.py         |  85 +++++++++++++++++++++++++++++
 seance4_4h/brouillonBE4.py |  44 +++++++++++++++
 seance4_4h/formes.py       |  12 ++++-
 seance4_4h/partie3.py      | 107 +++++++++++++++++++++++++++++++++++++
 5 files changed, 281 insertions(+), 2 deletions(-)
 create mode 100644 seance4_4h/Exo1.py
 create mode 100644 seance4_4h/Exo3.py
 create mode 100644 seance4_4h/brouillonBE4.py
 create mode 100644 seance4_4h/partie3.py

diff --git a/seance4_4h/Exo1.py b/seance4_4h/Exo1.py
new file mode 100644
index 0000000..2559768
--- /dev/null
+++ b/seance4_4h/Exo1.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Oct 16 13:40:59 2020
+
+@author: gabip
+"""
+
+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
+    boutonQuitter = Button(racine, text='Quitter')
+    boutonQuitter.pack(side=LEFT, padx=5, pady=5)    
+    texteResultat = StringVar()
+    labelResultat = Label(racine, textvariable=texteResultat)
+    labelResultat.pack(side=LEFT, padx=10, pady=10)
+    boutonLancer = Button(racine, text='Tirage')
+    boutonLancer.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/Exo3.py b/seance4_4h/Exo3.py
new file mode 100644
index 0000000..d9ebf3d
--- /dev/null
+++ b/seance4_4h/Exo3.py
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Oct 16 14:35:07 2020
+
+@author: gabip
+"""
+from tkinter import *
+from formes import *
+from tkinter.colorchooser import askcolor
+
+class ZoneAffichage(Canvas):
+    def __init__(self, parent, largeur, hauteur):
+        Canvas.__init__(self, parent, width=largeur, height=hauteur)
+        self.forme_actuelle = 'Rectangle'
+        self.__ListeFormes=[]
+        self.__forme_deplacee = None
+    
+    def ajout_forme(self,x,y):
+        if self.forme_actuelle == 'Rectangle':
+            f= Rectangle(self,x, y ,20 ,10,'brown')
+            self.__ListeFormes.append(f)
+        else:
+            f= Ellipse(self,x,y,25,25,'brown')
+            self.__ListeFormes.append(f)
+    def selection_rectangle(self):
+        self.forme_actuelle='Rectangle'
+    def selection_ellipse(self):
+        self.forme_actuelle='Ellipse'
+    
+    def effacer(self,x,y):
+        for i in self.__ListeFormes:
+            if i.contient_point(x,y)==True:
+                i.effacer()
+                self.__ListeFormes.remove(i)
+                break
+    def color(self):
+        couleur=askcolor()[1]
+        for f in self.__ListeFormes:
+            f.change_couleur(couleur)
+        
+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)
+        
+        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)
+        boutonRectangle.config(command=self.__canevas.selection_rectangle)
+        boutonEllipse.config(command=self.__canevas.selection_ellipse)
+        self.__canevas.bind('<Control-Button-1>',self.ctrlclick)
+        boutonCouleur.config(command=self.__canevas.color)
+        self.__canevas.bind('<Button-1>',self.clic_canevas)
+        
+    def release_canevas(self,event):
+        self.__canevas.ajout_forme(event.x,event.y)
+    
+    
+    
+    def ctrlclick(self,event):
+        self.__canevas.effacer(event.x,event.y)
+        
+    def clic_canevas(self,event):
+        pass
+    
+    
+if __name__ == "__main__":
+    fen = FenPrincipale()
+    fen.mainloop()        
+    
+
diff --git a/seance4_4h/brouillonBE4.py b/seance4_4h/brouillonBE4.py
new file mode 100644
index 0000000..d02f5cc
--- /dev/null
+++ b/seance4_4h/brouillonBE4.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Oct 16 16:03:01 2020
+
+@author: gabip
+"""
+
+def choixrect():
+        self.__selection='Rectangle'
+    def choixellipse():
+        self.__selection='Ellipse'
+        
+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)
+        
+        boutonRectangle = Button(BarreOutils, text='Rectangle',command=choixrect)
+        boutonRectangle.pack(side=LEFT, padx=5, pady=5)
+        boutonEllipse = Button(BarreOutils, text='Ellipse',command=choixellipse)
+        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)
+        if self.__selection=='Rectangle':
+            self.__canevas.bind('<ButtonRelease-1>',self.release_canevas)
+        if self.__selection=='Ellipse':
+            self.canevas.bind('<ButtonRelease-1>',self.release_canevas2)
+        
+    def release_canevas(self,event):
+        self.__canevas.ajout_forme(event.x,event.y)
+    def release_canevas2(self,event):
+        self.__canevas.ajout_forme2(event.x,event.y)
+if __name__ == "__main__":
+    fen = FenPrincipale()
+    fen.mainloop()
diff --git a/seance4_4h/formes.py b/seance4_4h/formes.py
index 964e35c..6f7a039 100644
--- a/seance4_4h/formes.py
+++ b/seance4_4h/formes.py
@@ -19,7 +19,11 @@ class Rectangle(Forme):
         self._item = canevas.create_rectangle(x, y, x+l, y+h, fill=couleur)
         self.__l = l
         self.__h = h
-    
+        self.__couleur = couleur
+        
+    def change_couleur(self,c):
+        self.__couleur = c
+        
     def __str__(self):
         return f"Rectangle d'origine {self.x},{self.y} et de dimensions {self.__l}x{self.__h}"
 
@@ -46,7 +50,11 @@ class Ellipse(Forme):
         self._item = canevas.create_oval(x-rx, y-ry, x+rx, y+ry, fill=couleur)
         self.__rx = rx
         self.__ry = ry
-
+        self.__couleur = couleur
+        
+    def change_couleur(self,c):
+        self.__couleur = c
+        
     def __str__(self):
         return f"Ellipse de centre {self.x},{self.y} et de rayons {self.__rx}x{self.__ry}"
 
diff --git a/seance4_4h/partie3.py b/seance4_4h/partie3.py
new file mode 100644
index 0000000..fa2d423
--- /dev/null
+++ b/seance4_4h/partie3.py
@@ -0,0 +1,107 @@
+from tkinter import *
+from tkinter import colorchooser # doit être importé manuellement
+from formes import *
+
+class ZoneAffichage(Canvas):
+    def __init__(self, master, largeur, hauteur):
+        Canvas.__init__(self, master, width=largeur, height=hauteur)
+        self.__formes = []
+        self.__type_forme = 'rectangle'
+        self.__couleur = 'brown'
+        self.__forme_deplacee = None
+    
+    def selection_rectangle(self):
+        self.__type_forme = 'rectangle'
+    
+    def selection_ellipse(self):
+        self.__type_forme = 'ellipse'
+    
+    def selection_couleur(self):
+        self.__couleur = colorchooser.askcolor()[1]
+    
+    def ajout_forme(self, x, y):
+        # Notez qu'on aurait aussi pu ajouter ce code en méthodes de Rectangle/Ellipse.
+        if self.__type_forme == 'rectangle':
+            f = Rectangle(self, x-5, y-10, 10, 20, self.__couleur)
+        elif self.__type_forme == 'ellipse':
+            f = Ellipse(self, x, y, 5, 10, self.__couleur)
+        self.__formes.append(f)
+    
+    def suppression_forme(self, x, y):
+        try:
+            i = next(i for i in range(len(self.__formes)-1, -1, -1)
+                       if self.__formes[i].contient_point(x, y))
+            f = self.__formes.pop(i) # on retire la forme de la liste
+            f.effacer() # puis on l'efface du canevas
+        except:
+            pass
+    
+    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
+
+
+class FenPrincipale(Tk):
+    def __init__(self):
+        Tk.__init__(self)
+        
+        # arbre de scène
+        self.configure(bg="grey")
+        barreOutils = Frame(self)
+        barreOutils.pack(side=TOP)
+        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)
+        
+        # commandes
+        boutonRectangle.config(command=self.__canevas.selection_rectangle)
+        boutonEllipse.config(command=self.__canevas.selection_ellipse)
+        boutonCouleur.config(command=self.__canevas.selection_couleur)
+        boutonQuitter.config(command=self.destroy)
+        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)
+    
+    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
+
+
+if __name__ == '__main__':
+    fen = FenPrincipale()
+    fen.mainloop()
-- 
GitLab