본문 바로가기
파이썬 (Python)/파이썬 GUI + PyQt5

파이썬 Python의 GUI 구현 PyQt5 QAction Class를 이용한 리본메뉴 만들기

by ★√★ 2021. 3. 1.

 안녕하세요, Davey입니다. 오늘 포스팅할 내용은, 프로그램에서 보여주지는 리본메뉴를 만드는 코드를 구현해볼려고 합니다. 버튼을 통해서 각 이벤트를 구현할 수 있지만, 한정된 공간에서 Compact하게 구현하기 하는 리본메뉴를 만드는 것입니다.

 

 

파이썬-QAction-Class-리본메뉴-썸네일
파이썬-QAction-Class-리본메뉴

 

 그럼 프로그램에서 보여주지는 리본메뉴를 만드는 코드에 대해서 하나 하나 차근 차근 설명 드리도록 하겠습니다. 

 

1. QAction Class

 

: 아래 Snap Shot 내용을 보면, Widgets에 삽입하는 interface action을 추가하는 Class 입니다. 리본 메뉴에 Short Cut이나 Action을 추가하는 Class 라고 이해하시면 됩니다. 리본 메뉴 만들때, 이 Class를 사용해보도록 하겠습니다.

 

파이썬-QAction-Class-리본메뉴-코드-관련-사진1
파이썬-QAction-Class-리본메뉴-코드-관련-사진1

 

2. QAction Class를 이용한 리본메뉴 만들기 코드 작성하기

 

: QAction Class를 이용하여, 리본메뉴를 만들어 보도록 하겠습니다. 크게, 메뉴를 누르고, 그 메뉴에서 바로 실행하는 Action과 메뉴의 서브 메뉴로 연결되어서, 그 서버 메뉴에 있는 항목을 클릭하게 되면, 발생하는 Action을 구성해보도록 하겠습니다. 코드를 구현하면서, 추가적으로 설명할 부분은 그 코드마다 주석을 추가하였습니다.

 

 1) 리본 메뉴 만들기

 2) 리본 메뉴 클릭 시 바로 보이는 항목에 대한 Action

 3) 리본 메뉴 클릭 시 Sub 리본 메뉴 생성 후 발생하는 Action

 

# 참조 자료 출처 : http://penguinitis.g1.xrea.com/computer/programming/Python/PyQt5/PyQt5-memo/PyQt5-memo.html
# 필요한 라이브러리 / 패키지를 선언함
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox
from PyQt5.QtWidgets import QAction, qApp

# Ribbon Menu를 만들기 위한 QMainwindow Class 선언
class Ribbon_Menu(QMainWindow) :
    def __init__(self) :
        super () .__init__ ()
        self.setWindowTitle("Ribbon Menu Demonstration")  # Window Menu Title 설정
        self.resize(300, 300)


        # Action 3개를 선언함.
        FirstAction = QAction("& Exit Action", self)
        FirstAction.setShortcut("Ctrl + e")
        FirstAction.triggered.connect (qApp.quit)

        SecondAction = QAction ( "& Sub Ribbon Menu Action", self)
        SecondAction.triggered.connect (self.Sub_Ribbon_Menu_Action)

        ThirdAction = QAction("& Main Ribbon Menu Action", self)
        ThirdAction.triggered.connect(self.Main_Ribbon_Menu_Action)

        # 기본 리본 메뉴 바를 선언함.
        Mainmenubar = self.menuBar()


        # 기본 리본 메뉴 바에 First Menu를 삽입 + Main Ribbon Menu Action 를 삽입
        FirstMenu01 = Mainmenubar.addMenu("& First Ribbon Menu")
        FirstMenu01.addAction(ThirdAction)

        # First Menu에 Sub menu를 삽입 + Sub Ribbon Menu Action 를 삽입
        SecondMenu = FirstMenu01.addMenu("& Sub Ribbon Menu")
        SecondMenu.addAction(SecondAction)

        # 메뉴 내에서, 구분바를 설정을 해줌 그리고 마지막 Exit Action을 선언함.
        FirstMenu01.addSeparator()
        FirstMenu01.addSeparator()
        FirstMenu01.addAction (FirstAction)

        self.setWindowTitle ("Ribbon Menu Demonstration")
        self.show ()


    # 각 Action 마다 Message를 띄우면서, Event를 발생 시킴.
    def Main_Ribbon_Menu_Action (self):
        reply = QMessageBox.information(self, "Main Ribbon Menu Action","Main Ribbon Menu Action Activated")

    def Sub_Ribbon_Menu_Action (self):
        reply = QMessageBox.information(self, "Sub Ribbon Menu Action","Sub Ribbon Menu Action Activated")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Ribbon_Menu()
    sys.exit(app.exec_())

 

- 위 코드를 구현을 하면 아래와 같이 메뉴바가 설정이 되며, 각 Action을 하나 하나 실행을 해보도록 하겠습니다. First ~ Third Action까지 각 발생하는 Action은 아래와 같습니다. 

 

 1) First Action : 창에서 나오게 됨. 즉 Exit Event가 발생함.

 2) Second Action : "Sub Ribbon Menu Action Activated" 메세지 발생

 3) Third Action : "Main Ribbon Menu Action Activated" 메세지 발생

 

- 각 Action을 실행 해보도록 하겠습니다. 아래 Demonstration 화면 참조 부탁 드립니다. 

 

파이썬-QAction-Class-리본메뉴-코드-관련-사진2
파이썬-QAction-Class-리본메뉴-코드-관련-사진2

 

 

  이상입니다. 지금까지 프로그램에서 보여주지는 리본메뉴를 만드는 코드를 구현하는 방법에 대해서 포스팅을 작성하였습니다. 위 코드 구현해서, 각 Action별로 Demonstration 해보시고, 잘 되시면 코드를 잘 적용하신 겁니다.

 

 제가 만든 코드를 그대로 사용하지만 마시고, 그 안에서 조금이나마 자신만의 Event를 만들어서 연습해보시는 걸 추천 드립니다. 왜냐하면, 그냥 그대로만 Copy / Paste만 하면, 나중에 Error 발생하면, 어떻게 해야 할지 갈피를 잡지 못하기 때문입니다. 하나 하나 연습해보세요. 백문이 불여 일타라는 말도 있습니다. 그럼 오늘도 공부하시느라고 수고 하셨구요. 같이 공부 열심히 해서 같이 성장하시죠! 감사합니다. 

 

 제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab