본문 바로가기

wxPython

파이썬 GUI, 박스사이저 wx.BoxSizer

반응형

 

개요 

    위젯이 많아지면 위젯끼리 상대적으로 어떻게 배치하는가가 중요해진다. 이렇게 위젯의 배치를 도와주는 클래스들을 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()

 

 

 

 

    도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :) 

 

반응형