본문 바로가기

wxPython

파이썬 GUI, 스태틱박스 사이저 wx.StaticBoxSizer

반응형

 

개요 

    스태틱박스사이저(wx.StaticBoxSizer)는 본래 wxPython의 기본 컨테이너인 박스사이저(wx.BoxSizer)를 기반으로 만들어졌다. 단순히 박스사이저의 둘레에 경계선을 그리고 레이블을 추가한 위젯인데, 서로 같은 기능을 하는 위젯들끼리 하나로 묶어 보여줄 수 있어서 활용도가 높다. 예제는 스태틱박스사이저를 활용하여 텍스트파일을 여는 위젯을 구현하였다. 

 

 

wx.StaticBoxSizer 

    스태틱박스사이저의 선언은 아래와 같이 세 줄이 필요하다. 첫째로 레이블(제목)이 있는 스태틱박스(wx.StaticBox)를 선언해야 하고, 둘째로 스태틱박스를 부모로 갖는 스태틱박스사이저(wx.StaticBoxSizer)를 선언한다. 그리고 마지막으로 스태틱박스사이저에 들어갈 위젯들을 .Add() 메소드로 넣어주면 끝이다. 

sbox = wx.StaticBox(parent, -1, '제목 레이블')
sbox_sizer = wx.StaticBoxSizer(sbox, wx.HORIZONTAL)
sbox_sizer.Add(wx.Widget, proportion=1, flag= wx.ALL | wx.EXPAND, border=5)

   Add메소드는 기존 박스사이저와 동일하게 사용 가능하다. 

 

 

예제 

    간단히 텍스트파일을 여는 예제를 구현해보자. 

반응형
import wx
import os


class StaticBoxSizerExample(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self,parent,id,'Example Window', size=(450,150), pos=(500,300))

        panel = wx.Panel(self)

        # 레이블이 있는 스태틱박스
        sbox = wx.StaticBox(panel, -1, '파일열기:')
        # 아이템을 담을 스태틱박스 사이저. 가로방향으로 아이템 배치.
        sbox_sizer = wx.StaticBoxSizer(sbox, wx.HORIZONTAL)
        # 스태틱박스사이저에 담을 아이템 생성 후 담기 (Add())
        tc_address = wx.TextCtrl(panel, 100, "", size=(-1,-1))
        btn_openfile = wx.Button(panel, -1, "열기", size=(80,-1))
        sbox_sizer.Add(tc_address, 1, wx.ALL | wx.EXPAND, 5)
        sbox_sizer.Add(btn_openfile, 0, wx.ALL | wx.EXPAND, 5)

        # Textctrl은 파일경로가 표시될 위젯이므로 편집 불가로 설정
        tc_address.SetEditable(False)

        # 스태틱박스를 담을 박스사이저 생성
        bsizer = wx.BoxSizer(wx.VERTICAL)
        bsizer.Add(sbox_sizer, 0, wx.ALL|wx.EXPAND, 15)
        panel.SetSizer(bsizer)

        # 열기 버튼 이벤트 바인딩
        self.Bind(wx.EVT_BUTTON, lambda e: self.OpenFile(e), btn_openfile)



    # 버튼 클릭시 동작
    def OpenFile(self, e):
        # 파일 대화상자 : 텍스트 파일만 열기
        with wx.FileDialog(self, "Open GIF file", wildcard="GIF file (*.gif)|*.gif",
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:

            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return  # 캔슬 누르면 그냥 종료

            # OK누르면 파일경로 받아오기
            pathname = fileDialog.GetPath()
            # 아이디가 100인 위젯 찾기 (tc_address)
            tc_address = wx.FindWindowById(100)
            # TextCtrl에 파일 경로 표시하기
            tc_address.SetValue(pathname)
            try:
                # 파일 열기
                with open(pathname, 'r') as file:
                    # 파일의 모든 줄을 읽어옴
                    txt = file.readlines()
                    print() # 한 칸 띄고 출력
                    for line in txt:
                        # 텍스트파일 출력
                        print(line)
            # 파일 읽기 에러 발생시
            except IOError:
                wx.LogError("파일을 열 수 없습니다. '%s'." % os.path.basename(pathname))


if __name__=="__main__":
    app = wx.App()
    frame=StaticBoxSizerExample(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

 

 

 

 

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

 

반응형