GUI Programming - Part 2 ( GUI for Python - wxPython ) 2001. 5. 22(화) Python Essential 세미나 GUI Programming - Part 2 ( GUI for Python - wxPython ) 발표자 : 최용준
Python’s GUI Binding (1) Tkinter “TK interface” TK GUI toolkit / Python standard module Unix, Windows, Mac 등에서 사용 PyGTK Gtk+(Gimp Tool Kit) widget을 위한 Python binding Tkinter: 가장 고전적인 GUI 툴킷. 단순하다는 장점이 있지만, 느린 속도와 고전적인 스타일 위젯으로 현재는 잘 사용되지 않음 PyGTK: Qt와 대등한 또 다른 GUI 툴킷으로, GTK의 파이썬 바인딩. 이것 역시 아주 방대한 라이브러리와 쉬운 프로그래밍으로 인기있음. 레드햇 리눅스 설치 프로그램인 아나콘다에 사용된 GUI 툴킷
Python’s GUI Binding (2) Gnome-python GNOME의 Python binding PyQt Python의 Qt 확장모듈 PyKDE Python의 KDE 확장모듈 Etc… WPY(MFC, Tk), Pmw(Tkinter), FXPY(FOX GUI lib. Interface) PyQt: 최근에 많이 사용되고 있는 Qt라이브러리의 파이썬 바인딩. 방대한 라이브러리와 현대적인 감각의 위젯으로 많이 사용되고 있는 툴킷
wxPython Module wxWindows GUI lib.를 Python에서 사용하기 위한 Python 확장 모듈 C와 C++, SWIG(Simplified Wrapper and Interface Generator), Python으로 작성 wxPython: wxWindows의 파이썬 바인딩. 아주 강력하며 쉬운 프로그래밍 방식으로 전 세계적으로 아주 많은 인기를 끌고 있음.. 특히 초보자가 사용하기에 적절하며 프로그래밍하기에도 쉬움. MFC 라이브러리의 축소판이라고 해도 될 정도로 아주 정교하고 체계적인 라이브러리임. 인터페이스 생성기, SWIG: SWIG는 Tcl, 펄, 파이썬, Guile 등의 인터프리트 언어에서 C, C++, 오브젝티브 C로 만들어진 확장모듈을 손쉽게 사용할 수 있도록 도와주는 인터페이스 생성기이다.
wxWindows, native API wxWindows GTK+ Motif Windows API Mac Windows System OS Native API
Python Application Program wxPython, wxWindows Python Application Program wxPython Module wxWindows GTK+ Windows API Windows System OS
wxWindows C++로 작성된 Cross-platform GUI library MS-Windows(w)와 X-Window(x)에서 사용 가능하다는 뜻의 wx 현재 Windows, X-Window, Mac에서 사용가능
wxWindows 특징 (1) 최소한의 코드 수정으로 cross platform C++ 응용프로그램 작성 Native API에 대해 각각의 wxWindows버전이 존재, native GUI의 ‘look and feel’을 갖음 파일복사, 삭제, 소켓, 쓰레드등 운영체제간 공통적인 기능을 제공 스트링, 배열, 링크드리스트, 해시테이블등의 데이터 구조
wxWindows 특징 (2) Qt, BeOS, OS/2, Windows CE, QNX/Photon, FLT로의 포팅도 고려하고 있고 일부 개발중
wxPython 특징 Python과 wxWindows의 특징을 모두 가짐 현재는 Gtk+, Windows 버전만 지원 Python과 C++언어상의 특징 때문에 차이점 존재 Argument pointer로 결과값을 반환하는 경우 오버로딩된 함수를 사용하는 경우 차이점 Argument pointer로 결과값을 반환하는 경우 wxWindows Void wxWindows::GetClientSize(int* width, int* height) wxPython No arguments, return tuple(width, height) 오버로딩된 함수를 사용하는 경우 Void wxWindows::GetClientSize(int* width, int *height) wxSize wxWindows::GetClientSize(void) wxGetClientSizeTuple() – return tuple(width, height) wxGetClientSize() – return wxSize object
wxPython 예제1 (1) from wxPython.wx import * class MyApp(wxApp): def OnInit(self): frame = wxFrame(NULL, -1, "Hello from wxPython") frame.Show(true) self.SetTopWindow(frame) return true app = MyApp(0) app.MainLoop()
wxPython 예제1 (2)
wxPython 클래스 구조 Application Class Main Frame Class 화면에 보이지 않는 부분 OS로부터 이벤트를 받아 처리 무한루프(이벤트 드리븐 방식) Main Frame Class 화면에 보이는 부분 버튼, 컨크롤등의 배치 이미 정의된 객체(프레임, 상태바나 메뉴바등)를 변형시킥고자 할 때에는 클래스를 상속 받은 다음, 재정의를 하는 방식을 사용하면 된다.
wxPython 예제2 (1) from wxPython.wx import * ID_ABOUT = 101 ID_EXIT = 102 class MyFrame(wxFrame): def __init__(self, parent, ID, title): wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(200, 150)) self.CreateStatusBar() self.SetStatusText("This is the statusbar") menu = wxMenu() menu.Append(ID_ABOUT, "&About", "More information about this program") menu.AppendSeparator() menu.Append(ID_EXIT, "E&xit", "Terminate the program") menuBar = wxMenuBar() menuBar.Append(menu, "&File"); self.SetMenuBar(menuBar) class MyApp(wxApp): def OnInit(self): frame = MyFrame(NULL, -1, "Hello from wxPython") frame.Show(true) self.SetTopWindow(frame) return true app = MyApp(0) app.MainLoop()
wxPython 예제2 (2)
wxPython EVENT EVT_SIZE EVT_MOVE EVT_CLOSE EVT_PAINT EVT_CHAR EVT_IDLE 프로그램 창의 크기가 변했을 때 발생 EVT_MOVE 프로그램 창의 위치가 이동되었을 때 발생 EVT_CLOSE 메인 프레임이 닫혔을 때 발생 EVT_PAINT 프로그램의 일부분이 가려져, 다시 그려져야 할 필요가 있을 때 EVT_CHAR 키보드가 눌렸을 때 발생 EVT_IDLE 시스템이 어떠한 이벤트를 처리하고 않는 유휴기간일때 발생 EVT_LEFT_DOWN 마우스 왼쪽 버튼이 눌려졌을 때 발생 EVT_LEFT_UP 마우스 왼쪽 버튼을 눌렀다가 뗄 때 발생 EVT_LEFT_DCLICK 마우스 왼쪽 버튼을 더블 클릭 할 때 발생 EVT_MOTION 마우스를 움직일 때 발생 EVT_SCROLL 스크롤 바에서 스크롤을 하게 될 때 발생 EVT_BUTTON 버튼을 클릭했을 때 발생 EVT_MENU 메뉴 항목을 눌렀을 때 발생
wxPython 예제3 (1) from wxPython.wx import * ID_ABOUT = 101 ID_EXIT = 102 class MyFrame(wxFrame): def __init__(self, parent, ID, title): wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(200, 150)) self.CreateStatusBar() self.SetStatusText("This is the statusbar") menu = wxMenu() menu.Append(ID_ABOUT, "&About", "More information about this program") menu.AppendSeparator() menu.Append(ID_EXIT, "E&xit", "Terminate the program") menuBar = wxMenuBar() menuBar.Append(menu, "&File"); self.SetMenuBar(menuBar) EVT_MENU(self, ID_ABOUT, self.OnAbout) EVT_MENU(self, ID_EXIT, self.TimeToQuit) def OnAbout(self, event): dlg = wxMessageDialog(self, "This sample program shows off\n" "frames, menus, statusbars, and this\n" "message dialog.", "About Me", wxOK | wxICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def TimeToQuit(self, event): self.Close(true) class MyApp(wxApp): def OnInit(self): frame = MyFrame(NULL, -1, "Hello from wxPython") frame.Show(true) self.SetTopWindow(frame) return true app = MyApp(0) app.MainLoop()
wxPython 예제3 (2)
wxPython Programming Style 객체(컨트롤)를 생성 객체에 해당하는 속성을 세팅 적절한 이벤트를 객체와 연결시킴 만들어진 객체가 화면에 보이도록 함 사용자의 입력(반응)을 기다림
작은 프로그램 예제 주소록(address.py) by 홍성두 계산기(calculator.py) by 최용준
참고 제2회 파이썬 오픈 세미나 제1회 파이썬 작은 세미나 www.wxpython.org www.wxwindows.org GUI for Python – wxPython (이한승) 해맑은 일기장 for Linux (홍성두) 제1회 파이썬 작은 세미나 wxPython 프로그래밍하기 (홍성두) www.wxpython.org www.wxwindows.org wxWindows User Guide