wxPython 사용 중 에러가 발생할 경우, 에러 메세지가 프로그램을 실행한 콘솔창이 아닌 별도의 창이 생성되면서 출력되는데(print문을 사용하여 출력한 메세지도 마찬가지) 프로그램이 종료되면서 이 창도 사라지기 때문에 에러 메세지 확인이 어렵습니다.


Application 객체 생성시에, 다음 방법을 사용하여, 에러 메세지를 파일로 저장 혹은 콘솔창에 출력하도록 할 수 있습니다.



1. 콘솔창에 출력하기


app = wx.App(False)



2. 외부 파일에 저장하기


app = wx.App(True, filename = "파일명.확장자")





※ P.S


이와 같은 현상은 wx.App를 사용하여 application을 생성하였을 경우에만 발생합니다. wx.PySimpleApp을 사용했을 때는 기본적으로 콘솔창으로 출력되게 되어있습니다.


,
다음 예제 코드는 pyGame 라이브러리를 사용하여 기본적인 화면 디스플레이를 수행하는 방법을 보여줍니다.


우선 화면의 크기를 설정하고, 타이틀바의 텍스트를 설정하고 메인 이벤트 루프로 들어갑니다.


루프 초기에서 몇가지 사소한 이벤트에 대해 처리해준 후에, 칙칙한 검은색으로 화면을 채우고, 조그만 상자를 하나를 그려줍니다.


마지막으로 눈깜박할 시간보다 작은 딜레이를 추가해 FPS(초당 프레임수)를 맞출 수 있는 코드를 추가합니다. 헷갈리지 말아야 할 점은 파라미터로 딜레이 시간이 아닌 목표로 하는 FPS 값이 들어간다는 점입니다.(TARGET_FPS)


이벤트는 닫기 버튼과 ESC 키에 대한 이벤트를 처리하고 있습니다. 이 신경 쓰이는 두가지 이벤트가 발생하면 루프를 빠져나가서 프로그램을 종료합니다.

import pygame
from pygame.locals import *

SCREEN_WD = 400
SCREEN_HT = 400
TARGET_FPS = 60

screen = pygame.display.set_mode((SCREEN_WD, SCREEN_HT), 0, 32)
pygame.display.set_caption("Pygame_Example")
clock = pygame.time.Clock()

running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
            continue
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            running = False
            continue

    screen.fill((0, 0, 0, 0))
    vertices = [(10, 10), (20, 10), (20, 20), (10, 20)]
    pygame.draw.polygon(screen, (0, 255, 0, 0), vertices)
    pygame.display.flip()
    clock.tick(TARGET_FPS)

pygame.quit()
print("done")


참고 사항

파일명을 pygame.py로 저장하지 않도록 주의합니다. pygame.py로 저장하면 다음과 같은 에러가 뜨면서 실행이 안 될 것입니다.

ModuleNotFoundError: No module named 'pygame.locals'; 'pygame' is not a package


<테스트 환경>
 - OS : Windows 7
 - Python 버전 : 3.6
,

[Python] pyBox2D 사용 예제 - 2. Box2D 기본 예제


pyBox2D 첫번째 기본 예제입니다.


실행을 해보면 (0, 5) 좌표에 위치한 박스가 중력에 의해 지면을 향해 떨어져 지면에 부딧혀 멈출 때까지의 박스의 좌표가 출력됩니다. (무려 텍스트로!)

Box2D 자체에는 그래픽 표현 기능이 없으므로 좌표 계산만 해줍니다. 이것을 화면 상으로 표현하는 것은 이후의 예제를 통하여 알아보겠습니다.


from Box2D import *

world = b2World(gravity = (0, -10), doSleep = True)

ground1BodyDef = b2BodyDef()
ground1BodyDef.position.Set(0, 0)
ground1Body = world.CreateBody(ground1BodyDef)
ground1Shape = b2PolygonShape()
ground1Shape.SetAsBox(50, 1)
ground1Body.CreateFixture(shape = ground1Shape)

