파이썬 강의/wx

파이썬 GUI(wxPython) 3. 메뉴바와 메뉴

마리사라 2021. 1. 5. 14:18
반응형

이번 강의는 메뉴바와 메뉴입니다.

 


1. 메뉴바

메뉴바는 메뉴들이 모여있는 장소라고 할 수 있습니다.

파이참의 메뉴바

메뉴바가 있어야 메뉴들을 넣을 수 있기 때문에 메뉴를 넣으실 분들은 필수적으로 만드셔야 합니다.

 

메뉴바를 만드는 방법은 다음과 같습니다.

menu_bar = wx.MenuBar()

괄호 안에는 파라미터로 style값을 넣어줄 수 있지만, 메뉴를 분리할 때 말고는 쓰지 않습니다.

 

이제 메뉴바를 만들었으니 실행해 보겠습니다.

분명 메뉴바를 만들었는데 실제로는 메뉴바가 나타나지 않습니다. 이것은 메뉴가 없고, 메뉴바가 등록이 되지 않았기 때문입니다.


2. 메뉴

메뉴는 메뉴바를 구성하는 항목들입니다. 위 파이참 사진에서 메뉴는 File, Edit, View 등이 메뉴라고 할 수 있습니다.

 

메뉴를 만드는 방법은 메뉴바를 만드는 방법과 같습니다.

menu = wx.Menu()

메뉴 역시 메뉴바와 마찬가지로 style값을 파라미터로 줄 수 있지만, 자주 사용되지는 않습니다.

 

이제 메뉴를 만들었으니 메뉴바에 등록을 해야 합니다.

menu_bar.Append(menu, '메뉴')

Append함수는 두 가지 파라미터를 필요로 합니다.

 

  • menu : 어떤 메뉴를 등록할지 지정. 반드시 메뉴를 먼저 선언한 후 사용
  • title : 메뉴의 이름을 지정. 공란이 되어선 안됨

저는 menu라는 wx.Menu에 '메뉴'라는 이름을 달아주었습니다.

 

이제 마지막으로 메뉴바를 프레임에 등록해주면 끝입니다.

self.SetMenuBar(menu_bar)

이 함수로 menu_bar를 Mainframe의 메뉴바로 지정해줄 수 있습니다.

 

다시 실행결과를 확인해 보겠습니다.

메뉴바가 포함된 프레임

이렇게 메뉴바가 포함된 프레임을 확인하실 수 있습니다.

 


2.1 하위 메뉴

파이참 File 메뉴의 하위 메뉴

프로그램에서 메뉴만 있는 경우도 있지만, 하위 메뉴가 있는 경우도 있습니다. 이러한 하위 메뉴를 만드는 방법은 다음과 같습니다.

menu.Append(101, '하위 메뉴')

하위 메뉴를 만드는 Append도 여러 가지 파라미터를 받을 수 있습니다.

 

  • id : 하위 메뉴들의 고유한 id를 부여합니다. id는 위젯에 부여된 id와 동일하게 취급됩니다.
  • item : 메뉴가 가지는 아이템을 설정합니다. 하위 메뉴의 이름을 지정하는 것과 같습니다.
  • helpstring : 추가적으로 사용자에게 도움을 줄 수 있는 문장을 설정합니다. 기본적으로는 스테이터스 바에 표시됩니다.
  • kind : 하위 메뉴의 종류를 설정합니다. 구분자, 기본, 체크, 라디오 버튼이 있습니다.

이제 이렇게 만들어진 하위 메뉴를 확인해 보겠습니다.

 

하위 메뉴가 포함된 GUI

 

이렇게 하위 메뉴가 생성된 것을 볼 수 있습니다.

 

물론 하위 메뉴에도 이벤트를 연결할 수도 있습니다.

self.Bind(wx.EVT_MENU, self.ButtonClick, id=101)

하위 메뉴를 이전에 만들었던 "눌렀다!"를 출력하는 이벤트와 연결해 보았습니다.

 

하위 메뉴 이벤트

그 이후부터는 하위 메뉴를 누를 때마다 해당 이벤트가 작동합니다.


3. 마치며

이번에는 메뉴바와 메뉴, 하위 메뉴에 대해서 알아보았습니다. 다음에는 다이얼로그에 대해서 알아보겠습니다.

 

import wx


class Mainframe(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(500, 500))

        self.button = wx.Button(self, id=1, label='버튼')

        self.Bind(wx.EVT_BUTTON, self.ButtonClick, id=1)
        # self.Bind(wx.EVT_BUTTON, self.ButtonClick, self.button)

        menu_bar = wx.MenuBar()

        menu = wx.Menu()
        menu_bar.Append(menu, '메뉴')
        menu.Append(101, '하위 메뉴')
        self.SetMenuBar(menu_bar)

        self.Bind(wx.EVT_MENU, self.ButtonClick, id=101)

    def ButtonClick(self, event):
        print("눌렀다!")


def run():
    app = wx.App()
    frame = Mainframe(None, -1, 'Calculator')
    frame.Show()
    app.MainLoop()


run()

 

반응형