반응형
개요
메뉴(wx.Menu) 클래스를 이용하여 팝업메뉴를 만들어보자. 메뉴클래스를 상속받아 팝업메뉴에 속하는 하위 메뉴아이템(wx.MenuItem)들을 만들어주고, 마우스 우클릭시 메뉴가 열리도록 이벤트를 주면 된다. 간단한 구성이므로 예제를 통해 알아보자.
예제
예제는 패널이나 스태틱텍스트에 마우스 우클릭을 하면 팝업메뉴를 열고, 메뉴 아이템을 클릭하면 어떤 아이템이 클릭되었는지 메인패널의 스태틱 텍스트를 통해 알려준다. 팝업메뉴는 wx.Menu를 상속해서 별도의 클래스로 만들고, 이를 객체화 하여 마우스 우클릭시 뜨도록 바인딩을 해 주었다.
반응형
import wx
class Example(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self,parent,id,'Example Window', size=(400,300))
# 메인 패널
self.panel = wx.Panel(self, 5000)
"""
박스사이저 아이템 : 스태틱비트맵 + 텍스트
"""
# 텍스트
self.st = wx.StaticText(self.panel, 5001, "팝업메뉴 예제", style=wx.ALIGN_CENTER)
# 폰트설정
font = wx.Font(30, wx.FONTFAMILY_DEFAULT,
wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
self.st.SetFont(font)
# 박스사이저
bsizer = wx.BoxSizer(wx.VERTICAL)
bsizer.AddStretchSpacer(1)
bsizer.Add(self.st, 1, wx.EXPAND)
bsizer.AddStretchSpacer(1)
self.panel.SetSizer(bsizer)
# 패널 우클릭시 팝업메뉴 이벤트 바인딩
self.panel.Bind(wx.EVT_RIGHT_DOWN, self.OnPopupMenu)
self.st.Bind(wx.EVT_RIGHT_DOWN, self.OnPopupMenu)
# 팝업메뉴
def OnPopupMenu(self,e):
# 팝업메뉴 객체 생성
pmenu = PopupMenu(self)
# position 위치에 팝업메뉴 생성
self.PopupMenu(pmenu, e.GetPosition())
pmenu.Destroy()
# 팝업메뉴
class PopupMenu(wx.Menu):
def __init__(self, frame):
wx.Menu.__init__(self)
self.frame = frame
# 메뉴 아이콘
img_apple = wx.Bitmap(wx.Image("d:/icon/apple.png").Scale(16,16))
img_carrots = wx.Bitmap(wx.Image("d:/icon/carrots.png").Scale(16, 16))
img_grapes = wx.Bitmap(wx.Image("d:/icon/grapes.png").Scale(16, 16))
# 메뉴 아이템 생성
apple = wx.MenuItem(self, 101, "사과")
carrots = wx.MenuItem(self, 102, "당근")
grapes = wx.MenuItem(self, 103, "포도")
# 메뉴 아이템에 이미지 연결
apple.SetBitmap(img_apple)
carrots.SetBitmap(img_carrots)
grapes.SetBitmap(img_grapes)
# 메뉴에 아이템 연결
self.Append(apple)
self.Append(carrots)
self.AppendSeparator() # 구분자
self.Append(grapes)
# 메뉴 아이템 클릭시 이벤트 바인딩
self.Bind(wx.EVT_MENU, self.OnApple, apple)
self.Bind(wx.EVT_MENU, self.OnCarrots, carrots)
self.Bind(wx.EVT_MENU, self.OnGrapes, grapes)
def OnApple(self, e):
self.frame.st.SetLabel("사과 선택됨")
self.frame.panel.Layout()
def OnCarrots(self, e):
self.frame.st.SetLabel("당근 선택됨")
self.frame.panel.Layout()
def OnGrapes(self, e):
self.frame.st.SetLabel("포도 선택됨")
self.frame.panel.Layout()
if __name__=="__main__":
app = wx.App()
frame=Example(parent=None, id=-1)
frame.Show()
app.MainLoop()
도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :)
반응형
'wxPython' 카테고리의 다른 글
파이썬 GUI, 툴바 wx.ToolBar (0) | 2023.04.22 |
---|---|
파이썬 GUI, 파일컨트롤 wx.FileCtrl (0) | 2023.03.26 |
파이썬 GUI, 파이비지인포 PyBusyInfo (0) | 2023.03.21 |
파이썬 GUI, 풍선 팁 BalloonTip (0) | 2023.03.21 |
파이썬 GUI, 노트북, 탭 창 wx.Notebook (0) | 2023.03.19 |