본문 바로가기
Python/wxPython

wxPython 기초 사용법 (프레임, 메뉴바, Sizer)

by 쿠리의일상 2023. 10. 10.

설치하기

pip install wxPython
import wx

 

기본적으로 아래처럼 Frame을 바로 만들어서 사용해줄 수 있으나 클래스화 하여 만들어준다.

app = wx.App()

frame = wx.Frame(None, -1, 'Title')
frame.Show()

app.MainLoop()

크게 App() 으로 프레임을 넣어줄 화면을 지정하고 그 안에 Frame()으로 넣어줄 내용을 정의한다.

이때 wx.Frame 부분을 class 화 해주는 것이다.

 

메인 Frame 을 클래스화

class MainFrame(wx.Frame):
  def __init__(self, parent, id, title):
    wx.Frame.__init__(self, parent, id, title, size=(350, 400))

클래스 안에 __init__ 메서드를 만들어서 wx.Frame.__init__() 처리를 해준다.

 

def openFrame():
  app = wx.App()
  frame = MainFrame(None, -1, 'Example')
  
  frame.Bind( wx.EVT_LEFT_DOWN, ClickFrame )
  frame.Show()
  app.MainLoop()
  
openFrame()

프레임을 불러올 때마다 위 함수를 실행시켜주면 된다.

 

Frame 안에 메뉴바 넣어주기

wx.MenuBar() 를 사용하여 메뉴에 넣어줄 내용을 채워준다.

 

menu_bar = wx.MenuBar()
file = wx.Menu()
edit = wx.Menu()
help = wx.Menu()
menu_bar.Append(file, '&File')
menu_bar.Append(edit, '&Edit')
menu_bar.Append(help, '&help')
self.SetMenuBar(menu_bar)

# 메뉴바에 해당하는 하위 메뉴들을 아래처럼 설정해줄 수 있다.
file.Append(101, 'Example menu')
file.Append(102, 'Exit')

위 형태라면 이렇게 뜰 것이다.

 

Sizer 를 이용한 레이아웃 구성

레이아웃을 위해선 가장 큰 Frame 안에 Panel을 나눠주는 것이 좋다. 여기에 사용되는 여러 Sizer 들이 있는데, 나의 경우 큰 레이아웃으로는 BoxSizer()로 수평/수직 정렬처리를 한 다음

세부적인 레이아웃으로 작게 패널을 만들고 그 위치를 잡아준다.

panel = wx.Panel(self, -1)
panel.SetBackgroundColour('#ccc')
vBoxP = wx.BoxSizer(wx.VERTICAL)

topP = wx.Panel(panel, -1)
midP = wx.Panel(panel, -1)
bottomP = wx.Panel(panel, -1)

vBoxP.Add(topP, 1, wx.EXPAND|wx.ALL, 5)
vBoxP.Add(midP, 1, wx.EXPAND|wx.ALL, 5)
vBoxP.Add(bottomP, 1, wx.EXPAND|wx.ALL, 5)
panel.SetSizer(vBoxP)
self.Centre()

 

레이아웃 잡는 게 꽤 헷갈리는데 기본적으로 여러 Sizer를 겹치고 겹쳐서 위치를 잡아준 다음 wx.EXPAND나 wx.ALIGN 관련 값을 사용해준다. 자세한 사항은 공식 문서를 참고하는 것이 좋겠다.