1. Introduction aux menus PyQt5
- Les menus sont une partie importante de l'interface graphique utilisateur d'une application. Les menus permettent aux utilisateurs d'accéder facilement à différentes fonctionnalités et options. PyQt5 fournit une classe QMenuBar pour créer des barres de menus dans une application PyQt5.
- Pour créer une barre de menu, il est nécessaire d'instancier la classe QMenuBar et de l'ajouter à la fenêtre principale de l'application PyQt5. La barre de menu peut contenir plusieurs menus, chacun ayant une liste d'actions. Les actions sont des fonctions qui sont exécutées lorsque l'utilisateur clique sur un élément du menu.
- Dans ce tutoriel, nous allons apprendre à créer et personnaliser des barres de menus dans PyQt5. Nous verrons comment ajouter des menus, des actions et des sous-menus, et comment les connecter à des fonctions. Nous aborderons également des sujets tels que l'utilisation de boîtes de dialogue pour ouvrir et enregistrer des fichiers, la personnalisation des menus et des actions, l'utilisation de raccourcis clavier, la création de menus contextuels et l'utilisation de la barre d'outils.
2. Menu simple avec QMenuBar PyQt5
2.1 Créer un menu avec la classe QMenuBar
Pour créer un menu, la bibliothèque PyQt5 possède une classe nommée QMenuBar qui permet de créer une barre de menu. En faisant une instanciation sur la classe QMenuBar, on crée un objet menuBar avec les méthodes :
- addMenu() : permettant d'ajouter un menu comme File , Edit, Option...
- addAction(): permettant d'ajouter des commandes aux éléments de menu comme : File->Open , File->Save , File->Save As, File->Exit,...
- addSeparator() : permettant d'ajouter un séparateur entre les éléments du menu.
A cet effet créer un fichier Python nommé simplemenu.py et y insérer le code suivant:
Exemple (simplemenu.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar import sys app = QApplication(sys.argv) root = QWidget() root.setWindowTitle("Simple QMenu PyQt5") root.setGeometry(100 , 100 , 500 , 300) # create a Menubar by instanciating the QMenuBar class menuBar = QMenuBar(root) menuBar.setGeometry(0,0, 500, 25) # create a menu called 'File' File = menuBar.addMenu('File') # add actions to the menu 'File' File.addAction('New') File.addAction('Open' ) File.addAction('Save') File.addAction('Save As') File.addAction('Exit') root.show() sys.exit(app.exec_()) |
2.2 Ajouter une action au menu
Nous pouvons également ajouter une action de commande au menu pyqt afin de pouvoir assigner des actions au click, par exemple lorsque nous cliquons sur Fichier->Ouvrir, une nouvelle fenêtre apparaît, lorsque nous cliquons sur Fichier->Quitter nous quittons la fenêtre...Nous devons alors ajouter des fonctions qui réalisent cela:
Exemple (action: File->Nouveau et File->Exit)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar, QAction import sys def exit(): root.close() app = QApplication(sys.argv) root = QWidget() root.setWindowTitle("Simple QMenu PyQt5") root.setGeometry(100 , 100 , 500 , 300) # create a Menubar by instanciating the QMenuBar class menuBar = QMenuBar(root) menuBar.setGeometry(0,0, 500, 25) # create a menu called 'File' File = menuBar.addMenu('File') # add actions to the menu 'File' File.addAction('New' , new) File.addAction('Open' ) File.addAction('Save') File.addAction('Save As') File.addAction('Exit' , exit) root.show() sys.exit(app.exec_()) |
3. QMenuBar selon l'approche objet PyQt5
Afin d'organiser vos projets Python et éviter la répetition du code, vous devez vous appuyer sur l'approche objet. A cet effet vous devez écrire un code propre sous forme d'une classe Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar import sys class MyWindow(QWidget): def __init__(self, win): super().__init__() self.win = win def exit(self): self.win.close() def build(self): self.win.setWindowTitle("Example QMenu PyQt5") self.win.setGeometry(100 , 100 , 500 , 300) self.menubar = QMenuBar(self.win) self.File = self.menubar.addMenu('File') self.File.addAction('New') self.File.addAction('Exit' , self.exit) if __name__ == '__main__': app = QApplication(sys.argv) root = QWidget() mywin = MyWindow(root) mywin.build() root.show() sys.exit(app.exec_()) |
4. Ajouter une action à un élément de menu à l'aide de la classe QAction
Nous allons maintenant voir une autre méthode pour ajouter une action à un élément de menu en utilisant la classe QAction. À cette fin, les étapes suivantes doivent être suivies :
- nous créons l'action : en utilisant la classe QAction
- Nous ajoutons l'action : au menu en utilisant la méthode addAction()
- Nous connectons l'action : à la méthode qui exécute l'action à l'aide de la méthode trigger.connect()
1 2 3 4 5 6 7 8 |
# create an action with QAction class exitAction = QAction('&Exit' , self) # adding action to the menu File self.File.addAction(exitAction) # connecting to the method that perform the action exitAction.triggered.connect(self.exit) |
Code complet: créons maintenant un fichier nommé 'exemple.py' et y insérons le code suivant:
Exemple 1 (menu File -> exit)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# code du fichier exemple.py from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar, QAction import sys, os class MyWindow(QWidget): def __init__(self, win): super().__init__() self.win = win def exit(self): self.win.close() def build(self): self.win.setWindowTitle("Example QMenu PyQt5") self.win.setGeometry(100 , 100 , 500 , 300) self.menubar = QMenuBar(self.win) self.File = self.menubar.addMenu('File') # create an action with QAction class exitAction = QAction('&Exit' , self) # adding action to the menu File self.File.addAction(exitAction) # connecting to the method that perform the action exitAction.triggered.connect(self.exit) if __name__ == '__main__': app = QApplication(sys.argv) root = QWidget() mywin = MyWindow(root) mywin.build() root.show() sys.exit(app.exec_()) |
Exemple 2 (menu File -> New)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar, QAction import sys, os class MyWindow(QWidget): def __init__(self, win): super().__init__() self.win = win def new(self): os.popen("python exemple.py") def build(self): self.win.setWindowTitle("Example QMenu PyQt5") self.win.setGeometry(100 , 100 , 500 , 300) self.menubar = QMenuBar(self.win) self.File = self.menubar.addMenu('File') # create an action with QAction class newAction = QAction('&New' , self) # adding action to the menu File self.File.addAction(newAction) # adding a shrtcut to the action newAction.setShortcut('Ctrl+N') # connecting to the method that perform the action newAction.triggered.connect(self.new) if __name__ == '__main__': app = QApplication(sys.argv) root = QWidget() mywin = MyWindow(root) mywin.build() root.show() sys.exit(app.exec_()) |
5. Raccourcie clavier
Afin de facilier l'usage de notre application, nous pouvons créer des raccourcies clavier. Nous allons traiter dans ce paragraphe le rccourcie clavier Crtl+Q pour exécuter l'action "Quitter". A cet effet nous devons appliquer la méthode setShortcut() à l'objet exitAction:
1 2 |
# ajouter le raccourcie clavier à l'action du menu exitAction.setShortcut('Ctrl+Q') |
Exemple complet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar, QAction import sys, os class MyWindow(QWidget): def __init__(self, win): super().__init__() self.win = win def exit(self): self.win.close() def build(self): self.win.setWindowTitle("Example QMenu PyQt5") self.win.setGeometry(100 , 100 , 500 , 300) self.menubar = QMenuBar(self.win) self.File = self.menubar.addMenu('File') # create an action with QAction class exitAction = QAction('&Exit' , self) # adding action to the menu File self.File.addAction(exitAction) # adding a shortcut to the action exitAction.setShortcut('Ctrl+Q') # connecting to the method that perform the action exitAction.triggered.connect(self.exit) if __name__ == '__main__': app = QApplication(sys.argv) root = QWidget() mywin = MyWindow(root) mywin.build() root.show() sys.exit(app.exec_()) |
Younes Derfoufi
CRMEF OUJDA