закрытие окон pygame без выхода

Я открываю окно 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-рендеринга, чтобы увидеть, что я делаю!


person tehwalrus    schedule 19.10.2012    source источник
comment
Я считаю, что у IDLE есть проблемы с некоторыми вещами, например с этим. Возможно, вам повезет, если вы запустите из командной строки то же самое.   -  person ninMonkey    schedule 21.10.2012
comment
(проблемы на самом деле не существует, см. мой ответ.)   -  person tehwalrus    schedule 22.10.2012


Ответы (2)


Ответ: всегда публикуйте весь свой код!

Это была ошибка отступа в вызывающем коде, который снова и снова вызывал run(). pygame окна выглядят вполне счастливыми после выхода в интерактивную подсказку.

Я бы тоже это увидел, если бы у меня хватило терпения нажать ESC 9 раз.

person tehwalrus    schedule 19.10.2012

Я всегда использую

sys.exit()

просто не забудьте импортировать sys

person Bartlomiej Lewandowski    schedule 19.10.2012