Я открываю окно pygame и рисую на нем что-то, вызывая pyopengl примерно так:
def run(facets, SCREEN_SIZE=(800, 600)):
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE|OPENGL|DOUBLEBUF)
glViewport(0, 0, SCREEN_SIZE[0], SCREEN_SIZE[1])
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(SCREEN_SIZE[0])/SCREEN_SIZE[1], .1, 1000.)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
clock = pygame.time.Clock()
glMaterial(GL_FRONT, GL_AMBIENT, (0.1, 0.1, 0.1, 1.0))
glMaterial(GL_FRONT, GL_DIFFUSE, (1.0, 1.0, 1.0, 1.0))
pygame.mouse.set_visible(False)
pygame.event.set_grab(True)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
pygame.display.quit()
print "returning..."
return
if event.type == KEYUP and event.key == K_ESCAPE:
pygame.quit()
pygame.display.quit()
print "returning..."
return
pygame.mouse.set_visible(False)
# Clear the screen, and z-buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# other game loop code here, e.g. rendering the facets
# and moving the viewport around.
Я оставил почти все вызовы pygame и pyopengl, которые я делаю, на случай, если какой-либо из них актуален.
что я хочу сделать: запустить сеанс в командной строке bpython / IDLE / интерактивного python, вызвать run()
и посмотреть на что-то, нажать ESC
, закрыть окно и вернуть меня в мое приглашение.
что на самом деле происходит: запустите мой интерактивный сеанс, создайте структуры данных, вызовите run()
, посмотрите материал, нажмите ESC
, и окно закроется, но затем сразу же снова откроется. единственный способ выйти - убить процесс python (который не только убивает мой интерактивный сеанс, но и в bpython оставляет мое окно оболочки неработоспособным). Обратите внимание, я также действительно вижу результат print "returning..."
в настоящее время несуществующая оболочка.
Я видел эти вопросы:
Но они только делают меня довольно параноиком: действительно ли pygame настолько истощает ресурсы, что вам нужно выйти из python, чтобы заставить его навести порядок?
Кроме того, какая темная магия заставляет мои return
вызовы не возвращаться?
Наконец, может ли кто-нибудь сказать мне, как заставить эту работу работать так, как я хочу? на данный момент подойдут даже совершенно злые неподдерживаемые хаки, так как мне просто нужно отладить другой мой код с помощью этого 3D-рендеринга, чтобы увидеть, что я делаю!