我打开一个 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/interactive python 提示符下运行会话,调用run()
并查看某些内容,点击ESC
并让它关闭窗口并将我返回到我的提示符。
实际发生了什么:运行我的交互式会话,构建数据结构,调用run()
,查看内容,点击ESC
并关闭窗口,然后立即重新打开。退出的唯一方法是杀死 python 进程(这不仅会杀死我的交互式会话,而且在 bpython 中会使我的 shell 窗口无法运行。)注意,我也确实看到了print "returning..."
现在失效的 shell 的结果。
我看过这些问题:
但它们只会让我变得相当偏执:pygame 真的资源泄漏如此之大,以至于你必须退出 python才能让它收拾它的烂摊子?
另外,是什么黑魔法导致我的return
电话不返回?
最后,谁能告诉我如何按照我想要的方式进行这项工作?现在,即使是完全邪恶的不受支持的黑客也很好,因为我只需要使用这个 3D 渲染器调试我的其他代码,看看我在做什么!