개요
위젯이 많아지면 위젯끼리 상대적으로 어떻게 배치하는가가 중요해진다. 이렇게 위젯의 배치를 도와주는 클래스들을 wxPython에서는 컨테이너(Container)라고 부른다. 컨테이너에는 박스사이저(wx.BoxSizer)외에도 그리드사이저(wx.GridSizer), 플렉시그리드사이저(wx.FlexGridSizer) 등이 있으며 이 글에서는 가장 간단한 컨테이너인 박스사이저에 대해 알아본다.
wx.BoxSizer
박스사이저(wx.BoxSizer)는 가장 단순한 컨테이너이다. 기본적으로 가로방향 배열(Horizontal)과 세로방향 배열(Vertical) 두 가지를 지원한다. 사용법은 아래와 같이 먼저 박스사이저의 타입을 지정하여 선언해 준 뒤,
hsizer = wx.BoxSizer(wx.HORIZONTAL)
생성된 박스사이저 객체에 .Add() 메소드를 통해 각각의 위젯들을 차례로 담으면 된다. Add() 메소드의 인자는 아래와 같다.
hsizer.Add(widget, proportion=0, flag=wx.EXPAND, border=5)
widget: 박스사이저에 담을 위젯 인스턴스이다.
proportion: 박스사이저에서 위젯 크기가 차지하는 비중이다. 사이저가 HORIZONTAL 배열이면 가로방향 전체 길이에서 위젯의 비율을 의미하고, VERTICAL이면 세로방향 전체 길이에서 위젯 세로길이 비율을 의미한다. proportion=0이면, 위젯 크기 비율의 증가/감소 없이 위젯 자체 크기를 그대로 사용하겠다는 의미이다. 자세한 부분은 예제를 통해 확인해보자.
flag: 박스사이저 위젯의 border 두께가 적용되는 영역(wx.LEFT, wx.RIGHT, wx.TOP, wx.BOTTOM)을 결정하고, 프레임의 크기가 변경되었을 때 위젯 크기도 그에 따라 변하게 되는 wx.EXPAND 등을 설정할 수 있다.
border: 위젯과 박스사이저 가장자리 사이 두께이다.
예제
박스사이저에 버튼이 하나씩 추가될 때 마다 어떻게 달라지는지 확인해보자. 버튼 번호가 증가할 때 버튼 가로 사이즈 비율인 proportion도 같이 증가한다.
import wx
class BoxSizerExample(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self,parent,id,'수직박스사이저에 위젯을 Add할 때...', size=(-1,-1))
self.panel = wx.Panel(self)
# 버튼 5개 생성
self.buttons = [wx.Button(self.panel, -1, "버튼"+str(i)) for i in range(5)]
# 수평 박스사이저 생성
self.sizer = wx.BoxSizer(wx.HORIZONTAL)
# 박스사이저에 첫 번째 버튼 할당
# 2번째 인자 proportion은 박스사이저에서 위젯이 '수평방향'으로 차지하는 길이의 비율입니다
# for i in range(len(self.buttons)):
# self.sizer.Add(self.buttons[i], proportion=1+i, flag=wx.EXPAND, border=5)
# 패널에 박스사이저 할당
self.panel.SetSizer(self.sizer)
# 박스사이저 크기에 맞게 프레임 사이즈 조절
# self.sizer.Fit(self)
for i in range(len(self.buttons)):
# 1초에 1개씩 버튼 생성하여 수평박스사이저에 할당
wx.CallLater(1000*i, self.AddButton, i)
# 수평박스사이저에 1초에 1개씩 버튼 할당
# 수평박스사이저에 위젯을 Add하면 어떻게 변하는지 보세요!!
def AddButton(self,i):
self.sizer.Add(self.buttons[i], proportion=2+i, flag=wx.EXPAND, border=5)
self.sizer.Fit(self)
if __name__=="__main__":
app = wx.App()
frame=BoxSizerExample(parent=None, id=-1)
frame.Show()
frame.Center()
app.MainLoop()
도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :)
'wxPython' 카테고리의 다른 글
파이썬 GUI, 라디오버튼 wx.RadioButton (0) | 2023.02.25 |
---|---|
파이썬 GUI, 진행률 바 wx.Gauge (2) | 2023.02.25 |
파이썬 GUI, 슬라이더 wx.Slider (0) | 2023.02.25 |
파이썬 GUI, 스핀컨트롤 wx.SpinCtrl (0) | 2023.02.25 |
파이썬 GUI, 메시지 다이얼로그 wx.MessageDialog (0) | 2023.02.25 |