wxPython

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

wx.Factory 2023. 3. 12. 13:08
반응형

 

개요 

    스태틱박스사이저(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()

 

 

 

 

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

 

반응형