파이썬 강의/wx

파이썬 GUI(wxPython) 7. 문자 표현 : StaticText / TextCtrl

마리사라 2021. 1. 19. 14:39
반응형

이번 강의는 GUI상에서 문자를 표현하는 방법인 StaticText와 TextCtrl을 알려드리겠습니다.


1. StaticText

StaticText는 이름대로 정적인 텍스트입니다. 그렇기에 다른 조작이 가해지지 않는 이상 바뀌지 않고 지속됩니다.

이전, 6 번째 강의의 본문 중 일부

가장 쉽게 이해하는 방법은 인터넷 게시글입니다. 인터넷 게시글의 본문은 기본적으로 사용자가 조작할 수 없으며, 다른 위젯과의 상호작용으로 만 조작이 됩니다.

 

wxPython에서 StaticText는 다음과 같습니다.

self.text = wx.StaticText(self, id=1, label='StaticText')

기본적으로는 위의 형식을 갖추기만 해도 선언되지만, 받을 수 있는 파라미터는 다음과 같습니다.

  • parent : 해당 위젯이 선언 될 창. None을 가질 수 없습니다.
  • id : 해당 위젯의 식별자를 부여합니다. 이때 -1일 경우 기본값을 부여합니다.
  • label : StaticText에 표시될 내용을 입력합니다.
  • pos : 해당 StaticText의 위치를 입력합니다
  • size : 해당 StaticText의 크기를 입력합니다.
  • style : 해당 StaticText의 스타일을 입력합니다.
  • name : 해당 위젯의 이름을 지정해줍니다.

이제, 이전에 BoxSizer에 추가했던 button 대신, StaticText를 추가해 보겠습니다.

sizer.Add(self.text, 0, wx.ALL, 5)

 

StaticText가 추가된 GUI

StaticText는 SetLabel을 통해 표시되는 내용을 바꿔줄 수 있습니다.

self.Bind(wx.EVT_BUTTON, self.ButtonClick)

우선 id=1에 Bind했던 id값을 없애줍니다. 이렇게 하면 모든 Button이 ButtonClick이벤트로 연결됩니다.

def ButtonClick(self, event):
    dialog = wx.MessageDialog(self, '정말로 누르셨습니까?', '확인', wx.YES_NO)
    # dialog.ShowModal()
    if dialog.ShowModal() == wx.ID_YES:
        self.text.SetLabel('Yes 눌렀음')
    else:
        self.text.SetLabel('No 눌렀음')
    dialog.Destroy()

단순히 print만 있던 이벤트에서, text의 Label을 변경하는 SetLabel로 바꾸어 줍니다. 이제부터 화면상의 모든 버튼이 Yes_No 다이얼로그가 표시되며, 그의 결과에 따라 StaticText의 Label이 바뀌게 됩니다.

좌 : Yes 클릭 / 우 : No 클릭


2. TextCtrl

TextCtrl은 StaticText와 달리, 사용자가 Text를 편집할 수 있는 Text입니다. 이때 입력한 Text는 다른 이벤트에서 사용 가능한 Value값으로 사용이 가능합니다.

self.text2 = wx.TextCtrl(self, id=2, value='TextCtrl')

TextCtrl은 StaticText와 파라미터가 거의 비슷합니다. 하지만 TextCtrl은 label이 아닌 value가 파라미터로 들어가게 됩니다.

 

이제 Button2 대신 TextCtrl을 추가해 보겠습니다.

sizer.Add(self.text2, 0, wx.ALL, 5)

TextCtrl이 추가된 GUI

TextCtrl의 value값은 사용자로 부터 입력받은 값을 다른 이벤트에 활용할 수 있습니다.

def ButtonClick(self, event):
    dialog = wx.MessageDialog(self, '정말로 누르셨습니까?', '확인', wx.YES_NO)
    # dialog.ShowModal()
    if dialog.ShowModal() == wx.ID_YES:
        self.text.SetLabel('Yes 눌렀음')
    else:
        self.text.SetLabel(self.text2.GetLabel())
    dialog.Destroy()

이번에는 No를 눌렀을 때, StaticText의 label을 TextCtrl에 입력된 value값으로 변경하는 코드로 작성해 보았습니다.

 

좌 : Yes 클릭 / 우 : No 클릭


3. 마치며

이번 강의에서는 StaticText와 TextCtrl에 대해서 알아보았습니다. 다음 강의부터는 이때까지 배웠던 코드를 바탕으로 계산기를 만들어 보겠습니다. 감사합니다.

class Mainframe(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(500, 500))

        # sizer = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.StaticBoxSizer(wx.VERTICAL, self, '박스')
        button_sizer = wx.GridSizer(5, 4, 0, 0)
        # button_sizer = wx.FlexGridSizer(5, 4, 0, 0)
        # button_sizer = wx.GridBagSizer(5, 4)

        self.text = wx.StaticText(self, id=1, label='StaticText')
        self.text2 = wx.TextCtrl(self, id=2, value='TextCtrl')

        self.Bind(wx.EVT_BUTTON, self.ButtonClick)
        # self.Bind(wx.EVT_BUTTON, self.ButtonClick, self.button)

        menu_bar = wx.MenuBar()
        menu = wx.Menu()
        menu_bar.Append(menu, '메뉴')
        menu.Append(101, '하위 메뉴')
        menu.Append(102, '종료')
        self.SetMenuBar(menu_bar)

        self.Bind(wx.EVT_MENU, self.MenuClick, id=101)
        self.Bind(wx.EVT_MENU, self.Quit, id=102)

        sizer.Add(self.text, 0, wx.ALL, 5)
        sizer.Add(self.text2, 0, wx.ALL, 5)
        sizer.Add(button_sizer, 1, wx.EXPAND, 5)

        # button_sizer.AddGrowableCol(1)
        # button_sizer.AddGrowableRow(1)

        for i in range(20):
            button = wx.Button(self, label='버튼')
            button_sizer.Add(button)
            # button_sizer.Add(button, (i * 2, i * 2), (2, 2), wx.EXPAND)

        self.SetSizer(sizer)

    def ButtonClick(self, event):
        dialog = wx.MessageDialog(self, '정말로 누르셨습니까?', '확인', wx.YES_NO)
        # dialog.ShowModal()
        if dialog.ShowModal() == wx.ID_YES:
            self.text.SetLabel('Yes 눌렀음')
        else:
            self.text.SetLabel(self.text2.GetValue())
        dialog.Destroy()

    def MenuClick(self, event):
        dialog = wx.MessageDialog(self, '메뉴를 누르셨습니다', '메뉴', wx.OK)
        dialog.ShowModal()
        dialog.Destroy()

    def Quit(self, event):
        dialog = wx.MessageDialog(self, '종료하시겠습니까?', '종료', wx.CANCEL)
        if dialog.ShowModal() == wx.ID_OK:
            quit(0)
        else:
            pass
        dialog.Destroy()


def run():
    app = wx.App()
    frame = Mainframe(None, -1, 'Calculator')
    frame.Show()
    app.MainLoop()


run()
반응형