diff --git a/TP4/documents/FileDefinition.py b/TP4/documents/FileDefinition.py
new file mode 100644
index 0000000000000000000000000000000000000000..75e5ee69d746a94b936b728922e2d1122adc4110
--- /dev/null
+++ b/TP4/documents/FileDefinition.py
@@ -0,0 +1,5 @@
+import os
+
+DATA_DIR = os.path.dirname(os.path.abspath(__file__))
+
+LAYOUT_FILE = os.path.join(DATA_DIR, 'layout.json')
diff --git a/TP4/documents/__init__.py b/TP4/documents/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/TP4/documents/layout.json b/TP4/documents/layout.json
new file mode 100644
index 0000000000000000000000000000000000000000..46a7693b44809694e8dc06a291e753ba120ce3b8
--- /dev/null
+++ b/TP4/documents/layout.json
@@ -0,0 +1,39 @@
+{
+    "keyWidth": 50,
+    "keyHeight": 20,
+    "keySpacing": 3,
+    "nbReco": 4,
+    "keys" : [
+        { "symbol": "a", "x" : 0, "y" : 1, "width": 1 },
+        { "symbol": "z", "x" : 1, "y" : 1, "width": 1 },
+        { "symbol": "e", "x" : 2, "y" : 1, "width": 1 },
+        { "symbol": "r", "x" : 3, "y" : 1, "width": 1 },
+        { "symbol": "t", "x" : 4, "y" : 1, "width": 1 },
+        { "symbol": "y", "x" : 5, "y" : 1, "width": 1 },
+        { "symbol": "u", "x" : 6, "y" : 1, "width": 1 },
+        { "symbol": "i", "x" : 7, "y" : 1, "width": 1 },
+        { "symbol": "o", "x" : 8, "y" : 1, "width": 1 },
+        { "symbol": "p", "x" : 9, "y" : 1, "width": 1 },
+        { "symbol": "q", "x" : 1, "y" : 2, "width": 1 },
+        { "symbol": "s", "x" : 0, "y" : 2, "width": 1 },
+        { "symbol": "d", "x" : 2, "y" : 2, "width": 1 },
+        { "symbol": "f", "x" : 3, "y" : 2, "width": 1 },
+        { "symbol": "g", "x" : 4, "y" : 2, "width": 1 },
+        { "symbol": "h", "x" : 5, "y" : 2, "width": 1 },
+        { "symbol": "j", "x" : 6, "y" : 2, "width": 1 },
+        { "symbol": "k", "x" : 7, "y" : 2, "width": 1 },
+        { "symbol": "l", "x" : 8, "y" : 2, "width": 1 },
+        { "symbol": "m", "x" : 9, "y" : 2, "width": 1 },
+        { "symbol": "q", "x" : 1, "y" : 2, "width": 1 },
+        { "symbol": "⇧", "x" : 0, "y" : 3, "width": 2 },
+        { "symbol": "w", "x" : 2, "y" : 3, "width": 1 },
+        { "symbol": "x", "x" : 3, "y" : 3, "width": 1 },
+        { "symbol": "c", "x" : 4, "y" : 3, "width": 1 },
+        { "symbol": "v", "x" : 5, "y" : 3, "width": 1 },
+        { "symbol": "b", "x" : 6, "y" : 3, "width": 1 },
+        { "symbol": "n", "x" : 7, "y" : 3, "width": 1 },
+        { "symbol": "⇦", "x" : 8, "y" : 3, "width": 2 },
+        { "symbol": " ", "x" : 0, "y" : 4, "width": 8 },
+        { "symbol": "↵", "x" : 8, "y" : 4, "width": 2 }
+    ]
+}
\ No newline at end of file
diff --git a/TP4/src/Main.py b/TP4/src/Main.py
new file mode 100644
index 0000000000000000000000000000000000000000..f574433eabee3cf07f922fd056ddf1d1e8d52440
--- /dev/null
+++ b/TP4/src/Main.py
@@ -0,0 +1,14 @@
+import sys
+from PyQt5.QtWidgets import QApplication
+from src.widgets.EditeurWindow import EditeurWindow
+
+def main():
+    app = QApplication(sys.argv)
+    window = EditeurWindow()
+    window.resize(1024, 800)
+    window.show()
+    sys.exit(app.exec_())
+
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/TP4/src/__init__.py b/TP4/src/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/TP4/src/model/Key.py b/TP4/src/model/Key.py
new file mode 100644
index 0000000000000000000000000000000000000000..7519fec550ffc7313e453ee63d5303388c92547d
--- /dev/null
+++ b/TP4/src/model/Key.py
@@ -0,0 +1,9 @@
+from PyQt5.QtCore import QRect, QPoint, QSize
+
+class Key:
+    def __init__(self, x, y, keyWidth, keyHeight, keySpacing, width, symbol):
+        self.x = x * (keyWidth + keySpacing)
+        self.y = y * (keyHeight + keySpacing)
+        self.position = QPoint(self.x, self.y)
+        self.symbol = symbol
+        self.rect = QRect(self.x, self.y, width * (keyWidth + keySpacing) - keySpacing, keyHeight)
diff --git a/TP4/src/model/__init__.py b/TP4/src/model/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/TP4/src/widgets/EditeurWindow.py b/TP4/src/widgets/EditeurWindow.py
new file mode 100644
index 0000000000000000000000000000000000000000..093d6dfd76d2d35c140b2a3baebf9345c5ba714d
--- /dev/null
+++ b/TP4/src/widgets/EditeurWindow.py
@@ -0,0 +1,17 @@
+from PyQt5.QtWidgets import QWidget, QLineEdit, QVBoxLayout
+from src.widgets.KeyboardWidget import KeyboardWidget
+
+class EditeurWindow(QWidget):
+    def __init__(self):
+        super().__init__()
+        self.setWindowTitle('Editeur')
+
+        # Création des widgets
+        line_edit = QLineEdit(self)
+        keyboard_widget = KeyboardWidget()
+
+        # Création du layout et ajout des widgets
+        layout = QVBoxLayout()
+        layout.addWidget(line_edit)
+        layout.addWidget(keyboard_widget)
+        self.setLayout(layout)
\ No newline at end of file
diff --git a/TP4/src/widgets/KeyboardWidget.py b/TP4/src/widgets/KeyboardWidget.py
new file mode 100644
index 0000000000000000000000000000000000000000..660ca765bdbc241131149dca40ea4cb10b121547
--- /dev/null
+++ b/TP4/src/widgets/KeyboardWidget.py
@@ -0,0 +1,38 @@
+import json
+
+from PyQt5.QtWidgets import QWidget
+from documents.FileDefinition import LAYOUT_FILE
+from src.model.Key import Key
+
+
+class KeyboardWidget(QWidget):
+    def __init__(self):
+        super().__init__()
+        self.keys = []
+        self.keyWidth = None
+        self.keyHeight = None
+        self.keySpacing = None
+
+        # Initialiser le clavier
+        self.loadLayoutJson()
+        self.update()
+
+    def loadLayoutJson(self):
+        # Chargement du fichier JSON contenant les paramètres du clavier
+        with open(LAYOUT_FILE, "r") as f:
+            layout_clavier = json.load(f)
+
+        # Accéder aux paramètres
+
+        self.keyWidth = layout_clavier['keyWidth']
+        self.keyHeight = layout_clavier['keyHeight']
+        self.keySpacing = layout_clavier['keySpacing']
+
+        # Créer la clé de chaque touche
+        for keyData in layout_clavier['keys']:
+            self.keys.append(self.createKey(keyData))
+
+    def createKey(self, keyData):
+        return Key(keyData['x'], keyData['y'], self.keyWidth, self.keyHeight, self.keySpacing, keyData['width'], keyData['symbol'])
+
+
diff --git a/TP4/src/widgets/__init__.py b/TP4/src/widgets/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391