본문 바로가기

wxPython

파이썬 GUI, 버튼 생성 후 이벤트 등록하기

반응형

 

개요 

    가장 많이 쓰는 위젯인 버튼(wx.Button)을 생성하고, 눌렀을 때 프로그램이 닫히는 이벤트를 구현해본다. 

 

 

wx.Button 

    버튼(wx.Button)은 문자열을 포함하고 가장 자주 쓰이는 위젯이다. 버튼은 보통 패널(wx.Panel) 위나 다이얼로그 상자(wx.Dialog)나 혹은 윈도우(wx.Frame) 창 위에도 놓일 수 있다. 변수 선언은 다음과 같이 한다. 

 

btn = wx.Button(parent, id=wx.ID_ANY, label="버튼라벨", pos=wx.DefaultPosition,
                size=wx.DefaultSize, style=0, validator=wx.DefaultValidator,
                name="")

 

    버튼을 정의할 때 필요한 각각의 인수에 대해 설명하면 아래와 같다. 

    parent는 버튼의 부모 클래스로 wx.Panel 등 버튼이 놓이게 될 상위 오브젝트가 된다. 

    id는 특별한 경우가 아니면 임의 할당이 되도록 -1 혹은 wx.ID_ANY를 입력한다. 

    label은 버튼에 표시되는 텍스트 문구이다. 

    pos는 튜플로 된 스크린상에서 버튼의 위치 (x,y) 픽셀 좌표이다. 

    size는 튜플로 된 버튼의 픽셀 크기 (x,y) 이다. 

    style은 버튼 레이블의 정렬위치나 경계라인을 결정짓는 인수이다. 일반적인 경우에는 빠뜨려도 무방하다. 자세한 설명은 wxPython 공식사이트를 참조하자. (https://docs.wxpython.org/wx.Button.html#styles-window-styles)

 

 

 Event Handling (Bind) 

    버튼을 눌렀을 때 어떤 기능을 수행하기 위해서는 이벤트 핸들링을 해야 한다. 이벤트란 키보드 누르기나 마우스 클릭 등 사용자의 어떤 행위를 의미하고, 이러한 이벤트를 프로그램에서 처리하는 것을 이벤트 핸들링이라고 한다. 특히, wxPython에서는 이벤트 핸들링을 위해 Bind를 많이 사용한다. 

    Bind는 아래와 같이 호출할 수 있다. 

반응형
self.Bind(wx.EVT_BUTTON, self.OnCloseBtnPressed, btn)

 

    self는 wx.Frame이며 윈도우 프레임에 이벤트 핸들러를 바인딩 한다고 생각하면 된다. 

    첫 번째 인수는 이벤트 종류를 결정한다. 여기서는 버튼을 눌렀을 때 생기는 이벤트(wx.EVT_BUTTON)이다. 

    두 번째 인수는 이벤트 발생시 호출할 함수명이다. 

    그리고 마지막 인수는 해당 이벤트를 발생시키는 버튼 객체이다. 

 

 

예제 

    아래는 버튼을 누르면 이벤트 핸들러를 작동시켜 프로그램 종료를 하는 예제이다. 

 

import wx

class ButtonExample(wx.Frame):
    def __init__(self):
        # Frame 초기화
        wx.Frame.__init__(self,
                          None,
                          id=wx.ID_ANY, # id에 -1 혹은 wx.ID_ANY를 입력하면 자동으로 아이디가 할당
                          title='Button Example',
                          size=(280,200), pos=(100,100)) # 창 사이즈와 위치를 조절


        # 버튼을 포함할 패널을 생성한다.
        panel = wx.Panel(self,-1)

        # 버튼 객체 생성
        closebtn = wx.Button(parent=panel,          # 부모클래스 = panel
                             id=wx.ID_ANY,          # 아이디 = 임의 할당
                             label="프로그램 종료",   # 버튼 텍스트
                             pos=(50,50),           # 부모클래스(패널)에서 버튼의 위치
                             size=(150,40))         # 버튼 크기

        # 버튼을 눌렀을 때 실행될 함수 지정
        self.Bind(wx.EVT_BUTTON, self.OnCloseBtnPressed, closebtn) # argument: 이벤트 종류 / 실행할 함수 / 이벤트핸들러(버튼)

    def OnCloseBtnPressed(self, event):
        # 창 닫기
        self.Close(True)


if __name__ == "__main__":
    app = wx.App()
    window = ButtonExample()
    window.Show()

    # app 실행
    app.MainLoop()

 

    버튼(closeBtn)을 누르면 self.OnCloseBtnPressed 함수가 호출되고 프레임(self)이 닫힌다. 

 

 

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

 

 

 

반응형