반응형

 Frame 만들기1

 

 여기서 Frame이란 윈도우 창틀을 말한다. 윈도우 창 안에는 버튼과 같은  컨트롤이 추가될 수 있고 메뉴나 상태바도 추가될 수 있다. 대부분 윈도우즈 프로그램은 창안에 버튼 조작이나 메뉴 조작을 통해 프로그램을 다룬다. 윈도우 창틀은 이런 것들을 담고 있는 그릇과 같다. 우리는 지금부터 이런 창틀, Frame을 만들어 볼 것이다.

 

 

 빈 Frame을 만들자

 

Example1을 코딩하고 실행해 보자.

 


 Example1 : 빈 Frame을 만든다.

# -*- coding: UTF-8 -*-
import wx;
class MyFrame(wx.Frame) :
    def __init__(
            self, parent, ID, title, pos = wx.DefaultPosition,
            size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE
            ) :
        wx.Frame.__init__(self, parent, ID, title, pos, size, style);
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow);
        self.Initialize();
    def OnCloseWindow(self, evt) :
        self.Destroy();
    def Initialize(self) :
        pass;
if __name__ == "__main__" :
    class MyApp(wx.App) :
        def __init__(self, redirect = 0) :
            wx.App.__init__(self, redirect);
        def OnInit(self) :
            frame = MyFrame(
                None, -1, "MyFrame", pos = wx.DefaultPosition, size = (450, 300));
            frame.Show(True);
            self.SetTopWindow(frame);
            return True;
    app = MyApp();
    app.MainLoop();

 

 코딩했다면 실행해 보자. 파일이름이 example_frame_1.py라면 콘솔창에 pythonw example_frame_1.py 라고 타이핑해서 실행해야 마땅하다. 하지만 에러가 나면 에러창을 제대로 볼 수 없기 때문에 우선 콘솔 프로그램을 실행하듯 python example_frame_1.py 라고 타이핑하고 실행하자. 이렇게 해주면 에러가 났을 때 에러 메시지를 콘솔창에 뿌려주게 된다. 에러가 없으면 그때부터 pythonw를 써서 사용할 수 있다.

 

사용자 삽입 이미지
   Figure1

 

 실행했을 때 Figure1 처럼 빈 Frame이 뜨면 성공이다.

 

 wxPython의 모듈 이름은 wx이다. wxPython을 설치했다면 import wx 하는 것으로 wxPython를 사용할 수 있다.

 

 위 예제에서 2개의 클래스가 정의되었다. 하나는 MyFrame이고 또 하나는 MyApp이다. 두 클래스는 각각 wx.Frame과 wx.App를 상속 받았다. wx.Frame은 창틀을 정의한 넘이고 wx.App는 어플리케이션(프로그램)을 실행해주는 넘이다. 윈도우 프로그래밍 대부분은 이처럼 상속받아서 코딩되어 지는 경우가 많은데 이유는 코딩이 훨씬 깔끔해지고 쉬워지며 나중에 필요에 따라 재사용 할 수 있기 때문이다.

 

 MyFrame부터 천천히 살펴보자. __init__ 메서드를 재정의 했는데 여기에선 베이스 클래스인 wx.Frame을 초기화하고 위젯(버튼이나 텍스트 창 등)을 초기화한다. 나는 __init__에서 위젯을 바로 초기화하지 않고 Initialize() 메서드를 만들어 거기에 위젯을 따로 초기화한다. Example1에선 어떤 위젯도 만들지 않았으므로 Initialize()는 빈 메서드로 남아있다. __init__에서 여러 인수들이 wx.Frame에 전달되는데 인수들은 (부모창, 고유번호, 타이틀, 창 위치, 창 사이즈, 창 스타일)로 구성된다. 부모창은 None 인수가 전달되었는데 MyFrame창 보다 상위 창이 없기 때문이다. 고유번호(ID)는 창의 고유번호를 지정해 줄 수 있는데 말 그대로 각각의 창을 구분할 수 있는 고유번호이다. 고유번호를 지정해 주지 않으려면 -1을 전달해 주면 된다. 타이틀은 타이틀바에 표시되는 이름이며 여기서는 "MyFrame" 란 이름이 전달되었다. __init__ 에 self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) 를 눈 여겨 보자. Bind() 메서드는 이벤트(키보드나 마우스 이벤트 등)와 이벤트 핸들러를 연결시켜 주는 함수이다. 이벤트 핸들러는 해당 이벤트가 발생되었을 때 호출되는 함수이다. 여기서 OnCloseWindow() 메서드가 이벤트 핸들러이고 wx.EVT_CLOSE는 창이 닫힐 때 발생되는 이벤트이다. 고로 창이 닫힐 때 OnCloseWindow() 가 호출된다. OnCloseWindows() 에서 Destroy() 메서드를 호출했는데 이 함수는 MyFrame의 모든 자원을 시스템에 돌려준다. 마약 Destroy() 함수를 호출한 후 외부에서 이 객체에 엑세스하려 든다면 에러가 발생하게 될 것이다.

 

 MyApp에서 재 정의된 OnInit() 메서드는 어플리케이션이 실행될 때 같이 호출되는 함수이다. 보는 봐와 같이 MyFrame을 여기에서 생성하는 건 당연하다. frame.Show(True)에서 Show() 메서드는 창을 화면에 보여주는 함수이다.


반응형

'Python' 카테고리의 다른 글

[wxPython] 네이버 사전  (0) 2007.04.12
이클립스와 앤트를 이용한 파이슨 개발  (0) 2007.04.12
wxPython  (0) 2007.04.12
Posted by Real_G