Menubar
Subscribe to Tech with Tim
This pyqt5 menubar tutorial will show you how to create menus, link menu buttons to functions/methods and display text in the status bar when hovering over items.
Creating the GUI
We will be using Qt-Designer to create the GUI for this tutorial. I've made my gui look like the following:
-
To add a menu button simply double click where it says type here.
-
To add a shortcut to the menu button look in the property editor, find shortcut and click the keyboard shortcut.
-
You can also add a status tip. This will be what shows up in the bottom bar of the window when you hover over the button.
If you want to follow along closely with the tutorial I recommend you add a few menu buttons and at least one label.
Exporting the GUI
Just like before we will save the GUI as .ui file and export it to python code.
pyuic5 -x "filename".ui -0 "filename".py
Linking Menu Buttons to Methods
Once we've exported our gui and opened the python code we can start to link the menu buttons to methods. What I will do for this tutorial is make it so that each time a menu bar button is pressed the label on the screen changes.
The first step is to write a new clicked method. This name however it will take one parameter.
def clicked(self, text): self.label.setText(text) self.label.adjustSize()
This will go inside the class created by pyqt when we exported out GUI.
To link each menu button to this method we will add the following lines inside of the setupUI method.
self.actionNew.triggered.connect(lambda: self.clicked("New was clicked")) self.actionSave.triggered.connect(lambda: self.clicked("Save was clicked")) self.actionCopy.triggered.connect(lambda: self.clicked("Copy was clicked")) self.actionPaste.triggered.connect(lambda: self.clicked("Paste was clicked"))
And now our menu buttons are linked!
Full Code
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'test.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(240, 50, 321, 121)) font = QtGui.QFont() font.setPointSize(36) self.label.setFont(font) self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") self.menuEdit = QtWidgets.QMenu(self.menubar) self.menuEdit.setObjectName("menuEdit") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionCopy = QtWidgets.QAction(MainWindow) self.actionCopy.setObjectName("actionCopy") self.actionPaste = QtWidgets.QAction(MainWindow) self.actionPaste.setObjectName("actionPaste") self.actionSave = QtWidgets.QAction(MainWindow) self.actionSave.setObjectName("actionSave") self.actionNew = QtWidgets.QAction(MainWindow) self.actionNew.setObjectName("actionNew") self.menuFile.addAction(self.actionNew) self.menuFile.addAction(self.actionSave) self.menuEdit.addAction(self.actionCopy) self.menuEdit.addAction(self.actionPaste) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuEdit.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.actionNew.triggered.connect(lambda: self.clicked("New was clicked")) self.actionSave.triggered.connect(lambda: self.clicked("Save was clicked")) self.actionCopy.triggered.connect(lambda: self.clicked("Copy was clicked")) self.actionPaste.triggered.connect(lambda: self.clicked("Paste was clicked")) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "TextLabel")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuEdit.setTitle(_translate("MainWindow", "Edit")) self.actionCopy.setText(_translate("MainWindow", "Copy")) self.actionCopy.setShortcut(_translate("MainWindow", "Ctrl+C")) self.actionPaste.setText(_translate("MainWindow", "Paste")) self.actionPaste.setShortcut(_translate("MainWindow", "Ctrl+V")) self.actionSave.setText(_translate("MainWindow", "Save")) self.actionSave.setShortcut(_translate("MainWindow", "Ctrl+S")) self.actionNew.setText(_translate("MainWindow", "New")) self.actionNew.setShortcut(_translate("MainWindow", "Ctrl+N")) def clicked(self, text): self.label.setText(text) self.label.adjustSize() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())