본문 바로가기

wxPython

파이썬 GUI, 창 움직임 트래킹 Frame Movement Tracking

반응형

 

개요 

    경우에 따라 창의 현재 위치나 크기를 알아야 할 때가 있다. 이 경우 어떤 방식으로 값을 얻어오는지 예제를 통해 알아본다. 추가로 키보드 조작을 통해 창 크기를 변경하는 방법도 알아본다. 

 

 

wx.EVT_MOVE

    창이 움직일때 발생하는 이벤트이다. 아래와 같이 바인딩하여 움직임을 감지한다. self는 wx.Frame 객체이며, 프레임 이동 이벤트가 감지 되면 self.OnMove 함수가 작동한다. 

self.Bind(wx.EVT_MOVE, self.OnMove)

    한편, 창이 움직일 때 좌표 값을 얻어오는 함수는 GetPosition() 이고, 창의 크기는 GetSize()로 얻는다. 

 

 

wx.EVT_CHAR_HOOK

    키보드를 누를 때 발생하는 이벤트이다. 해당 이벤트로 실행된 함수에서 event.GetKeyCode()로 눌린 키코드를 알 수 있고, 화살표 키(↓→←)는 다음과 같이 미리 정의된 키코드로 인식한다. 

아래 화살표 키: wx.WXK_DOWN
위 화살표 키: wx.WXK_UP
왼쪽 화살표 키: wx.WXK_LEFT
오른쪽 화살표 키: wx.WXK_RIGHT

 

예제 

    창 위치 값을 받아 이벤트를 발생하는 예제이다. 화살표 키를 눌러 창 크기를 변경할 수도 있다. 

반응형
import wx


class FrameMoveEvent(wx.Frame):
    # FrameMoveEvent 클래스 초기화
    def __init__(self, parent, id):
        # Frame 초기화
        wx.Frame.__init__(self, parent, id, title='FrameMoveEvent Window!', pos=(200,100),size=(450, 350))

        panel = wx.Panel(self,-1)

        # 프레임에 움직임 이벤트를 바인딩
        # 움직임 감지되면 OnMove 함수 실행
        self.Bind(wx.EVT_MOVE, self.OnMove)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnArrowDown)

        # 하단 상태표시줄 생성
        self.status = self.CreateStatusBar()

        # 텍스트
        self.text1 = wx.StaticText(panel, -1, "키보드 화살표를 눌러보세요!! ↑ ↓ → ← ", pos=(30,50), size=(-1,-1))

        # 창 크기 텍스트
        self.framesize = self.GetSize()
        self.text2 = wx.StaticText(panel, -1, "창 크기: "+str(self.framesize), pos=(30, 80), size=(-1,-1))


    def OnArrowDown(self, event):
        # 프레임 객체 사이즈 저장
        x,y = self.GetSize()

        # 키보드 화살표 확인 후 프레임 사이즈 변경
        if event.GetKeyCode() == wx.WXK_DOWN: self.SetSize(x,y+10)
        if event.GetKeyCode() == wx.WXK_UP: self.SetSize(x,y-10)
        if event.GetKeyCode() == wx.WXK_LEFT: self.SetSize(x-10,y)
        if event.GetKeyCode() == wx.WXK_RIGHT: self.SetSize(x+10,y)

        # 프레임 사이즈 텍스트 업데이트
        self.framesize = self.GetSize()
        self.text2.SetLabel("창 크기: "+str(self.framesize))


    def OnMove(self, e):
        # 현재 창의 위치 저장
        x, y = e.GetPosition()
        # 상태표시줄 텍스트 변경
        self.status.SetLabel(" 창을 움직이면 위치가 변합니다  (X위치: "+str(x)+",  Y위치: "+str(y)+")")


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

 

 

 

 

 

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

 

반응형