Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Меню и панели инструментов в PyQt5 [Урок №3]

Меню и панели инструментов в PyQt5

В этой части руководства PyQt5, мы будем создавать меню и панели инструментов. Меню – это группа команд, располагающаяся ниже строки заголовка программы. Панель инструментов содержит кнопки с несколькими распространенными командами в приложении.

Основное окно

Класс QMainWindow предоставляет главное окно приложения. Он позволяет создать классический каркас приложения со строкой состояния, панелями инструментов и меню.

Строка состояния

Строка состояния – это виджет, который используется для отображения сведений о состоянии.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):               
        self.statusBar().showMessage('Ready')
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Statusbar')    
        self.show()
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Строку состояния создают с помощью виджета QMainWindow.

self.statusBar().showMessage('Ready')

Чтобы получить строку состояния, мы вызываем метод statusBar() класса QtGui.QMainWindow. Первый вызов метода создаёт строку состояния. Последующие вызовы возвращают объект строки состояния. showMessage() отображает сообщение в строке состояния.

Меню программы

Строка меню – это распространенная часть приложений с графическим интерфейсом (GUI).

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):               
        exitAction = QAction(QIcon('exit.png'), '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Menubar')    
        self.show()  
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

В примере выше, мы создаём строку меню с одним набором команд. Этот набор команд будет содержать одно действие, завершающее приложение при его выборе. Строка состояния тоже создаётся. Действие доступно с горячей клавишей Ctrl+Q.

exitAction = QAction(QIcon('exit.png'), '&Exit', self)        
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')

QAction – это абстракция для действий, выполняемых из меню, панелью инструментов или с использованием горячей клавишей. В приведённых выше трёх строках, мы создаём действие с определённой иконкой и меткой «Exit». Кроме того, для этого действия определена горячая клавиша. Третья строка создаёт подсказку, которая показывается в строке состояния, когда мы наводим курсор мыши на пункт меню.

exitAction.triggered.connect(qApp.quit)

Когда мы выбираем конкретное действие, срабатывает инициирующий сигнал. Сигнал присоединяют к методу quit() виджета QApplication. Это завершает приложение.

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)

Метод menuBar() создаёт строку меню. Мы создаём меню «File» и добавляем в него действие выхода из приложения.

Панель инструментов

Все команды из меню, которые мы можем использовать в приложении. Панели инструментов предоставляют быстрый доступ к большинству часто используемых команд.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):               
        exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)
        
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')    
        self.show()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

В вышеприведённом примере, мы создаём простую панель инструментов. Она имеет один инструмент, действие выхода, которое завершает приложение, будучи инициированным.

exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)

В аналогичном примере как с созданием меню выше, мы создаём объект действия. Объект имеет метку, иконку и горячую клавишу. Метод quit() из QtGui.QMainWindow присоединяется к инициирующему сигналу.

self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)

Здесь мы создаём панель инструментов и подключаем объект действия к ней.

Панель инструментов

Рисунок: Панель инструментов

Совместное размещение

В последнем примере этой части, мы создадим меню, панель инструментов и строку состояния. Мы также создадим центральный виджет.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):               
        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)
        exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.close)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAction)
        
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')    
        self.show()
        
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Этот пример кода создаёт каркас классического графического приложения состоящей из меню, панелью инструментов и строкой состояния.

textEdit = QTextEdit()
self.setCentralWidget(textEdit)

Здесь мы создаём виджет редактирования текста. Мы устанавливаем его так, чтобы он был центральным виджетом QMainWindow. Центральный виджет займёт всё оставшееся пространство.

Главное окно

Рисунок: Главное окно

В этой части руководства PyQt5, мы работали с меню, панелями управления, строкой состояния и главным окном приложения.

Продолжение: Управление макетом в PyQt5 [Урок №4]

Прошлый урок: Первые программы на PyQt5 [Урок 2]

Комментариев: 9
  1. Kosta colaperm@gmail | 2015-06-18 в 11:40:47

    Есть: ubuntu 15.04 , PyQt5.4

    В примере: Меню программы

    Не отрабатывают следующие строчки:

    exitAction.setShortcut('Ctrl+Q')

    exitAction.setStatusTip('Exit application')

    На нажатие Ctrl+Q - ни какой реакции.

    И подсказка не выводится.

  2. Есть: ubuntu 16.04 , PyQt5.4

    В примере: Меню программы не работает ничего, кроме выхода по нажатию ctrl+q.

    Никакого меню нет, в общем, просто пустое окно. Решение: exitActi 'Exit', self) тоже не работает.

    Единственное, что я выяснила, это то, что проблема в самой системе. То есть, нет поддержки иконок на убунту.

    Подскажите, что сделать?

  3. ubuntu 17.04, python 3.5.3, PyQt5.9

    Строка меню не создаётся

  4. Разобрался. Вот как нужно, чтобы меню отображалось:

    menubar = self.menuBar()

    fileMenu = menubar.addMenu('&File;') exitActi '&Exit;', self)

    exitAction.setShortcut('Ctrl+Q')

    exitAction.setStatusTip('Exit application')

    exitAction.triggered.connect(qApp.quit)

    fileMenu.addAction(exitAction)

  5. Глюк какой-то. Повторяю вторую строку

    fileMenu = menubar.addMenu('&File;')

    и третью строку exitActi '&Exit;', self)

    а то они в предыдущем комменте слились во что-то непотребное :)

  6. Да что за проблема такая с третьей строкой?

    Попробую записать её в столбик, может тогда отобразится нормально

    exitActi

    QIcon('exit.png'),

    '&Exit;', self)

  7. Короче, админ, ремонтируй свой сайт :)

  8. Создание меню вообще не работает

  9. Неясно несколько моментов со следующей строкой:

    exitAction.triggered.connect(qApp.quit)

    в пункте создания панели инструментов:

    1. Зачем использовать qApp вместо QApplication?

    Какие преимущества это дает?

    2. В предыдущем уроке в пункте "Закрытие окна" для закрытия использовался следующий код:

    qbtn.clicked.connect(QCoreApplication.instance().quit)

    В чем его отличия от exitAction.triggered.connect(qApp.quit)?