test1.py 프로그램

아래부터는 풀 소스..

주석을 제외하고는 100 라인 미만의 아주 간단한 프로그램이다.

Python 과 wxPython 이 설치 되어 있다면 단순한더블 클릭으로 실행이 가능하다.

여기

test1.py 서 파일을 받으삼.

소스 자체가 설명이므로 그 외의 설명은 별도로 하지 않는다.

www.python.or.kr 국내 파이썬 관련 사이트(운영 안됨)

파이썬 기초 강좌 (문법 참고)

http://kmh.ync.ac.kr/java/python/note/index.html

아래부터는 소스

# *-* coding: euc-kr -*-
# 윗 줄은 이 소스내에 한글이 있음을 python 에게 알리는 것이다.
# 윗 줄이 없으면 한글을 문자로 인식하지 못하고 에러를 낸다.


# 임포트(import) 는 C 의 include 와 같은 개념이다.
# 한가지 다른 것은, 소스와 라이브러리의 구분이 없기 때문에, import 만으로 모든게 끝난다.

import os # os 관련 기본
import random # random 함수
import wx # wxPython 라이브러리


#############################################################################
# 여기서는 기본적인 함수 정의를 보인다
# pnts 라는 변수를 선언하여 pnts.append 로 리스트를 추가한다.
# 파이썬,y1,y2 역시 사용과 동시에 생성된다.
#############################################################################
def makeRandomLines(num, w, h):
pnts = []

for i in range(num):
x1 = random.randint(0, w)
y1 = random.randint(0, h)
x2 = random.randint(0, w)
y2 = random.randint(0, h)
pnts.append( (x1,y1, x2,y2) )

return pnts

##########################################################################
# 데모용 코드(무의미함)
# lines 라는 변수를 선언하여 makeRandomLines 로 부터의 리턴 값을 채운다
# 즉 윗 함수의 lines = pnts 가 됨.
#########################################################################
lines = makeRandomLines(30, 1024, 768)


#######################################################
# 이 함수는 PAINT 이벤트(WM_PAINT 이벤트 발생 조건은 윈도 프로그래밍 서적 참고)
# 가 발생 했을때 부를 것이다.
#######################################################
def TestLines(dc): # dc 는 DeviceContext 약자, 윈도 프로그램 서적 참고
dc.BeginDrawing()
dc.SetPen(wx.Pen("RED", 1)) # Pen 을 설정한다.
dc.DrawLineList(lines) # 선을 그린다.
# 아래 주석 처리된 것은 다른 형태의 Pen 지정이다. 시간 나면 조금씩 바꿔보자
#dc.DrawLineList(lines, wx.Pen("BLACK", 1))
#dc.DrawLineList(lines, pens)

dc.EndDrawing()

#######################################################################################
# 위 함수를 보면 알겠지만 dc.DrawLineList 라는 함수 자체가 List(자료구조)를 받아서
# 스스로 작동(끝까지 알아서 그려줌)것을 알 수 있다.
# List 의 자료형은 (x1,y1,x2,y2) 이다, 사실 파이썬에서 자료형은 무의미함.
# 따라서 대량의 데이터를 취급하는데 번잡한 루프나 배열, 혹은 크기를 알릴 필요가 없다
#######################################################################################

#---------------------------------------------------------------------------

####################################################################################
# 변수 선언과 동시에 ID(고유의 상수 값)를 순번대로 할당한다
# 이 고유 번호는 메뉴의 각 항목에 할당시켜, 해당 메뉴 항목이 클릭 되었을 때
# 할당된 고유 번호가 되돌아 오도록 하는 것에 쓰임.
# 중복만 되지 않는다면 어떤 번호라도 무방하다.
# ID_ABOUT = 1, ID_EXIT = 2, ID_OPEN = 3, 식으로 해도 무방.
####################################################################################
ID_ABOUT = wx.NewId()
ID_EXIT = wx.NewId()
ID_OPEN = wx.NewId()

####################################################################################
# MyFrame 클래스 정의
# 클래스 정의는 방대하므로 여기서는 그냥 형태만 보고 지나가자
# __init__ 가 생성자 라는 것은 그냥 봐도 알 수 있을 것이다.
####################################################################################
class MyFrame(wx.Frame):
def __init__(
self, parent, ID, title, pos=wx.DefaultPosition,
size=wx.DefaultSize
):

wx.Frame.__init__(self, parent, ID, title, pos, size)

# 프레임 아래쪽에 표시되는 상황선 설정
self.CreateStatusBar()
self.SetStatusText("This is the statusbar")


# 이제 메뉴를 만들 것이다.
menu = wx.Menu()

# 메뉴에 Open 항목 추가
menu.Append(ID_OPEN, "&Open", "File open")
# 메뉴에 구분선 추가
menu.AppendSeparator()
# 메뉴에 About 항목 추가
menu.Append(ID_ABOUT, "&About", "More information about this program")
# 메뉴에 Exit 항목 추가
menu.Append(ID_EXIT, "E&xit", "Terminate the program")

# 메뉴 바를 만든다
menuBar = wx.MenuBar()
# 메뉴 바에서 위에서 만든 메뉴가 표시되도록, 위에서 만든 "menu" 객체를 추가한다
menuBar.Append(menu, "&File");

# 완성된 메뉴 바를 윈도우에 설정한다.(붙인다)
self.SetMenuBar(menuBar)

# 아래는 해당 이벤트 번호가 불러질 때, 이벤트 처리 함수를 연결(바인드)시켜준다
self.Bind(wx.EVT_MENU, self.OnAbout, id=ID_ABOUT)
self.Bind(wx.EVT_MENU, self.OnCloseWindow, id=ID_EXIT)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
self.Bind(wx.EVT_PAINT, self.OnPaint)

# 각 이벤트 처리 함수들
def OnCloseMe(self, event):
self.Close(True)

def OnCloseWindow(self, event):
self.Destroy()

def OnPaint(self, evt):
dc = wx.PaintDC(self)
dc.Clear()
TestLines(dc)

# about 선택시 나오는 다이얼로그박스
def OnAbout(self, event):
dlg = wx.MessageDialog(self, "으하하This sample program shows off\n"
"frames, menus, statusbars, and this\n"
"message dialog.",
"About Me", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()



####################################################################
# 이 객체는 단순히 프로그램을 실행하기 위해 존재함.
####################################################################
class MyApp(wx.App):
def OnInit(self):
win = MyFrame(None, -1, "Test1", size=(640, 480) )
win.Show(True)
self.SetTopWindow(win)
return True
#---------------------------------------------------------------------------

####################################################################
# MyApp 객체의 인스턴스 app 를 생성하고 실행 시킨다
####################################################################
app = MyApp(0)

# MainLoop 는 wxPython 이 제공하는 것임
app.MainLoop()


# 참고 나도 아직까지 모르는 부분이 많음. ㅋㅋㅋㅋ