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