diff --git a/TP1/BubbleCursor.py b/TP1/BubbleCursor.py
new file mode 100644
index 0000000000000000000000000000000000000000..828aa6e232e44cec7ab2f6bc21f5ec64a0704c50
--- /dev/null
+++ b/TP1/BubbleCursor.py
@@ -0,0 +1,38 @@
+from PyQt5.QtGui import QColor
+
+class BubbleCursor:
+    defaultCol=QColor("green")
+
+    def __init__(self, targets):
+        self.x = 0
+        self.y = 0
+        self.size = 50
+        self.targets = targets
+        self.closest = None
+
+    def paint(self, painter):
+        painter.setBrush(self.defaultCol)
+        painter.drawEllipse(self.x - self.size, self.y - self.size, self.size * 2, self.size * 2)
+
+    def move(self, moveX, moveY):
+        self.x = moveX
+        self.y = moveY
+        self.closest = None
+        minDistance = float('inf')
+
+        for target in self.targets:
+            target.highlighted = False
+
+        for target in self.targets:
+            distance = self.distanceToTarget(target)
+            if distance < minDistance:
+                minDistance = distance
+                self.closest = target
+
+        if self.closest is not None:
+            self.closest.highlighted = True
+            self.size = minDistance - self.closest.size / 2
+
+    def distanceToTarget(self, target):
+        distanceCentre = ((self.x - target.x) ** 2 + (self.y - target.y) ** 2) ** 0.5
+        return abs(distanceCentre - target.size / 2)
diff --git a/TP1/BubbleWidget.py b/TP1/BubbleWidget.py
new file mode 100644
index 0000000000000000000000000000000000000000..476d98d579f44ca150e13452d12bc49b48fb23e0
--- /dev/null
+++ b/TP1/BubbleWidget.py
@@ -0,0 +1,33 @@
+import csv
+from PyQt5.QtGui import QPainter
+from PyQt5.QtWidgets import QWidget
+from Target import Target
+from BubbleCursor import BubbleCursor
+
+class BubbleWidget(QWidget):
+    def __init__(self):
+        super().__init__()
+        self.targets = []
+        self.loadTargets()
+        self.cursor = BubbleCursor(self.targets)
+        self.setMouseTracking(True)
+
+    def loadTargets(self):
+        with open('src_tp_bubble.csv', newline='') as csvfile:
+            reader = csv.reader(csvfile)
+            for row in reader:
+                if len(row) >= 3:
+                    x, y, size = map(int, row[:3])
+                    self.targets.append(Target(x,y,size))
+
+    def paintEvent(self, event):
+        print("paintEvent appelé")
+        painter = QPainter(self)
+        for target in self.targets:
+            target.paint(painter)
+        self.cursor.paint(painter)
+
+    def mouseMoveEvent(self, event):
+        print("mouseMoveEvent appelé")
+        self.cursor.move(event.x(), event.y())
+        self.update()
diff --git a/TP1/MainBubble.py b/TP1/MainBubble.py
new file mode 100644
index 0000000000000000000000000000000000000000..f70217a92990d711ecbcadacc2e2207182495ba8
--- /dev/null
+++ b/TP1/MainBubble.py
@@ -0,0 +1,19 @@
+import sys
+
+from PyQt5.QtGui import QPainter
+from PyQt5.QtWidgets import QApplication, QMainWindow
+from BubbleWidget import BubbleWidget
+def main():
+    app = QApplication(sys.argv)
+    main_window = QMainWindow()
+    main_window.resize(1024, 800)
+
+    bubble_widget = BubbleWidget()
+
+    main_window.setCentralWidget(bubble_widget)
+
+    main_window.show()
+    sys.exit(app.exec_())
+
+if __name__ == "__main__":
+    main()
diff --git a/TP1/README.md b/TP1/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/TP1/Target.py b/TP1/Target.py
new file mode 100644
index 0000000000000000000000000000000000000000..78cf43c80661e139e58c44cfb74e40315881b169
--- /dev/null
+++ b/TP1/Target.py
@@ -0,0 +1,22 @@
+from PyQt5.QtGui import QColor
+
+class Target:
+    defaultCol = QColor("green")
+    highlightCol = QColor("red")
+    toSelectCol = QColor("blue")
+
+    def __init__(self, x, y, size):
+        self.x = x
+        self.y = y
+        self.size = size
+        self.toSelect = False
+        self.highlighted = False
+
+    def paint(self, painter):
+        if self.toSelect:
+            painter.setBrush(self.toSelectCol)
+        elif self.highlighted:
+            painter.setBrush(self.highlightCol)
+        else:
+            painter.setBrush(self.defaultCol)
+        painter.drawEllipse(self.x - self.size / 2, self.y - self.size / 2, self.size, self.size)
\ No newline at end of file
diff --git a/TP1/__pycache__/BubbleCursor.cpython-39.pyc b/TP1/__pycache__/BubbleCursor.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4d49281a3a479273257899a9b740c614c215d99e
Binary files /dev/null and b/TP1/__pycache__/BubbleCursor.cpython-39.pyc differ
diff --git a/TP1/__pycache__/BubbleWidget.cpython-39.pyc b/TP1/__pycache__/BubbleWidget.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3e9ebd96cf92dcab43c8065bb5482a9f7eccc59e
Binary files /dev/null and b/TP1/__pycache__/BubbleWidget.cpython-39.pyc differ
diff --git a/TP1/__pycache__/Target.cpython-39.pyc b/TP1/__pycache__/Target.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..23ca47c2f5451c35bafb6733925f0380401c87fa
Binary files /dev/null and b/TP1/__pycache__/Target.cpython-39.pyc differ
diff --git a/TP1/src_tp_bubble.csv b/TP1/src_tp_bubble.csv
new file mode 100644
index 0000000000000000000000000000000000000000..48c30994b3ee4a9ae5a6c16ea6dc92a8601ebcf4
--- /dev/null
+++ b/TP1/src_tp_bubble.csv
@@ -0,0 +1,100 @@
+381,453,17
+320,81,17
+71,705,14
+251,441,7
+557,644,9
+209,9,13
+185,632,13
+179,752,21
+815,368,24
+840,258,20
+978,726,22
+898,334,17
+709,671,17
+79,446,10
+320,299,14
+129,238,16
+940,10,6
+806,476,8
+626,538,7
+786,725,15
+840,639,14
+562,527,10
+1000,307,22
+197,561,19
+920,608,14
+218,322,24
+849,356,19
+13,765,23
+282,335,8
+369,151,16
+415,320,13
+443,244,9
+592,228,17
+640,58,13
+366,127,18
+57,760,19
+932,670,12
+761,297,10
+438,169,14
+588,329,23
+958,551,18
+198,217,7
+35,717,14
+955,655,8
+267,217,23
+159,558,24
+464,53,9
+264,255,15
+1013,92,15
+575,450,23
+355,683,23
+696,624,21
+469,143,17
+725,652,19
+338,765,8
+1012,46,11
+580,621,21
+673,478,18
+850,386,13
+622,167,21
+137,107,17
+396,172,7
+960,702,13
+804,105,8
+527,263,17
+692,417,15
+1014,755,14
+735,677,19
+944,126,10
+814,510,19
+33,326,18
+520,105,24
+654,141,19
+926,548,16
+809,183,9
+484,627,22
+283,405,11
+754,65,16
+313,33,19
+456,276,15
+16,166,15
+576,371,24
+664,74,20
+362,538,18
+69,295,11
+573,175,13
+650,522,14
+393,223,21
+517,571,9
+887,173,11
+914,495,22
+455,371,11
+767,203,16
+992,640,14
+682,391,11
+801,280,17
+222,109,9
+887,243,12
+910,166,21
+508,154,8
\ No newline at end of file