box1BodyDef = b2BodyDef()
box1BodyDef.type = b2_dynamicBody
box1BodyDef.position.Set(0, 5)
box1Body = world.CreateBody(box1BodyDef)
box1Shape = b2PolygonShape()
box1Shape.SetAsBox(1, 1)
box1FixtureDef = b2FixtureDef()
box1FixtureDef.shape = box1Shape
box1FixtureDef.density = 1
box1FixtureDef.friction = 0.3
box1Body.CreateFixture(box1FixtureDef)

timeStep = 1.0 / 60
velIters = 6
posIters = 2

for i in range(60):
    world.Step(timeStep, velIters, posIters)
    world.ClearForces()
    print(box1Body.position)


Box2D에서 어떤 물체는 body, fixture, shape 객체로 표현됩니다.


Body 객체

Body 객체는 어떤 물체를 표현하는 기본 객체로 위치, damping(감쇄율) 등의 정보가 저장됩니다. 다음과 같이 세가지 타입으로 나뉩니다.

  • Static body
  • Kinetic body
  • Dynamic body

Static body는 지면과 같이, 절대 움직이지 않는 물체를 나타내고, Kinetic body는 항상 일정한 속도로 움직이는 물체를(움직이는 배경), Dynamic body는 완전히 물리 법칙에 의해 그 움직임이 좌우되는 물체를 나타냅니다. Static, kinetic body 사이에서는 충돌이 일어나지 않으며, dynamic body는 static 혹은 kinetic body들과 충돌을 일으킬 수 있습니다.


Fixture 객체

Fixture 객체에는 density(밀도), friction(마찰력), resistitution(탄성력) 등의 정보를 담고, 물체의 모양을 나타내는 Shape 객체도 fixture 객체를 통해 연결됩니다. 하나의 body는 여러개의 fixture 객체를 가질 수도 있는데, 그 이유는 하나의 물체가 여러개의 모양, 매질이 결합된 형태일 수도 있기 때문이 아닐까하고 우선은 추정해봅니다.


Shape 객체

물체의 모양을 나타냅니다. Fixture 객체의 속성의 하나로서 body 객체에 연결됩니다.


아래와 같은 생성 관계를 잘 기억해두도록 합시다.


  • DLL 로딩 문제


첫줄의 from Box2D import * 실행시에 다음과 같은 에러가 나는 경우가 있는데,


ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.


Visual C++ 2010 Redistributable package가 설치가 안되서 발생하는 것이었습니다.

아래의 페이지에서 받은 후 설치해줍니다.


http://www.microsoft.com/en-us/download/details.aspx?id=5555



Dependency walker 라는 프로그램으로 <Python 설치 폴더>/Lib/site-packages/Box2D에 있는 _Box2D.pyd 파일을 열어보면 Box2D 라이브러리가 필요로하는 DLL들을 확인할 수 있습니다.


Dependency walker 사이트 : http://www.dependencywalker.com/


,

[Python] pyBox2D 사용 예제 - 1. 환경 설정


여기서는 2D 물리엔진인 Box2D를 파이썬용으로 포팅한 pyBox2D에 관한 기본 예제 코드를 소개하고자 합니다.


우선 환경세팅부터 알아보겠습니다.


1. 테스트 플랫폼 : Windows XP


2. 설치할 프로그램 및 참고 자료


1) Python
  - 참고 사이트 : http://www.python.org
  - 사용 버전 : 2.7.5

2) pyBox2D
  - 참고 사이트 : https://code.google.com/p/pybox2d/
  - 사용 버전 : 2.3b0

  - 위 참고 사이트의 다운로드 탭으로 들어가서 Box2D-2.3b0.win32-py2.7.exe를 설치합니다.
  - 소스 파일인 Box2D-2.3b0.zip도 받습니다. 압축을 풀면 example 폴더 안에 샘플 코드들이 있으므로 더 자세한 샘플 코드가 필요할 경우 참고합니다.

3) pyGame
  - 참고 사이트 : http://www.pygame.org
  - 사용 버전 : 1.9.1

  - 샘플 프로그램에서 그래픽 디스플레이를 위해 사용되는 라이브러리입니다.

,